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 @@
"""
configuration dialog
"""IDLE Configuration Dialog: support user customization of IDLE by GUI
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 *
import tkMessageBox, tkColorChooser, tkFont
@ -11,6 +19,7 @@ from tabpage import TabPageSet
from keybindingDialog import GetKeysDialog
from configSectionNameDialog import GetCfgSectionNameDialog
from configHelpSourceEdit import GetHelpSourceDialog
class ConfigDialog(Toplevel):
"""
configuration dialog for idle
@ -336,11 +345,11 @@ class ConfigDialog(Toplevel):
frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
#frameRun
labelRunTitle=Label(frameRun,text='Startup Preferences')
labelRunChoiceTitle=Label(frameRun,text='On startup : ')
labelRunChoiceTitle=Label(frameRun,text='On Startup : ')
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,
value=0,command=self.SetKeysType,text='open Shell Window')
value=0,command=self.SetKeysType,text='Open Shell Window')
#frameWinSize
labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
' (in characters)')
@ -354,7 +363,7 @@ class ConfigDialog(Toplevel):
labelHelpTitle=Label(frameHelp,text='Help Options')
frameHelpList=Frame(frameHelp)
frameHelpListButtons=Frame(frameHelpList)
labelHelpListTitle=Label(frameHelpList,text='Additional (html) Help Sources:')
labelHelpListTitle=Label(frameHelpList,text='Additional Help Sources:')
scrollHelpList=Scrollbar(frameHelpList)
self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
exportselection=FALSE)
@ -840,11 +849,11 @@ class ConfigDialog(Toplevel):
apply(self.textHighlightSample.tag_config,(element,),colours)
self.SetColourSample()
def OnCheckUserHelpBrowser(self):
if self.userHelpBrowser.get():
self.entryHelpBrowser.config(state=NORMAL)
else:
self.entryHelpBrowser.config(state=DISABLED)
## def OnCheckUserHelpBrowser(self):
## if self.userHelpBrowser.get():
## self.entryHelpBrowser.config(state=NORMAL)
## else:
## self.entryHelpBrowser.config(state=DISABLED)
def HelpSourceSelected(self,event):
self.SetHelpListButtonStates()
@ -890,7 +899,7 @@ class ConfigDialog(Toplevel):
self.SetHelpListButtonStates()
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'):
del(self.changedItems['main']['HelpFiles'])
for num in range(1,len(self.userHelpList)+1):
@ -1069,19 +1078,18 @@ class ConfigDialog(Toplevel):
return idleConf.userCfg[configType].SetOption(section,item,value)
def SaveAllChangedConfigs(self):
"""
save all configuration changes to user config files.
"""
#this section gets completely replaced
idleConf.userCfg['main'].remove_section('HelpFiles')
"Save configuration changes to the user config file."
idleConf.userCfg['main'].Save()
for configType in self.changedItems.keys():
cfgTypeHasChanges=0
cfgTypeHasChanges = False
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():
value=self.changedItems[configType][section][item]
value = self.changedItems[configType][section][item]
if self.SetUserValue(configType,section,item,value):
cfgTypeHasChanges=1
cfgTypeHasChanges = True
if cfgTypeHasChanges:
idleConf.userCfg[configType].Save()
self.ResetChangedItems() #clear the changed items dict

View File

@ -1,119 +1,126 @@
"""
Dialog that allows user to specify or edit the parameters for a user configured
help source.
"""
"Dialog to specify or edit the parameters for a user configured help source."
from Tkinter import *
import tkMessageBox
import os
class GetHelpSourceDialog(Toplevel):
def __init__(self,parent,title,menuItem='',filePath=''):
def __init__(self, parent, title, menuItem='', filePath=''):
"""
menuItem - string, the menu item to edit, if any
filePath - string, the help file path to edit, if any
"""
Toplevel.__init__(self, parent)
self.configure(borderwidth=5)
self.resizable(height=FALSE,width=FALSE)
self.resizable(height=FALSE, width=FALSE)
self.title(title)
self.transient(parent)
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self.Cancel)
self.parent = parent
self.result=None
self.result = None
self.CreateWidgets()
self.menu.set(menuItem)
self.path.set(filePath)
self.withdraw() #hide while setting geometry
self.update_idletasks()
#needs to be done here so that the winfo_reqwidth is valid
self.update_idletasks()
#centre dialog over parent:
self.geometry("+%d+%d" %
((parent.winfo_rootx()+((parent.winfo_width()/2)
-(self.winfo_reqwidth()/2)),
parent.winfo_rooty()+((parent.winfo_height()/2)
-(self.winfo_reqheight()/2)) )) ) #centre dialog over parent
((parent.winfo_rootx() + ((parent.winfo_width()/2)
-(self.winfo_reqwidth()/2)),
parent.winfo_rooty() + ((parent.winfo_height()/2)
-(self.winfo_reqheight()/2)))))
self.deiconify() #geometry set, unhide
self.bind('<Return>', self.Ok)
self.wait_window()
def CreateWidgets(self):
self.menu=StringVar(self)
self.path=StringVar(self)
self.fontSize=StringVar(self)
self.frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
self.frameMain.pack(side=TOP,expand=TRUE,fill=BOTH)
labelMenu=Label(self.frameMain,anchor=W,justify=LEFT,
text='Menu Item:')
self.entryMenu=Entry(self.frameMain,textvariable=self.menu,width=30)
self.menu = StringVar(self)
self.path = StringVar(self)
self.fontSize = StringVar(self)
self.frameMain = Frame(self, borderwidth=2, relief=SUNKEN)
self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
labelMenu = Label(self.frameMain, anchor=W, justify=LEFT,
text='Menu Item:')
self.entryMenu = Entry(self.frameMain, textvariable=self.menu,
width=30)
self.entryMenu.focus_set()
labelPath=Label(self.frameMain,anchor=W,justify=LEFT,
text='Help File Path:')
self.entryPath=Entry(self.frameMain,textvariable=self.path,width=40)
labelPath = Label(self.frameMain, anchor=W, justify=LEFT,
text='Help File Path:')
self.entryPath = Entry(self.frameMain, textvariable=self.path,
width=40)
self.entryMenu.focus_set()
labelMenu.pack(anchor=W,padx=5,pady=3)
self.entryMenu.pack(anchor=W,padx=5,pady=3)
labelPath.pack(anchor=W,padx=5,pady=3)
self.entryPath.pack(anchor=W,padx=5,pady=3)
frameButtons=Frame(self)
frameButtons.pack(side=BOTTOM,fill=X)
self.buttonOk = Button(frameButtons,text='Ok',
width=8,command=self.Ok)
self.buttonOk.grid(row=0,column=0,padx=5,pady=5)
self.buttonCancel = Button(frameButtons,text='Cancel',
width=8,command=self.Cancel)
self.buttonCancel.grid(row=0,column=1,padx=5,pady=5)
labelMenu.pack(anchor=W, padx=5, pady=3)
self.entryMenu.pack(anchor=W, padx=5, pady=3)
labelPath.pack(anchor=W, padx=5, pady=3)
self.entryPath.pack(anchor=W, padx=5, pady=3)
frameButtons = Frame(self)
frameButtons.pack(side=BOTTOM, fill=X)
self.buttonOk = Button(frameButtons, text='OK',
width=8, default=ACTIVE, command=self.Ok)
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',
width=8, command=self.Cancel)
self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
def MenuOk(self):
#simple validity check for a sensible
#menu item name
menuOk=1
menu=self.menu.get()
"Simple validity check for a sensible menu item name"
menuOk = True
menu = self.menu.get()
menu.strip()
if not menu: #no menu item specified
if not menu:
tkMessageBox.showerror(title='Menu Item Error',
message='No menu item specified.')
message='No menu item specified',
parent=self)
self.entryMenu.focus_set()
menuOk=0
elif len(menu)>30: #menu item name too long
menuOk = False
elif len(menu) > 30:
tkMessageBox.showerror(title='Menu Item Error',
message='Menu item too long. It should be no more '+
'than 30 characters.')
message='Menu item too long:'
'\nLimit 30 characters.',
parent=self)
self.entryMenu.focus_set()
menuOk=0
menuOk = False
return menuOk
def PathOk(self):
#simple validity check for menu file path
pathOk=1
path=self.path.get()
"Simple validity check for menu file path"
pathOk = True
path = self.path.get()
path.strip()
if not path: #no path specified
tkMessageBox.showerror(title='File Path Error',
message='No help file path specified.')
message='No help file path specified.',
parent=self)
self.entryPath.focus_set()
pathOk=0
pathOk = False
elif not os.path.exists(path):
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()
pathOk=0
pathOk = False
return pathOk
def Ok(self, event=None):
if self.MenuOk():
if self.PathOk():
self.result=( self.menu.get().strip(),self.path.get().strip() )
self.destroy()
if self.MenuOk() and self.PathOk():
self.result = (self.menu.get().strip(),
self.path.get().strip())
self.destroy()
def Cancel(self, event=None):
self.result=None
self.result = None
self.destroy()
if __name__ == '__main__':
#test the dialog
root=Tk()
root = Tk()
def run():
keySeq=''
dlg=GetHelpSourceDialog(root,'Get Help Source')
keySeq = ''
dlg = GetHelpSourceDialog(root, 'Get Help Source')
print dlg.result
Button(root,text='Dialog',command=run).pack()
Button(root,text='Dialog', command=run).pack()
root.mainloop()