mirror of
				https://github.com/python/cpython.git
				synced 2025-10-27 03:34:32 +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 @@ def replace_event(self, event): | ||||||
| 
 | 
 | ||||||
|     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 @@ def test_good_module_name(self): | ||||||
|         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 @@ def test_click_module_name(self): | ||||||
|         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 @@ def entry_ok(self): | ||||||
|         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
	
	 Terry Jan Reedy
						Terry Jan Reedy