[Python-checkins] bpo-31488: IDLE - update former extensions when options change. (#3612)

Terry Jan Reedy webhook-mailer at python.org
Sat Sep 16 01:42:31 EDT 2017


https://github.com/python/cpython/commit/5777ecc438790f3d324d52f2ccdad56e667e0cb3
commit: 5777ecc438790f3d324d52f2ccdad56e667e0cb3
branch: master
author: Terry Jan Reedy <tjreedy at udel.edu>
committer: GitHub <noreply at github.com>
date: 2017年09月16日T01:42:28-04:00
summary:
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.
files:
A Misc/NEWS.d/next/IDLE/2017-09-16-01-21-20.bpo-31488.0rtXIT.rst
M Lib/idlelib/configdialog.py
M Lib/idlelib/idle_test/test_parenmatch.py
M Lib/idlelib/parenmatch.py
diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
index 683c36e9776..7feae5d6199 100644
--- a/Lib/idlelib/configdialog.py
+++ b/Lib/idlelib/configdialog.py
@@ -27,8 +27,14 @@
 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 @@ def activate_config_changes(self):
 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 6943a70c997..3caa2754a6d 100644
--- a/Lib/idlelib/idle_test/test_parenmatch.py
+++ b/Lib/idlelib/idle_test/test_parenmatch.py
@@ -58,7 +58,7 @@ def test_paren_styles(self):
 ('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 12212150c6d..983ca20675a 100644
--- a/Lib/idlelib/parenmatch.py
+++ b/Lib/idlelib/parenmatch.py
@@ -45,10 +45,8 @@ def __init__(self, editwin):
 # 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 @@ def deactivate_restore(self):
 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 @@ def paren_closed_event(self, event):
 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 @@ def create_tag_expression(self, indices):
 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 00000000000..258fc1ba75d
--- /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.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /