bpo-27115: Use Query subclass for IDLE editor Goto (GH-18871)

Replace tkinter tkSimpleDialog.askinteger with a standard IDLE query dialog.
The new box checks for positivity before returning.
This commit is contained in:
Terry Jan Reedy 2020-03-09 16:51:20 -04:00 committed by GitHub
parent e7cab7f780
commit 363fab83b8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 12 deletions

View file

@ -3,6 +3,9 @@ Released on 2020-10-05?
====================================== ======================================
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 bpo-39885: Since clicking to get an IDLE context menu moves the
cursor, any text selection should be and now is cleared. cursor, any text selection should be and now is cleared.

View file

@ -672,18 +672,16 @@ class EditorWindow(object):
def goto_line_event(self, event): def goto_line_event(self, event):
text = self.text text = self.text
lineno = tkSimpleDialog.askinteger("Goto", lineno = query.Goto(
"Go to line number:",parent=text) text, "Go To Line",
if lineno is None: "Enter a positive integer\n"
return "break" "('big' = end of file):"
if lineno <= 0: ).result
text.bell() if lineno is not None:
return "break" text.tag_remove("sel", "1.0", "end")
text.mark_set("insert", f'{lineno}.0')
text.tag_remove("sel", "1.0", "end") text.see("insert")
text.mark_set("insert", f'{lineno}.0') self.set_line_and_column()
text.see("insert")
self.set_line_and_column()
return "break" return "break"
def open_module(self): def open_module(self):

View file

@ -138,6 +138,33 @@ class ModuleNameTest(unittest.TestCase):
self.assertEqual(dialog.entry_error['text'], '') 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. # 3 HelpSource test classes each test one method.
class HelpsourceBrowsefileTest(unittest.TestCase): class HelpsourceBrowsefileTest(unittest.TestCase):
@ -363,6 +390,22 @@ class ModulenameGuiTest(unittest.TestCase):
root.destroy() 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): class HelpsourceGuiTest(unittest.TestCase):
@classmethod @classmethod

View file

@ -223,6 +223,22 @@ class ModuleName(Query):
return file_path 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): class HelpSource(Query):
"Get menu name and help source for Help menu." "Get menu name and help source for Help menu."
# Used in ConfigDialog.HelpListItemAdd/Edit, (941/9) # Used in ConfigDialog.HelpListItemAdd/Edit, (941/9)

View file

@ -0,0 +1,2 @@
For 'Go to Line', use a Query box subclass with IDLE standard behavior
and improved error checking.