mirror of
https://github.com/python/cpython.git
synced 2024-11-24 18:34:43 +08:00
First work on making config changes dynamic,
dynamic theme changes
This commit is contained in:
parent
03b18834c3
commit
b77d343bc8
@ -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):
|
||||
|
@ -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()
|
||||
|
@ -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):
|
||||
|
||||
|
@ -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('<Double-Button-1>',lambda e: 'break')
|
||||
text.bind('<B1-Motion>',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()
|
||||
|
||||
|
@ -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:
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user