]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-27115: Use Query subclass for IDLE editor Goto (GH-18871)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 9 Mar 2020 23:45:19 +0000 (16:45 -0700)
committerGitHub <noreply@github.com>
Mon, 9 Mar 2020 23:45:19 +0000 (16:45 -0700)
Replace tkinter tkSimpleDialog.askinteger with a standard IDLE query dialog.
The new box checks for positivity before returning.
(cherry picked from commit 363fab83b8a0e6d924c7a7c577feec6a2812bb8c)

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Lib/idlelib/NEWS.txt
Lib/idlelib/editor.py
Lib/idlelib/idle_test/test_query.py
Lib/idlelib/query.py
Misc/NEWS.d/next/IDLE/2020-03-09-02-45-12.bpo-27115.8hSHMo.rst [new file with mode: 0644]

index 83930f77c7c030be7331602dde44fb96e257e6bb..3951fd8400214a37b691b814076fde5a094fee2e 100644 (file)
@@ -3,6 +3,9 @@ Released on 2019-12-16?
 ======================================
 
 
+bpo-27115: For 'Go to Line', use a Query entry box subclass with
+IDLE standard behavior and improved error checking.
+
 bpo-39885: Since clicking to get an IDLE context menu moves the
 cursor, any text selection should be and now is cleared.
 
index 51941900d5c741466874f6a30f4f775378f7a78d..b0f88b5463d1b6e52d66868e13101d9a032f9888 100644 (file)
@@ -672,18 +672,16 @@ class EditorWindow(object):
 
     def goto_line_event(self, event):
         text = self.text
-        lineno = tkSimpleDialog.askinteger("Goto",
-                "Go to line number:",parent=text)
-        if lineno is None:
-            return "break"
-        if lineno <= 0:
-            text.bell()
-            return "break"
-
-        text.tag_remove("sel", "1.0", "end")
-        text.mark_set("insert", f'{lineno}.0')
-        text.see("insert")
-        self.set_line_and_column()
+        lineno = query.Goto(
+                text, "Go To Line",
+                "Enter a positive integer\n"
+                "('big' = end of file):"
+                ).result
+        if lineno is not None:
+            text.tag_remove("sel", "1.0", "end")
+            text.mark_set("insert", f'{lineno}.0')
+            text.see("insert")
+            self.set_line_and_column()
         return "break"
 
     def open_module(self):
index f957585190dc83e3817448386ea63df7a08a14b0..6d026cb5320683e767f89c81d706ef7fc7a5dcfe 100644 (file)
@@ -138,6 +138,33 @@ class ModuleNameTest(unittest.TestCase):
         self.assertEqual(dialog.entry_error['text'], '')
 
 
+class GotoTest(unittest.TestCase):
+    "Test Goto subclass of Query."
+
+    class Dummy_ModuleName:
+        entry_ok = query.Goto.entry_ok  # Function being tested.
+        def __init__(self, dummy_entry):
+            self.entry = Var(value=dummy_entry)
+            self.entry_error = {'text': ''}
+        def showerror(self, message):
+            self.entry_error['text'] = message
+
+    def test_bogus_goto(self):
+        dialog = self.Dummy_ModuleName('a')
+        self.assertEqual(dialog.entry_ok(), None)
+        self.assertIn('not a base 10 integer', dialog.entry_error['text'])
+
+    def test_bad_goto(self):
+        dialog = self.Dummy_ModuleName('0')
+        self.assertEqual(dialog.entry_ok(), None)
+        self.assertIn('not a positive integer', dialog.entry_error['text'])
+
+    def test_good_goto(self):
+        dialog = self.Dummy_ModuleName('1')
+        self.assertEqual(dialog.entry_ok(), 1)
+        self.assertEqual(dialog.entry_error['text'], '')
+
+
 # 3 HelpSource test classes each test one method.
 
 class HelpsourceBrowsefileTest(unittest.TestCase):
@@ -363,6 +390,22 @@ class ModulenameGuiTest(unittest.TestCase):
         root.destroy()
 
 
+class GotoGuiTest(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        requires('gui')
+
+    def test_click_module_name(self):
+        root = Tk()
+        root.withdraw()
+        dialog =  query.Goto(root, 'T', 't', _utest=True)
+        dialog.entry.insert(0, '22')
+        dialog.button_ok.invoke()
+        self.assertEqual(dialog.result, 22)
+        root.destroy()
+
+
 class HelpsourceGuiTest(unittest.TestCase):
 
     @classmethod
index 57616de4fe01d4f2811dd76a4a08478cce51bcd5..2a88530b4d082a51ce189327e76394c818c6608f 100644 (file)
@@ -223,6 +223,22 @@ class ModuleName(Query):
         return file_path
 
 
+class Goto(Query):
+    "Get a positive line number for editor Go To Line."
+    # Used in editor.EditorWindow.goto_line_event.
+
+    def entry_ok(self):
+        try:
+            lineno = int(self.entry.get())
+        except ValueError:
+            self.showerror('not a base 10 integer.')
+            return None
+        if lineno <= 0:
+            self.showerror('not a positive integer.')
+            return None
+        return lineno
+
+
 class HelpSource(Query):
     "Get menu name and help source for Help menu."
     # Used in ConfigDialog.HelpListItemAdd/Edit, (941/9)
diff --git a/Misc/NEWS.d/next/IDLE/2020-03-09-02-45-12.bpo-27115.8hSHMo.rst b/Misc/NEWS.d/next/IDLE/2020-03-09-02-45-12.bpo-27115.8hSHMo.rst
new file mode 100644 (file)
index 0000000..76af19e
--- /dev/null
@@ -0,0 +1,2 @@
+For 'Go to Line', use a Query box subclass with IDLE standard behavior
+and improved error checking.