]> granicus.if.org Git - python/commitdiff
bpo-31488: IDLE - update former extensions when options change. (#3612)
authorTerry Jan Reedy <tjreedy@udel.edu>
Sat, 16 Sep 2017 05:42:28 +0000 (01:42 -0400)
committerGitHub <noreply@github.com>
Sat, 16 Sep 2017 05:42:28 +0000 (01:42 -0400)
When apply changes, call .reload on each class with non-key options.
Change ParenMatch so that updates affect current instances.

Lib/idlelib/configdialog.py
Lib/idlelib/idle_test/test_parenmatch.py
Lib/idlelib/parenmatch.py
Misc/NEWS.d/next/IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst [new file with mode: 0644]

index 683c36e9776c28deb9bc778bfbdce480c58f8c48..7feae5d61998fbee26b091b5d0f6cdbbb924b5f7 100644 (file)
@@ -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.
index 6943a70c997c1c7a2c4a6b5a2ceace3de099b81a..3caa2754a6d8a2e07e7770e609399afd180dc573 100644 (file)
@@ -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')
index 12212150c6dc8eb4a49e39d15fa810201be0f445..983ca20675af1de3c378fb916a414fe5e14e29a4 100644 (file)
@@ -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 (file)
index 0000000..258fc1b
--- /dev/null
@@ -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.