extension config reading by configDialog and
beginning of configuration saving
This commit is contained in:
parent
7bb1c9a11d
commit
5f28e8fbfb
|
@ -27,12 +27,13 @@
|
|||
# from the default file.
|
||||
|
||||
[General]
|
||||
run-in-separate-process= 1
|
||||
help-browser= ""
|
||||
editor-on-startup= 1
|
||||
#run-in-separate-process= 1
|
||||
#help-browser= ""
|
||||
|
||||
[HelpFiles]
|
||||
idle="IDLE _Help",""
|
||||
python="_Python Documentation",""
|
||||
#idle="IDLE _Help",""
|
||||
#python="_Python Documentation",""
|
||||
#additional help sources
|
||||
1=
|
||||
2=
|
||||
|
@ -46,7 +47,6 @@ python="_Python Documentation",""
|
|||
10=
|
||||
|
||||
[EditorWindow]
|
||||
editor-on-startup= 0
|
||||
width= 80
|
||||
height= 30
|
||||
font= courier
|
||||
|
|
|
@ -36,6 +36,16 @@ class ConfigDialog(Toplevel):
|
|||
'Shell Normal Text':('console','09'),
|
||||
'Shell Stdout Text':('stdout','10'),
|
||||
'Shell Stderr Text':('stderr','11')}
|
||||
#changedItems. 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
|
||||
#that config file section.
|
||||
self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
|
||||
#defaultItems. This dictionary is loaded with the values from the
|
||||
#default config files. It is used for comparison with self.changedItems
|
||||
#to decide which changed items actually need saving.
|
||||
self.defaultItems=self.GetDefaultItems()
|
||||
self.CreateWidgets()
|
||||
self.resizable(height=FALSE,width=FALSE)
|
||||
self.transient(parent)
|
||||
|
@ -44,100 +54,12 @@ class ConfigDialog(Toplevel):
|
|||
self.parent = parent
|
||||
self.tabPages.focus_set()
|
||||
#key bindings for this dialog
|
||||
self.bind('<Escape>',self.CancelBinding) #dismiss dialog, no save
|
||||
self.bind('<Alt-a>',self.ApplyBinding) #apply changes, save
|
||||
self.bind('<F1>',self.HelpBinding) #context help
|
||||
#self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
|
||||
#self.bind('<Alt-a>',self.Apply) #apply changes, save
|
||||
#self.bind('<F1>',self.Help) #context help
|
||||
self.LoadConfigs()
|
||||
self.wait_window()
|
||||
|
||||
def Cancel(self):
|
||||
self.destroy()
|
||||
|
||||
def Ok(self):
|
||||
pass
|
||||
|
||||
def Apply(self):
|
||||
pass
|
||||
|
||||
def Help(self):
|
||||
pass
|
||||
|
||||
def CancelBinding(self,event):
|
||||
self.Cancel()
|
||||
|
||||
def OkBinding(self,event):
|
||||
self.Ok()
|
||||
|
||||
def ApplyBinding(self,event):
|
||||
self.Apply()
|
||||
|
||||
def HelpBinding(self,event):
|
||||
self.Help()
|
||||
|
||||
def SetThemeType(self):
|
||||
if self.themeIsBuiltin.get():
|
||||
self.optMenuThemeBuiltin.config(state=NORMAL)
|
||||
self.optMenuThemeCustom.config(state=DISABLED)
|
||||
self.buttonDeleteCustomTheme.config(state=DISABLED)
|
||||
else:
|
||||
self.optMenuThemeBuiltin.config(state=DISABLED)
|
||||
self.optMenuThemeCustom.config(state=NORMAL)
|
||||
self.buttonDeleteCustomTheme.config(state=NORMAL)
|
||||
|
||||
def SetKeysType(self):
|
||||
if self.keysAreDefault.get():
|
||||
self.optMenuKeysBuiltin.config(state=NORMAL)
|
||||
self.optMenuKeysCustom.config(state=DISABLED)
|
||||
self.buttonDeleteCustomKeys.config(state=DISABLED)
|
||||
else:
|
||||
self.optMenuKeysBuiltin.config(state=DISABLED)
|
||||
self.optMenuKeysCustom.config(state=NORMAL)
|
||||
self.buttonDeleteCustomKeys.config(state=NORMAL)
|
||||
|
||||
def GetColour(self):
|
||||
target=self.highlightTarget.get()
|
||||
rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
|
||||
title='Pick new colour for : '+target,
|
||||
initialcolor=self.frameColourSet.cget('bg'))
|
||||
if colourString: #user didn't cancel
|
||||
self.frameColourSet.config(bg=colourString)#set sample
|
||||
if self.fgHilite.get(): plane='foreground'
|
||||
else: plane='background'
|
||||
apply(self.textHighlightSample.tag_config,
|
||||
(self.themeElements[target][0],),{plane:colourString})
|
||||
|
||||
def SetFontSampleBinding(self,event):
|
||||
self.SetFontSample()
|
||||
|
||||
def SetFontSample(self):
|
||||
self.editFont.config(size=self.fontSize.get(),weight=NORMAL,
|
||||
family=self.listFontName.get(self.listFontName.curselection()[0]))
|
||||
|
||||
def SetHighlightTargetBinding(self,*args):
|
||||
self.SetHighlightTarget()
|
||||
|
||||
def SetHighlightTarget(self):
|
||||
if self.highlightTarget.get()=='Cursor': #bg not possible
|
||||
self.radioFg.config(state=DISABLED)
|
||||
self.radioBg.config(state=DISABLED)
|
||||
self.fgHilite.set(1)
|
||||
else: #both fg and bg can be set
|
||||
self.radioFg.config(state=NORMAL)
|
||||
self.radioBg.config(state=NORMAL)
|
||||
self.fgHilite.set(1)
|
||||
self.SetColourSample()
|
||||
|
||||
def SetColourSampleBinding(self,*args):
|
||||
self.SetColourSample()
|
||||
|
||||
def SetColourSample(self):
|
||||
#set the colour smaple area
|
||||
tag=self.themeElements[self.highlightTarget.get()][0]
|
||||
if self.fgHilite.get(): plane='foreground'
|
||||
else: plane='background'
|
||||
colour=self.textHighlightSample.tag_cget(tag,plane)
|
||||
self.frameColourSet.config(bg=colour)
|
||||
|
||||
def CreateWidgets(self):
|
||||
self.tabPages = TabPageSet(self,
|
||||
pageNames=['Fonts/Tabs','Highlighting','Keys','General'])
|
||||
|
@ -149,7 +71,7 @@ class ConfigDialog(Toplevel):
|
|||
self.buttonOk = Button(frameActionButtons,text='Ok',
|
||||
command=self.Ok,takefocus=FALSE)
|
||||
self.buttonApply = Button(frameActionButtons,text='Apply',
|
||||
command=self.Apply,underline=0,takefocus=FALSE)
|
||||
command=self.Apply,takefocus=FALSE)
|
||||
self.buttonCancel = Button(frameActionButtons,text='Cancel',
|
||||
command=self.Cancel,takefocus=FALSE)
|
||||
self.CreatePageFontTab()
|
||||
|
@ -162,8 +84,7 @@ class ConfigDialog(Toplevel):
|
|||
self.buttonCancel.pack(side=LEFT,padx=5,pady=5)
|
||||
frameActionButtons.pack(side=BOTTOM)
|
||||
self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
|
||||
|
||||
|
||||
|
||||
def CreatePageFontTab(self):
|
||||
#tkVars
|
||||
self.fontSize=StringVar(self)
|
||||
|
@ -361,12 +282,13 @@ class ConfigDialog(Toplevel):
|
|||
scrollTargetY=Scrollbar(frameTarget)
|
||||
scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
|
||||
self.listBindings=Listbox(frameTarget)
|
||||
self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
|
||||
scrollTargetY.config(command=self.listBindings.yview)
|
||||
scrollTargetX.config(command=self.listBindings.xview)
|
||||
self.listBindings.config(yscrollcommand=scrollTargetY.set)
|
||||
self.listBindings.config(xscrollcommand=scrollTargetX.set)
|
||||
buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
|
||||
command=self.GetNewKeys)
|
||||
self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
|
||||
command=self.GetNewKeys,state=DISABLED)
|
||||
buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set')
|
||||
#frameKeySets
|
||||
labelKeysTitle=Label(frameKeySets,text='Select a Key Set')
|
||||
|
@ -387,7 +309,7 @@ class ConfigDialog(Toplevel):
|
|||
#frameCustom
|
||||
labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
|
||||
buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
|
||||
buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
|
||||
self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
|
||||
frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
|
||||
#frame target
|
||||
frameTarget.columnconfigure(0,weight=1)
|
||||
|
@ -411,7 +333,7 @@ class ConfigDialog(Toplevel):
|
|||
self.runType=IntVar(self)
|
||||
self.winWidth=StringVar(self)
|
||||
self.winHeight=StringVar(self)
|
||||
self.extState=IntVar(self)
|
||||
self.startupEdit=IntVar(self)
|
||||
#widget creation
|
||||
#body
|
||||
frame=self.tabPages.pages['General']['page']
|
||||
|
@ -420,14 +342,15 @@ class ConfigDialog(Toplevel):
|
|||
frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
|
||||
frameExt=Frame(frame,borderwidth=2,relief=GROOVE)
|
||||
#frameRun
|
||||
labelRunTitle=Label(frameRun,text='Run Preferences')
|
||||
labelRunChoiceTitle=Label(frameRun,text='Run code : ')
|
||||
radioRunInternal=Radiobutton(frameRun,variable=self.runType,
|
||||
value=0,command=self.SetKeysType,text="in IDLE's Process")
|
||||
radioRunSeparate=Radiobutton(frameRun,variable=self.runType,
|
||||
value=1,command=self.SetKeysType,text='in a Separate Process')
|
||||
labelRunTitle=Label(frameRun,text='Startup Preferences')
|
||||
labelRunChoiceTitle=Label(frameRun,text='On startup : ')
|
||||
radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
|
||||
value=1,command=self.SetKeysType,text="open Edit Window")
|
||||
radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
|
||||
value=0,command=self.SetKeysType,text='open Shell Window')
|
||||
#frameWinSize
|
||||
labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size')
|
||||
labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
|
||||
' (in characters)')
|
||||
labelWinWidthTitle=Label(frameWinSize,text='Width')
|
||||
entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
|
||||
width=3)
|
||||
|
@ -440,17 +363,16 @@ class ConfigDialog(Toplevel):
|
|||
labelExtTitle=Label(frameExt,text='Configure IDLE Extensions')
|
||||
labelExtListTitle=Label(frameExtList,text='Extension')
|
||||
scrollExtList=Scrollbar(frameExtList)
|
||||
listExt=Listbox(frameExtList,height=5)
|
||||
scrollExtList.config(command=listExt.yview)
|
||||
listExt.config(yscrollcommand=scrollExtList.set)
|
||||
self.listExt=Listbox(frameExtList,height=5)
|
||||
scrollExtList.config(command=self.listExt.yview)
|
||||
self.listExt.config(yscrollcommand=scrollExtList.set)
|
||||
self.listExt.bind('<ButtonRelease-1>',self.ExtensionSelected)
|
||||
labelExtSetTitle=Label(frameExtSet,text='Settings')
|
||||
radioEnableExt=Radiobutton(frameExtSet,variable=self.extState,
|
||||
value=1,text="enable")
|
||||
radioDisableExt=Radiobutton(frameExtSet,variable=self.extState,
|
||||
value=0,text="disable")
|
||||
self.extState.set(1)
|
||||
buttonExtConfig=Button(frameExtSet,text='Configure')
|
||||
|
||||
self.radioEnableExt=Radiobutton(frameExtSet,variable=self.startupEdit,
|
||||
value=1,text="enabled",state=DISABLED)
|
||||
self.radioDisableExt=Radiobutton(frameExtSet,variable=self.startupEdit,
|
||||
value=0,text="disabled",state=DISABLED)
|
||||
self.buttonExtConfig=Button(frameExtSet,text='Configure',state=DISABLED)
|
||||
#widget packing
|
||||
#body
|
||||
frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
|
||||
|
@ -459,8 +381,8 @@ class ConfigDialog(Toplevel):
|
|||
#frameRun
|
||||
labelRunTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
|
||||
labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
|
||||
radioRunInternal.pack(side=LEFT,anchor=W,padx=5,pady=5)
|
||||
radioRunSeparate.pack(side=LEFT,anchor=W,padx=5,pady=5)
|
||||
radioStartupEdit.pack(side=LEFT,anchor=W,padx=5,pady=5)
|
||||
radioStartupShell.pack(side=LEFT,anchor=W,padx=5,pady=5)
|
||||
#frameWinSize
|
||||
labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
|
||||
entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
|
||||
|
@ -473,14 +395,89 @@ class ConfigDialog(Toplevel):
|
|||
frameExtList.pack(side=RIGHT,padx=5,pady=5,expand=TRUE,fill=BOTH)
|
||||
labelExtListTitle.pack(side=TOP,anchor=W)
|
||||
scrollExtList.pack(side=RIGHT,anchor=W,fill=Y)
|
||||
listExt.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
|
||||
self.listExt.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
|
||||
labelExtSetTitle.pack(side=TOP,anchor=W)
|
||||
radioEnableExt.pack(side=TOP,anchor=W)
|
||||
radioDisableExt.pack(side=TOP,anchor=W)
|
||||
buttonExtConfig.pack(side=TOP,anchor=W,pady=5)
|
||||
|
||||
self.radioEnableExt.pack(side=TOP,anchor=W)
|
||||
self.radioDisableExt.pack(side=TOP,anchor=W)
|
||||
self.buttonExtConfig.pack(side=TOP,anchor=W,pady=5)
|
||||
return frame
|
||||
|
||||
def GetDefaultItems(self):
|
||||
dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
|
||||
for configType in dItems.keys():
|
||||
sections=idleConf.GetSectionList('default',configType)
|
||||
for section in sections:
|
||||
dItems[configType][section]={}
|
||||
options=idleConf.defaultCfg[configType].GetOptionList(section)
|
||||
for option in options:
|
||||
dItems[configType][section][option]=(
|
||||
idleConf.defaultCfg[configType].Get(section,option))
|
||||
return dItems
|
||||
|
||||
def SetThemeType(self):
|
||||
if self.themeIsBuiltin.get():
|
||||
self.optMenuThemeBuiltin.config(state=NORMAL)
|
||||
self.optMenuThemeCustom.config(state=DISABLED)
|
||||
self.buttonDeleteCustomTheme.config(state=DISABLED)
|
||||
else:
|
||||
self.optMenuThemeBuiltin.config(state=DISABLED)
|
||||
self.optMenuThemeCustom.config(state=NORMAL)
|
||||
self.buttonDeleteCustomTheme.config(state=NORMAL)
|
||||
|
||||
def SetKeysType(self):
|
||||
if self.keysAreDefault.get():
|
||||
self.optMenuKeysBuiltin.config(state=NORMAL)
|
||||
self.optMenuKeysCustom.config(state=DISABLED)
|
||||
self.buttonDeleteCustomKeys.config(state=DISABLED)
|
||||
else:
|
||||
self.optMenuKeysBuiltin.config(state=DISABLED)
|
||||
self.optMenuKeysCustom.config(state=NORMAL)
|
||||
self.buttonDeleteCustomKeys.config(state=NORMAL)
|
||||
|
||||
def GetColour(self):
|
||||
target=self.highlightTarget.get()
|
||||
rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
|
||||
title='Pick new colour for : '+target,
|
||||
initialcolor=self.frameColourSet.cget('bg'))
|
||||
if colourString: #user didn't cancel
|
||||
self.frameColourSet.config(bg=colourString)#set sample
|
||||
if self.fgHilite.get(): plane='foreground'
|
||||
else: plane='background'
|
||||
apply(self.textHighlightSample.tag_config,
|
||||
(self.themeElements[target][0],),{plane:colourString})
|
||||
|
||||
def SetFontSampleBinding(self,event):
|
||||
self.SetFontSample()
|
||||
|
||||
def SetFontSample(self):
|
||||
self.editFont.config(size=self.fontSize.get(),weight=NORMAL,
|
||||
family=self.listFontName.get(self.listFontName.curselection()[0]))
|
||||
|
||||
def SetHighlightTargetBinding(self,*args):
|
||||
self.SetHighlightTarget()
|
||||
|
||||
def SetHighlightTarget(self):
|
||||
if self.highlightTarget.get()=='Cursor': #bg not possible
|
||||
self.radioFg.config(state=DISABLED)
|
||||
self.radioBg.config(state=DISABLED)
|
||||
self.fgHilite.set(1)
|
||||
else: #both fg and bg can be set
|
||||
self.radioFg.config(state=NORMAL)
|
||||
self.radioBg.config(state=NORMAL)
|
||||
self.fgHilite.set(1)
|
||||
self.SetColourSample()
|
||||
|
||||
def SetColourSampleBinding(self,*args):
|
||||
self.SetColourSample()
|
||||
|
||||
def SetColourSample(self):
|
||||
#set the colour smaple area
|
||||
tag=self.themeElements[self.highlightTarget.get()][0]
|
||||
if self.fgHilite.get(): plane='foreground'
|
||||
else: plane='background'
|
||||
colour=self.textHighlightSample.tag_cget(tag,plane)
|
||||
self.frameColourSet.config(bg=colour)
|
||||
|
||||
def PaintThemeSample(self):
|
||||
if self.themeIsBuiltin.get(): #a default theme
|
||||
theme=self.builtinTheme.get()
|
||||
|
@ -601,13 +598,29 @@ class ConfigDialog(Toplevel):
|
|||
self.listBindings.delete(listIndex)
|
||||
self.listBindings.insert(listIndex,bindName+' - '+newKeys.result)
|
||||
self.listBindings.select_set(listIndex)
|
||||
|
||||
|
||||
def KeyBindingSelected(self,event):
|
||||
self.buttonNewKeys.config(state=NORMAL)
|
||||
|
||||
def LoadGeneralCfg(self):
|
||||
#startup state
|
||||
self.startupEdit.set(idleConf.GetOption('main','General',
|
||||
'editor-on-startup',default=1,type='bool'))
|
||||
#initial window size
|
||||
self.winWidth.set(idleConf.GetOption('main','EditorWindow','width'))
|
||||
self.winHeight.set(idleConf.GetOption('main','EditorWindow','height'))
|
||||
|
||||
|
||||
#extensions
|
||||
extns=idleConf.GetExtensions(activeOnly=0)
|
||||
apply(self.listExt.insert,(END,)+tuple(extns))
|
||||
|
||||
def ExtensionSelected(self,event):
|
||||
self.radioEnableExt.config(state=NORMAL)
|
||||
self.radioDisableExt.config(state=NORMAL)
|
||||
self.buttonExtConfig.config(state=NORMAL)
|
||||
extn=self.listExt.get(ANCHOR)
|
||||
self.extState.set(idleConf.GetOption('extensions',extn,'enable',
|
||||
default=1,type='bool'))
|
||||
|
||||
def LoadConfigs(self):
|
||||
"""
|
||||
load configuration from default and user config files and populate
|
||||
|
@ -628,6 +641,31 @@ class ConfigDialog(Toplevel):
|
|||
"""
|
||||
save configuration changes to user config files.
|
||||
"""
|
||||
#DEBUG
|
||||
print self.defaultItems
|
||||
print self.changedItems
|
||||
for configType in self.changedItems.keys():
|
||||
for section in self.changedItems[configType].keys():
|
||||
for item in self.changedItems[configType][section].keys():
|
||||
#DEBUG
|
||||
value=self.changedItems[configType][section][item]
|
||||
print configType, section, item, value
|
||||
print self.changedItems
|
||||
|
||||
def AddChangedItem(self,type,section,item,value):
|
||||
self.changedItems[type][section][item]=value
|
||||
|
||||
def Cancel(self):
|
||||
self.destroy()
|
||||
|
||||
def Ok(self):
|
||||
self.Apply()
|
||||
self.destroy()
|
||||
|
||||
def Apply(self):
|
||||
self.SaveConfigs()
|
||||
|
||||
def Help(self):
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -23,7 +23,7 @@ class IdleConfParser(ConfigParser):
|
|||
self.file=cfgFile
|
||||
ConfigParser.__init__(self,defaults=cfgDefaults)
|
||||
|
||||
def Get(self, section, option, type=None): #,default=None)
|
||||
def Get(self, section, option, type=None):
|
||||
"""
|
||||
Get an option value for given section/option or return default.
|
||||
If type is specified, return as type.
|
||||
|
@ -143,9 +143,9 @@ class IdleConf:
|
|||
Get a list of sections from either the user or default config for
|
||||
the given config type.
|
||||
configSet must be either 'user' or 'default'
|
||||
configType must be one of ('extensions','highlight','keys')
|
||||
configType must be one of ('main','extensions','highlight','keys')
|
||||
"""
|
||||
if not (configType in ('extensions','highlight','keys')):
|
||||
if not (configType in ('main','extensions','highlight','keys')):
|
||||
raise 'Invalid configType specified'
|
||||
if configSet == 'user':
|
||||
cfgParser=self.userCfg[configType]
|
||||
|
@ -224,7 +224,8 @@ class IdleConf:
|
|||
if activeOnly:
|
||||
activeExtns=[]
|
||||
for extn in extns:
|
||||
if self.GetOption('extensions',extn,'enable',default=1,type='bool'):
|
||||
if self.GetOption('extensions',extn,'enable',default=1,
|
||||
type='bool'):
|
||||
#the extension is enabled
|
||||
activeExtns.append(extn)
|
||||
return activeExtns
|
||||
|
|
Loading…
Reference in New Issue