From b77d343bc846c2049a4cffb1dfd65eb49d1728b4 Mon Sep 17 00:00:00 2001 From: "Steven M. Gava" Date: Sat, 2 Mar 2002 07:16:21 +0000 Subject: [PATCH] First work on making config changes dynamic, dynamic theme changes --- Lib/idlelib/ColorDelegator.py | 29 +++++++++++++++-------------- Lib/idlelib/EditorWindow.py | 10 ++++++++++ Lib/idlelib/PyShell.py | 28 ++++++++++++++++------------ Lib/idlelib/configDialog.py | 15 +++++++-------- Lib/idlelib/configHandler.py | 10 ++++++++-- 5 files changed, 56 insertions(+), 36 deletions(-) diff --git a/Lib/idlelib/ColorDelegator.py b/Lib/idlelib/ColorDelegator.py index a4aefb2b34c..ab840608c0f 100644 --- a/Lib/idlelib/ColorDelegator.py +++ b/Lib/idlelib/ColorDelegator.py @@ -37,6 +37,7 @@ class ColorDelegator(Delegator): self.prog = prog self.idprog = idprog self.asprog = asprog + self.LoadTagDefs() def setdelegate(self, delegate): if self.delegate is not None: @@ -52,21 +53,21 @@ class ColorDelegator(Delegator): if cnf: apply(self.tag_configure, (tag,), cnf) self.tag_raise('sel') - - theme = idleConf.GetOption('main','Theme','name') - - tagdefs = { - "COMMENT": idleConf.GetHighlight(theme, "comment"), - "KEYWORD": idleConf.GetHighlight(theme, "keyword"), - "STRING": idleConf.GetHighlight(theme, "string"), - "DEFINITION": idleConf.GetHighlight(theme, "definition"), - "SYNC": {'background':None,'foreground':None}, - "TODO": {'background':None,'foreground':None}, - "BREAK": idleConf.GetHighlight(theme, "break"), - # The following is used by ReplaceDialog: - "hit": idleConf.GetHighlight(theme, "hit"), - } + def LoadTagDefs(self): + theme = idleConf.GetOption('main','Theme','name') + self.tagdefs = { + "COMMENT": idleConf.GetHighlight(theme, "comment"), + "KEYWORD": idleConf.GetHighlight(theme, "keyword"), + "STRING": idleConf.GetHighlight(theme, "string"), + "DEFINITION": idleConf.GetHighlight(theme, "definition"), + "SYNC": {'background':None,'foreground':None}, + "TODO": {'background':None,'foreground':None}, + "BREAK": idleConf.GetHighlight(theme, "break"), + # The following is used by ReplaceDialog: + "hit": idleConf.GetHighlight(theme, "hit"), + } + if DEBUG: print 'tagdefs',tagdefs def insert(self, index, chars, tags=None): diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py index 81d9470357e..8a2109d3593 100644 --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -102,6 +102,9 @@ class EditorWindow: self.vars = flist.vars self.menubar = Menu(root) self.top = top = self.Toplevel(root, menu=self.menubar) + #self.top.instanceDict makes flist.inversedict avalable to + #configDialog.py so it can access all EditorWindow instaces + self.top.instanceDict=flist.inversedict self.vbar = vbar = Scrollbar(top, name='vbar') self.text_frame = text_frame = Frame(top) self.text = text = Text(text_frame, name='text', padx=5, wrap=None, @@ -467,6 +470,13 @@ class EditorWindow: self.per.removefilter(self.color) self.color = None self.per.insertfilter(self.undo) + + def ResetColorizer(self): + #this function is called from configDialog.py + #to update the colour theme if it is changed + if self.color: + self.color = self.ColorDelegator() + self.per.insertfilter(self.color) def saved_change_hook(self): short = self.short_title() diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index 9333ea91f96..fa4bb3d87f1 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -134,23 +134,27 @@ class PyShellFileList(FileList): class ModifiedColorDelegator(ColorDelegator): # Colorizer for the shell window itself + + def __init__(self): + ColorDelegator.__init__(self) + self.LoadTagDefs() def recolorize_main(self): self.tag_remove("TODO", "1.0", "iomark") self.tag_add("SYNC", "1.0", "iomark") ColorDelegator.recolorize_main(self) - - tagdefs = ColorDelegator.tagdefs.copy() - theme = idleConf.GetOption('main','Theme','name') - - tagdefs.update({ - "stdin": {'background':None,'foreground':None}, - "stdout": idleConf.GetHighlight(theme, "stdout"), - "stderr": idleConf.GetHighlight(theme, "stderr"), - "console": idleConf.GetHighlight(theme, "console"), - "ERROR": idleConf.GetHighlight(theme, "error"), - None: idleConf.GetHighlight(theme, "normal"), - }) + + def LoadTagDefs(self): + ColorDelegator.LoadTagDefs(self) + theme = idleConf.GetOption('main','Theme','name') + self.tagdefs.update({ + "stdin": {'background':None,'foreground':None}, + "stdout": idleConf.GetHighlight(theme, "stdout"), + "stderr": idleConf.GetHighlight(theme, "stderr"), + "console": idleConf.GetHighlight(theme, "console"), + "ERROR": idleConf.GetHighlight(theme, "error"), + None: idleConf.GetHighlight(theme, "normal"), + }) class ModifiedUndoDelegator(UndoDelegator): diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py index aaec2f74920..6b9a146ab1b 100644 --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -23,8 +23,6 @@ class ConfigDialog(Toplevel): #Theme Elements. Each theme element key is it's display name. #The first value of the tuple is the sample area tag name. #The second value is the display name list sort index. - #The third value indicates whether the element can have a foreground - #or background colour or both. self.themeElements={'Normal Text':('normal','00'), 'Python Keywords':('keyword','01'), 'Python Definitions':('definition','02'), @@ -180,8 +178,8 @@ class ConfigDialog(Toplevel): frameTheme=Frame(frame,borderwidth=2,relief=GROOVE) #frameCustom self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1, - font=('courier',12,''),cursor='hand2',width=10,height=10, - takefocus=FALSE,highlightthickness=0) + font=('courier',12,''),cursor='hand2',width=21,height=10, + takefocus=FALSE,highlightthickness=0,wrap=NONE) text=self.textHighlightSample text.bind('',lambda e: 'break') text.bind('',lambda e: 'break') @@ -514,7 +512,7 @@ class ConfigDialog(Toplevel): self.AddChangedItem('main','General','editor-on-startup',value) def ResetChangedItems(self): - #changedItems. When any config item is changed in this dialog, an entry + #When any config item is changed in this dialog, an entry #should be made in the relevant section (config type) of this #dictionary. The key should be the config file section name and the #value a dictionary, whose key:value pairs are item=value pairs for @@ -1086,14 +1084,15 @@ class ConfigDialog(Toplevel): def ActivateConfigChanges(self): #things that need to be done to make #applied config changes dynamic: - # #update editor/shell font and repaint #dynamically update indentation setttings #update theme and repaint #update keybindings and re-bind #update user help sources menu - pass - + winInstances=self.parent.instanceDict.keys() + for instance in winInstances: + instance.ResetColorizer() + def Cancel(self): self.destroy() diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py index 9db712031f1..82bf6d27ade 100644 --- a/Lib/idlelib/configHandler.py +++ b/Lib/idlelib/configHandler.py @@ -110,6 +110,13 @@ class IdleUserConfParser(IdleConfParser): self.set(section,option,value) return 1 + def RemoveFile(self): + """ + Removes the user config file from disk if it exists. + """ + if os.path.exists(self.file): + os.remove(self.file) + def Save(self): """ If config isn't empty, write file to disk. If config is empty, @@ -119,8 +126,7 @@ class IdleUserConfParser(IdleConfParser): cfgFile=open(self.file,'w') self.write(cfgFile) else: - if os.path.exists(self.file): - os.remove(self.file) + self.RemoveFile() class IdleConf: """