M configDialog.py

M configHelpSourceEdit.py

1. Attach configHelpSourceEdit error dialogs to parent to avoid Tk root
   pop-ups.
2. Make configHelpSourceEdit OK button the default and bind <Return>.
3. Reformat configHelpSourceEdit.
4. ConfigDialog.SaveAllChangedConfig() had a bug which caused additional
   help sources to be deleted when other config items were changed.
4. Uniform capitalization in configDialog.
5. Update configDialog doc string.
This commit is contained in:
Kurt B. Kaiser 2003-01-10 20:13:57 +00:00
parent 9149aeb842
commit e7a161e60c
2 changed files with 97 additions and 82 deletions

View file

@ -1,5 +1,13 @@
""" """IDLE Configuration Dialog: support user customization of IDLE by GUI
configuration dialog
Customize font faces, sizes, and colorization attributes. Set indentation
defaults. Customize keybindings. Colorization and keybindings can be
saved as user defined sets. Select startup options including shell/editor
and default window size. Define additional help sources.
Note that tab width in IDLE is currently fixed at eight due to Tk issues.
Refer to comment in EditorWindow autoindent code for details.
""" """
from Tkinter import * from Tkinter import *
import tkMessageBox, tkColorChooser, tkFont import tkMessageBox, tkColorChooser, tkFont
@ -11,6 +19,7 @@ from tabpage import TabPageSet
from keybindingDialog import GetKeysDialog from keybindingDialog import GetKeysDialog
from configSectionNameDialog import GetCfgSectionNameDialog from configSectionNameDialog import GetCfgSectionNameDialog
from configHelpSourceEdit import GetHelpSourceDialog from configHelpSourceEdit import GetHelpSourceDialog
class ConfigDialog(Toplevel): class ConfigDialog(Toplevel):
""" """
configuration dialog for idle configuration dialog for idle
@ -336,11 +345,11 @@ class ConfigDialog(Toplevel):
frameHelp=Frame(frame,borderwidth=2,relief=GROOVE) frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
#frameRun #frameRun
labelRunTitle=Label(frameRun,text='Startup Preferences') labelRunTitle=Label(frameRun,text='Startup Preferences')
labelRunChoiceTitle=Label(frameRun,text='On startup : ') labelRunChoiceTitle=Label(frameRun,text='On Startup : ')
radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit, radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
value=1,command=self.SetKeysType,text="open Edit Window") value=1,command=self.SetKeysType,text="Open Edit Window")
radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit, radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
value=0,command=self.SetKeysType,text='open Shell Window') value=0,command=self.SetKeysType,text='Open Shell Window')
#frameWinSize #frameWinSize
labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+ labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
' (in characters)') ' (in characters)')
@ -354,7 +363,7 @@ class ConfigDialog(Toplevel):
labelHelpTitle=Label(frameHelp,text='Help Options') labelHelpTitle=Label(frameHelp,text='Help Options')
frameHelpList=Frame(frameHelp) frameHelpList=Frame(frameHelp)
frameHelpListButtons=Frame(frameHelpList) frameHelpListButtons=Frame(frameHelpList)
labelHelpListTitle=Label(frameHelpList,text='Additional (html) Help Sources:') labelHelpListTitle=Label(frameHelpList,text='Additional Help Sources:')
scrollHelpList=Scrollbar(frameHelpList) scrollHelpList=Scrollbar(frameHelpList)
self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE, self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
exportselection=FALSE) exportselection=FALSE)
@ -840,11 +849,11 @@ class ConfigDialog(Toplevel):
apply(self.textHighlightSample.tag_config,(element,),colours) apply(self.textHighlightSample.tag_config,(element,),colours)
self.SetColourSample() self.SetColourSample()
def OnCheckUserHelpBrowser(self): ## def OnCheckUserHelpBrowser(self):
if self.userHelpBrowser.get(): ## if self.userHelpBrowser.get():
self.entryHelpBrowser.config(state=NORMAL) ## self.entryHelpBrowser.config(state=NORMAL)
else: ## else:
self.entryHelpBrowser.config(state=DISABLED) ## self.entryHelpBrowser.config(state=DISABLED)
def HelpSourceSelected(self,event): def HelpSourceSelected(self,event):
self.SetHelpListButtonStates() self.SetHelpListButtonStates()
@ -890,7 +899,7 @@ class ConfigDialog(Toplevel):
self.SetHelpListButtonStates() self.SetHelpListButtonStates()
def UpdateUserHelpChangedItems(self): def UpdateUserHelpChangedItems(self):
#clear and rebuild the HelpFiles secion in self.changedItems #clear and rebuild the HelpFiles section in self.changedItems
if self.changedItems['main'].has_key('HelpFiles'): if self.changedItems['main'].has_key('HelpFiles'):
del(self.changedItems['main']['HelpFiles']) del(self.changedItems['main']['HelpFiles'])
for num in range(1,len(self.userHelpList)+1): for num in range(1,len(self.userHelpList)+1):
@ -1069,19 +1078,18 @@ class ConfigDialog(Toplevel):
return idleConf.userCfg[configType].SetOption(section,item,value) return idleConf.userCfg[configType].SetOption(section,item,value)
def SaveAllChangedConfigs(self): def SaveAllChangedConfigs(self):
""" "Save configuration changes to the user config file."
save all configuration changes to user config files.
"""
#this section gets completely replaced
idleConf.userCfg['main'].remove_section('HelpFiles')
idleConf.userCfg['main'].Save() idleConf.userCfg['main'].Save()
for configType in self.changedItems.keys(): for configType in self.changedItems.keys():
cfgTypeHasChanges=0 cfgTypeHasChanges = False
for section in self.changedItems[configType].keys(): for section in self.changedItems[configType].keys():
if section == 'HelpFiles':
#this section gets completely replaced
idleConf.userCfg['main'].remove_section('HelpFiles')
for item in self.changedItems[configType][section].keys(): for item in self.changedItems[configType][section].keys():
value = self.changedItems[configType][section][item] value = self.changedItems[configType][section][item]
if self.SetUserValue(configType,section,item,value): if self.SetUserValue(configType,section,item,value):
cfgTypeHasChanges=1 cfgTypeHasChanges = True
if cfgTypeHasChanges: if cfgTypeHasChanges:
idleConf.userCfg[configType].Save() idleConf.userCfg[configType].Save()
self.ResetChangedItems() #clear the changed items dict self.ResetChangedItems() #clear the changed items dict

View file

@ -1,7 +1,5 @@
""" "Dialog to specify or edit the parameters for a user configured help source."
Dialog that allows user to specify or edit the parameters for a user configured
help source.
"""
from Tkinter import * from Tkinter import *
import tkMessageBox import tkMessageBox
import os import os
@ -25,14 +23,16 @@ class GetHelpSourceDialog(Toplevel):
self.menu.set(menuItem) self.menu.set(menuItem)
self.path.set(filePath) self.path.set(filePath)
self.withdraw() #hide while setting geometry self.withdraw() #hide while setting geometry
self.update_idletasks()
#needs to be done here so that the winfo_reqwidth is valid #needs to be done here so that the winfo_reqwidth is valid
self.update_idletasks()
#centre dialog over parent:
self.geometry("+%d+%d" % self.geometry("+%d+%d" %
((parent.winfo_rootx() + ((parent.winfo_width()/2) ((parent.winfo_rootx() + ((parent.winfo_width()/2)
-(self.winfo_reqwidth()/2)), -(self.winfo_reqwidth()/2)),
parent.winfo_rooty() + ((parent.winfo_height()/2) parent.winfo_rooty() + ((parent.winfo_height()/2)
-(self.winfo_reqheight()/2)) )) ) #centre dialog over parent -(self.winfo_reqheight()/2)))))
self.deiconify() #geometry set, unhide self.deiconify() #geometry set, unhide
self.bind('<Return>', self.Ok)
self.wait_window() self.wait_window()
def CreateWidgets(self): def CreateWidgets(self):
@ -43,11 +43,13 @@ class GetHelpSourceDialog(Toplevel):
self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH) self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
labelMenu = Label(self.frameMain, anchor=W, justify=LEFT, labelMenu = Label(self.frameMain, anchor=W, justify=LEFT,
text='Menu Item:') text='Menu Item:')
self.entryMenu=Entry(self.frameMain,textvariable=self.menu,width=30) self.entryMenu = Entry(self.frameMain, textvariable=self.menu,
width=30)
self.entryMenu.focus_set() self.entryMenu.focus_set()
labelPath = Label(self.frameMain, anchor=W, justify=LEFT, labelPath = Label(self.frameMain, anchor=W, justify=LEFT,
text='Help File Path:') text='Help File Path:')
self.entryPath=Entry(self.frameMain,textvariable=self.path,width=40) self.entryPath = Entry(self.frameMain, textvariable=self.path,
width=40)
self.entryMenu.focus_set() self.entryMenu.focus_set()
labelMenu.pack(anchor=W, padx=5, pady=3) labelMenu.pack(anchor=W, padx=5, pady=3)
self.entryMenu.pack(anchor=W, padx=5, pady=3) self.entryMenu.pack(anchor=W, padx=5, pady=3)
@ -55,53 +57,58 @@ class GetHelpSourceDialog(Toplevel):
self.entryPath.pack(anchor=W, padx=5, pady=3) self.entryPath.pack(anchor=W, padx=5, pady=3)
frameButtons = Frame(self) frameButtons = Frame(self)
frameButtons.pack(side=BOTTOM, fill=X) frameButtons.pack(side=BOTTOM, fill=X)
self.buttonOk = Button(frameButtons,text='Ok', self.buttonOk = Button(frameButtons, text='OK',
width=8,command=self.Ok) width=8, default=ACTIVE, command=self.Ok)
self.buttonOk.grid(row=0, column=0, padx=5,pady=5) self.buttonOk.grid(row=0, column=0, padx=5,pady=5)
self.buttonOk.bind('<Return>', self.Ok)
#self.buttonOk.focus()
self.buttonCancel = Button(frameButtons, text='Cancel', self.buttonCancel = Button(frameButtons, text='Cancel',
width=8, command=self.Cancel) width=8, command=self.Cancel)
self.buttonCancel.grid(row=0, column=1, padx=5, pady=5) self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
def MenuOk(self): def MenuOk(self):
#simple validity check for a sensible "Simple validity check for a sensible menu item name"
#menu item name menuOk = True
menuOk=1
menu = self.menu.get() menu = self.menu.get()
menu.strip() menu.strip()
if not menu: #no menu item specified if not menu:
tkMessageBox.showerror(title='Menu Item Error', tkMessageBox.showerror(title='Menu Item Error',
message='No menu item specified.') message='No menu item specified',
parent=self)
self.entryMenu.focus_set() self.entryMenu.focus_set()
menuOk=0 menuOk = False
elif len(menu)>30: #menu item name too long elif len(menu) > 30:
tkMessageBox.showerror(title='Menu Item Error', tkMessageBox.showerror(title='Menu Item Error',
message='Menu item too long. It should be no more '+ message='Menu item too long:'
'than 30 characters.') '\nLimit 30 characters.',
parent=self)
self.entryMenu.focus_set() self.entryMenu.focus_set()
menuOk=0 menuOk = False
return menuOk return menuOk
def PathOk(self): def PathOk(self):
#simple validity check for menu file path "Simple validity check for menu file path"
pathOk=1 pathOk = True
path = self.path.get() path = self.path.get()
path.strip() path.strip()
if not path: #no path specified if not path: #no path specified
tkMessageBox.showerror(title='File Path Error', tkMessageBox.showerror(title='File Path Error',
message='No help file path specified.') message='No help file path specified.',
parent=self)
self.entryPath.focus_set() self.entryPath.focus_set()
pathOk=0 pathOk = False
elif not os.path.exists(path): elif not os.path.exists(path):
tkMessageBox.showerror(title='File Path Error', tkMessageBox.showerror(title='File Path Error',
message='Help file path does not exist.') message='Help file path does not exist.',
parent=self)
self.entryPath.focus_set() self.entryPath.focus_set()
pathOk=0 pathOk = False
return pathOk return pathOk
def Ok(self, event=None): def Ok(self, event=None):
if self.MenuOk(): if self.MenuOk() and self.PathOk():
if self.PathOk(): self.result = (self.menu.get().strip(),
self.result=( self.menu.get().strip(),self.path.get().strip() ) self.path.get().strip())
self.destroy() self.destroy()
def Cancel(self, event=None): def Cancel(self, event=None):