mirror of
https://github.com/python/cpython.git
synced 2025-08-23 10:16:01 +00:00
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:
parent
e7cab7f780
commit
363fab83b8
5 changed files with 74 additions and 12 deletions
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
For 'Go to Line', use a Query box subclass with IDLE standard behavior
|
||||||
|
and improved error checking.
|
Loading…
Add table
Add a link
Reference in a new issue