From 5777ecc438790f3d324d52f2ccdad56e667e0cb3 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 16 Sep 2017 01:42:28 -0400 Subject: bpo-31488: IDLE - update former extensions when options change. (#3612) When apply changes, call .reload on each class with non-key options. Change ParenMatch so that updates affect current instances. --- Lib/idlelib/configdialog.py | 8 ++++ Lib/idlelib/idle_test/test_parenmatch.py | 2 +- Lib/idlelib/parenmatch.py | 43 ++++++++++------------ .../IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst | 4 ++ 4 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 683c36e..7feae5d 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -27,8 +27,14 @@ from idlelib import macosx from idlelib.query import SectionName, HelpSource from idlelib.tabbedpages import TabbedPageSet from idlelib.textview import view_text +from idlelib.autocomplete import AutoComplete +from idlelib.codecontext import CodeContext +from idlelib.parenmatch import ParenMatch +from idlelib.paragraph import FormatParagraph changes = ConfigChanges() +# Reload changed options in the following classes. +reloadables = (AutoComplete, CodeContext, ParenMatch, FormatParagraph) class ConfigDialog(Toplevel): @@ -220,6 +226,8 @@ class ConfigDialog(Toplevel): instance.set_notabs_indentwidth() instance.ApplyKeybindings() instance.reset_help_menu_entries() + for klass in reloadables: + klass.reload() def create_page_extensions(self): """Part of the config dialog used for configuring IDLE extensions. diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index 6943a70..3caa275 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -58,7 +58,7 @@ class ParenMatchTest(unittest.TestCase): ('expression', ('1.10', '1.15'), ('1.10', '1.16'))): with self.subTest(style=style): text.delete('1.0', 'end') - pm.set_style(style) + pm.STYLE = style text.insert('insert', 'def foobar(a, b') pm.flash_paren_event('event') diff --git a/Lib/idlelib/parenmatch.py b/Lib/idlelib/parenmatch.py index 1221215..983ca20 100644 --- a/Lib/idlelib/parenmatch.py +++ b/Lib/idlelib/parenmatch.py @@ -45,10 +45,8 @@ class ParenMatch: # and deactivate_restore (which calls event_delete). editwin.text.bind(self.RESTORE_VIRTUAL_EVENT_NAME, self.restore_event) - self.bell = self.text.bell if self.BELL else lambda: None self.counter = 0 self.is_restore_active = 0 - self.set_style(self.STYLE) @classmethod def reload(cls): @@ -75,27 +73,11 @@ class ParenMatch: self.text.event_delete(self.RESTORE_VIRTUAL_EVENT_NAME, seq) self.is_restore_active = False - def set_style(self, style): - "Set tag and timeout functions." - self.STYLE = style - self.create_tag = ( - self.create_tag_opener if style in {"opener", "default"} else - self.create_tag_parens if style == "parens" else - self.create_tag_expression) # "expression" or unknown - - self.set_timeout = (self.set_timeout_last if self.FLASH_DELAY else - self.set_timeout_none) - def flash_paren_event(self, event): "Handle editor 'show surrounding parens' event (menu or shortcut)." indices = (HyperParser(self.editwin, "insert") .get_surrounding_brackets()) - if indices is None: - self.bell() - return "break" - self.activate_restore() - self.create_tag(indices) - self.set_timeout() + self.finish_paren_event(indices) return "break" def paren_closed_event(self, event): @@ -108,13 +90,19 @@ class ParenMatch: if not hp.is_in_code(): return indices = hp.get_surrounding_brackets(_openers[closer], True) - if indices is None: - self.bell() + self.finish_paren_event(indices) + return # Allow calltips to see ')' + + def finish_paren_event(self, indices): + if indices is None and self.BELL: + self.text.bell() return self.activate_restore() - self.create_tag(indices) - self.set_timeout() - return + # self.create_tag(indices) + self.tagfuncs.get(self.STYLE, self.create_tag_expression)(self, indices) + # self.set_timeout() + (self.set_timeout_last if self.FLASH_DELAY else + self.set_timeout_none)() def restore_event(self, event=None): "Remove effect of doing match." @@ -152,6 +140,13 @@ class ParenMatch: self.text.tag_add("paren", indices[0], rightindex) self.text.tag_config("paren", self.HILITE_CONFIG) + tagfuncs = { + 'opener': create_tag_opener, + 'default': create_tag_opener, + 'parens': create_tag_parens, + 'expression': create_tag_expression, + } + # any one of the set_timeout_XXX methods can be used depending on # the style diff --git a/Misc/NEWS.d/next/IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst b/Misc/NEWS.d/next/IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst new file mode 100644 index 0000000..258fc1b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst @@ -0,0 +1,4 @@ +IDLE - Update non-key options in former extension classes. When applying +configdialog changes, call .reload for each feature class. Change ParenMatch +so updated options affect existing instances attached to existing editor +windows. -- cgit v0.12