]> granicus.if.org Git - python/commitdiff
Issue #25313: Change the handling of new built-in text color themes to better
authorTerry Jan Reedy <tjreedy@udel.edu>
Thu, 12 Nov 2015 20:02:57 +0000 (15:02 -0500)
committerTerry Jan Reedy <tjreedy@udel.edu>
Thu, 12 Nov 2015 20:02:57 +0000 (15:02 -0500)
address the compatibility problem introduced by the addition of IDLE Dark.
Consistently use the revised idleConf.CurrentTheme everywhere in idlelib.

Lib/idlelib/ClassBrowser.py
Lib/idlelib/ColorDelegator.py
Lib/idlelib/EditorWindow.py
Lib/idlelib/PyShell.py
Lib/idlelib/TreeWidget.py
Lib/idlelib/config-main.def
Lib/idlelib/configDialog.py
Lib/idlelib/configHandler.py

index 5be65efb9bc0ead58fe684a9c5d3c5dbfac1a6bb..d09c52fe4d75f4d35daf828d30f083d0262be6e6 100644 (file)
@@ -56,7 +56,7 @@ class ClassBrowser:
         self.settitle()
         top.focus_set()
         # create scrolled canvas
-        theme = idleConf.GetOption('main','Theme','name')
+        theme = idleConf.CurrentTheme()
         background = idleConf.GetHighlight(theme, 'normal')['background']
         sc = ScrolledCanvas(top, bg=background, highlightthickness=0, takefocus=1)
         sc.frame.pack(expand=1, fill="both")
index 13a90103134ddc08fe5f27564cb5d8f70a344073..9f313496040aeeca2161b575ae7be98cc9308ab7 100644 (file)
@@ -60,7 +60,7 @@ class ColorDelegator(Delegator):
         self.tag_raise('sel')
 
     def LoadTagDefs(self):
-        theme = idleConf.GetOption('main','Theme','name')
+        theme = idleConf.CurrentTheme()
         self.tagdefs = {
             "COMMENT": idleConf.GetHighlight(theme, "comment"),
             "KEYWORD": idleConf.GetHighlight(theme, "keyword"),
index 34ef89d06e4c68827e0bcebd25a3fb98b66693dc..58a01dc1a2318791265defd4780d328178b7705b 100644 (file)
@@ -739,7 +739,7 @@ class EditorWindow(object):
         # Called from self.filename_change_hook and from configDialog.py
         self._rmcolorizer()
         self._addcolorizer()
-        theme = idleConf.GetOption('main','Theme','name')
+        theme = idleConf.CurrentTheme()
         normal_colors = idleConf.GetHighlight(theme, 'normal')
         cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg')
         select_colors = idleConf.GetHighlight(theme, 'hilite')
index 57aa6dae2edb4d71519442880d59cdc4f09ba8e9..058dfb92e50d36ce0a84ba8287b4e255dd1d49cc 100755 (executable)
@@ -152,7 +152,7 @@ class PyShellEditorWindow(EditorWindow):
             # possible due to update in restore_file_breaks
             return
         if color:
-            theme = idleConf.GetOption('main','Theme','name')
+            theme = idleConf.CurrentTheme()
             cfg = idleConf.GetHighlight(theme, "break")
         else:
             cfg = {'foreground': '', 'background': ''}
@@ -338,7 +338,7 @@ class ModifiedColorDelegator(ColorDelegator):
 
     def LoadTagDefs(self):
         ColorDelegator.LoadTagDefs(self)
-        theme = idleConf.GetOption('main','Theme','name')
+        theme = idleConf.CurrentTheme()
         self.tagdefs.update({
             "stdin": {'background':None,'foreground':None},
             "stdout": idleConf.GetHighlight(theme, "stdout"),
@@ -621,7 +621,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
         item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid)
         from idlelib.TreeWidget import ScrolledCanvas, TreeNode
         top = Toplevel(self.tkconsole.root)
-        theme = idleConf.GetOption('main','Theme','name')
+        theme = idleConf.CurrentTheme()
         background = idleConf.GetHighlight(theme, 'normal')['background']
         sc = ScrolledCanvas(top, bg=background, highlightthickness=0)
         sc.frame.pack(expand=1, fill="both")
index 4844a695ad236db365ade6f2b4719294e2118c70..a19578fdcb3461bc4daf093b2849f801f2ea485b 100644 (file)
@@ -249,7 +249,7 @@ class TreeNode:
         except AttributeError:
             # padding carefully selected (on Windows) to match Entry widget:
             self.label = Label(self.canvas, text=text, bd=0, padx=2, pady=2)
-        theme = idleConf.GetOption('main','Theme','name')
+        theme = idleConf.CurrentTheme()
         if self.selected:
             self.label.configure(idleConf.GetHighlight(theme, 'hilite'))
         else:
index 3622cb2a30f4d1458fcc1db0b807cabf3e9e13b8..8ebbc1b4c22baff0edd786fb4ffe762a56b3e8b9 100644 (file)
@@ -65,6 +65,8 @@ num-spaces= 4
 [Theme]
 default= 1
 name= IDLE Classic
+name2=
+# name2 set in user config-main.cfg for themes added after 2015 Oct 1
 
 [Keys]
 default= 1
index f5388178e0ecfe9ee0a6204bf49abeb377a599cf..9b16459d546f8857445626a66ff6bb75143b8b9b 100644 (file)
@@ -263,6 +263,7 @@ class ConfigDialog(Toplevel):
         self.buttonDeleteCustomTheme=Button(
                 frameTheme, text='Delete Custom Theme',
                 command=self.DeleteCustomTheme)
+        self.new_custom_theme = Label(frameTheme, bd=2)
 
         ##widget packing
         #body
@@ -286,6 +287,7 @@ class ConfigDialog(Toplevel):
         self.optMenuThemeBuiltin.pack(side=TOP, fill=X, padx=5, pady=5)
         self.optMenuThemeCustom.pack(side=TOP, fill=X, anchor=W, padx=5, pady=5)
         self.buttonDeleteCustomTheme.pack(side=TOP, fill=X, padx=5, pady=5)
+        self.new_custom_theme.pack(side=TOP, fill=X, pady=5)
         return frame
 
     def CreatePageKeys(self):
@@ -503,20 +505,15 @@ class ConfigDialog(Toplevel):
     def VarChanged_builtinTheme(self, *params):
         value = self.builtinTheme.get()
         if value == 'IDLE Dark':
-            tkMessageBox.showwarning(
-                title="The 'IDLE Dark' Text Color Theme",
-                message="IDLE Dark is new in October, 2015.  Trying to "
-                        "run earlier versions of IDLE with it selected "
-                        "will disable colorizing, or worse.\n\n"
-                        "If you might ever run an earlier release of IDLE, "
-                        "then before exiting this version, "
-                        "either switch to another theme or "
-                        "hit the 'Save as New Custom Theme' button.  "
-                        "The latter requires a new name, such as "
-                        "'Custom Dark', but the custom theme will work "
-                        "with any IDLE release, and can be modified.",
-                parent=self)
-        self.AddChangedItem('main', 'Theme', 'name', value)
+            if idleConf.GetOption('main', 'Theme', 'name') != 'IDLE New':
+                self.AddChangedItem('main', 'Theme', 'name', 'IDLE Classic')
+            self.AddChangedItem('main', 'Theme', 'name2', value)
+            self.new_custom_theme.config(text='New theme, see Help',
+                                         fg='#500000')
+        else:
+            self.AddChangedItem('main', 'Theme', 'name', value)
+            self.AddChangedItem('main', 'Theme', 'name2', '')
+            self.new_custom_theme.config(text='', fg='black')
         self.PaintThemeSample()
 
     def VarChanged_customTheme(self, *params):
@@ -1350,14 +1347,14 @@ help_common = '''\
 When you click either the Apply or Ok buttons, settings in this
 dialog that are different from IDLE's default are saved in
 a .idlerc directory in your home directory. Except as noted,
-hese changes apply to all versions of IDLE installed on this
+these changes apply to all versions of IDLE installed on this
 machine. Some do not take affect until IDLE is restarted.
 [Cancel] only cancels changes made since the last save.
 '''
 help_pages = {
     'Highlighting':'''
 Highlighting:
-The IDLE Dark color theme is new in Octover 2015.  It can only
+The IDLE Dark color theme is new in October 2015.  It can only
 be used with older IDLE releases if it is saved as a custom
 theme, with a different name.
 '''
index 83abad7847c18e66fc75724eb1412585e4a99694..336d96973ee9a115976a43c04984ba1b85b1d7b7 100644 (file)
@@ -372,8 +372,32 @@ class IdleConf:
         return theme
 
     def CurrentTheme(self):
-        "Return the name of the currently active theme."
-        return self.GetOption('main', 'Theme', 'name', default='')
+        """Return the name of the currently active text color theme.
+
+        idlelib.config-main.def includes this section
+        [Theme]
+        default= 1
+        name= IDLE Classic
+        name2=
+        # name2 set in user config-main.cfg for themes added after 2015 Oct 1
+
+        Item name2 is needed because setting name to a new builtin
+        causes older IDLEs to display multiple error messages or quit.
+        See https://bugs.python.org/issue25313.
+        When default = True, name2 takes precedence over name,
+        while older IDLEs will just use name.
+        """
+        default = self.GetOption('main', 'Theme', 'default',
+                                 type='bool', default=True)
+        if default:
+            theme = self.GetOption('main', 'Theme', 'name2', default='')
+        if default and not theme or not default:
+            theme = self.GetOption('main', 'Theme', 'name', default='')
+        source = self.defaultCfg if default else self.userCfg
+        if source['highlight'].has_section(theme):
+                return theme
+        else:    
+            return "IDLE Classic"
 
     def CurrentKeys(self):
         "Return the name of the currently active key set."