Issue #25313: Change the handling of new built-in text color themes to better

address the compatibility problem introduced by the addition of IDLE Dark.
Consistently use the revised idleConf.CurrentTheme everywhere in idlelib.
This commit is contained in:
Terry Jan Reedy 2015-11-12 15:02:57 -05:00
parent 84023247b4
commit d0c0f0041c
8 changed files with 48 additions and 25 deletions

View 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")

View 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"),

View 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')

View File

@ -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")

View 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:

View 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

View 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.
'''

View 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."