From facfc09352f03930d7b5d6362f30c1141a634dc7 Mon Sep 17 00:00:00 2001 From: "Steven M. Gava" Date: Sat, 19 Jan 2002 00:29:54 +0000 Subject: keybinding configuration --- Lib/idlelib/config-keys.def | 2 - Lib/idlelib/configDialog.py | 85 ++++++++++++++++++++++-------------- Lib/idlelib/configHandler.py | 1 - Lib/idlelib/dynOptionMenuWidget.py | 6 --- Lib/idlelib/keybindingDialog.py | 88 +++++++++++++++++++++++++------------- 5 files changed, 110 insertions(+), 72 deletions(-) diff --git a/Lib/idlelib/config-keys.def b/Lib/idlelib/config-keys.def index 5d3839d..bb5a1fd 100644 --- a/Lib/idlelib/config-keys.def +++ b/Lib/idlelib/config-keys.def @@ -13,7 +13,6 @@ beginning-of-line= center-insert= close-all-windows= close-window= -dump-undo-state= end-of-file= python-docs= python-context-help= @@ -49,7 +48,6 @@ center-insert= close-all-windows= close-window= do-nothing= -dump-undo-state= end-of-file= history-next= history-previous= diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py index bfff813..a45188b 100644 --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -3,10 +3,12 @@ configuration dialog """ from Tkinter import * import tkMessageBox, tkColorChooser, tkFont +import string from configHandler import idleConf from dynOptionMenuWidget import DynOptionMenu from tabpage import TabPageSet +from keybindingDialog import GetKeysDialog class ConfigDialog(Toplevel): """ @@ -354,20 +356,17 @@ class ConfigDialog(Toplevel): frameKeySets=Frame(frame,borderwidth=2,relief=GROOVE) #frameCustom frameTarget=Frame(frameCustom) - frameSet=Frame(frameCustom) labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings') - labelTargetTitle=Label(frameTarget,text='Action') - scrollTarget=Scrollbar(frameTarget) - listTarget=Listbox(frameTarget) - scrollTarget.config(command=listTarget.yview) - listTarget.config(yscrollcommand=scrollTarget.set) - labelKeyBindTitle=Label(frameSet,text='Binding') - labelModifierTitle=Label(frameSet,text='Modifier:') - checkCtrl=Checkbutton(frameSet,text='Ctrl') - checkAlt=Checkbutton(frameSet,text='Alt') - checkShift=Checkbutton(frameSet,text='Shift') - labelKeyEntryTitle=Label(frameSet,text='Key:') - entryKey=Entry(frameSet,width=4) + labelTargetTitle=Label(frameTarget,text='Action - Key(s)') + scrollTargetY=Scrollbar(frameTarget) + scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL) + self.listBindings=Listbox(frameTarget) + 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) buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set') #frameKeySets labelKeysTitle=Label(frameKeySets,text='Select a Key Set') @@ -388,18 +387,15 @@ class ConfigDialog(Toplevel): #frameCustom labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) - frameTarget.pack(side=LEFT,padx=5,pady=5,fill=Y) - frameSet.pack(side=LEFT,padx=5,pady=5,fill=Y) - labelTargetTitle.pack(side=TOP,anchor=W) - scrollTarget.pack(side=RIGHT,anchor=W,fill=Y) - listTarget.pack(side=TOP,anchor=W,expand=TRUE,fill=BOTH) - labelKeyBindTitle.pack(side=TOP,anchor=W) - labelModifierTitle.pack(side=TOP,anchor=W,pady=5) - checkCtrl.pack(side=TOP,anchor=W) - checkAlt.pack(side=TOP,anchor=W,pady=2) - checkShift.pack(side=TOP,anchor=W) - labelKeyEntryTitle.pack(side=TOP,anchor=W,pady=5) - entryKey.pack(side=TOP,anchor=W) + 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) + frameTarget.rowconfigure(1,weight=1) + labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W) + self.listBindings.grid(row=1,column=0,sticky=NSEW) + scrollTargetY.grid(row=1,column=1,sticky=NS) + scrollTargetX.grid(row=2,column=0,sticky=EW) #frameKeySets labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5) labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5) @@ -432,7 +428,6 @@ class ConfigDialog(Toplevel): value=1,command=self.SetKeysType,text='in a Separate Process') #frameWinSize labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size') - buttonWinSizeSet=Button(frameWinSize,text='Set to current window size') labelWinWidthTitle=Label(frameWinSize,text='Width') entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth, width=3) @@ -467,12 +462,11 @@ class ConfigDialog(Toplevel): radioRunInternal.pack(side=LEFT,anchor=W,padx=5,pady=5) radioRunSeparate.pack(side=LEFT,anchor=W,padx=5,pady=5) #frameWinSize - labelWinSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5) - buttonWinSizeSet.pack(side=LEFT,anchor=W,padx=5,pady=5) - labelWinWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) - entryWinWidth.pack(side=LEFT,anchor=W,padx=5,pady=5) - labelWinHeightTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) - entryWinHeight.pack(side=LEFT,anchor=W,padx=5,pady=5) + labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) + entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5) + labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5) + entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5) + labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5) #frameExt labelExtTitle.pack(side=TOP,anchor=W,padx=5,pady=5) frameExtSet.pack(side=RIGHT,padx=5,pady=5,fill=Y) @@ -588,7 +582,31 @@ class ConfigDialog(Toplevel): itemList=idleConf.GetSectionList('default','keys') self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0]) self.SetKeysType() - ##load keyset element option menu + ##load keyset element list + keySet=idleConf.GetKeys(currentOption) + bindNames=keySet.keys() + bindNames.sort() + for bindName in bindNames: + key=string.join(keySet[bindName]) #make key(s) into a string + bindName=bindName[2:-2] #trim off the angle brackets + self.listBindings.insert(END, bindName+' - '+key) + + def GetNewKeys(self): + listIndex=self.listBindings.index(ANCHOR) + binding=self.listBindings.get(listIndex) + bindName=binding.split()[0] #first part, up to first space + newKeys=GetKeysDialog(self,'Get New Keys',bindName) + print newKeys.result + if newKeys.result: #new keys were specified + self.listBindings.delete(listIndex) + self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) + self.listBindings.select_set(listIndex) + + def LoadGeneralCfg(self): + #initial window size + self.winWidth.set(idleConf.GetOption('main','EditorWindow','width')) + self.winHeight.set(idleConf.GetOption('main','EditorWindow','height')) + def LoadConfigs(self): """ @@ -604,6 +622,7 @@ class ConfigDialog(Toplevel): self.LoadKeyCfg() ### help page ### general page + self.LoadGeneralCfg() def SaveConfigs(self): """ diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py index ba18457..b78ae75 100644 --- a/Lib/idlelib/configHandler.py +++ b/Lib/idlelib/configHandler.py @@ -257,7 +257,6 @@ class IdleConf: '<>': [''], '<>': [''], '<>': [''], - '<>': [''], '<>': [''], '<>': [''], '<>': [''], diff --git a/Lib/idlelib/dynOptionMenuWidget.py b/Lib/idlelib/dynOptionMenuWidget.py index bc716ed..d614a3e 100644 --- a/Lib/idlelib/dynOptionMenuWidget.py +++ b/Lib/idlelib/dynOptionMenuWidget.py @@ -1,9 +1,3 @@ -##---------------------------------------------------------------------------## -## -## idle - modified OptionMenu widget -## elguavas -## -##---------------------------------------------------------------------------## """ OptionMenu widget modified to allow dynamic menu reconfiguration and setting of highlightthickness diff --git a/Lib/idlelib/keybindingDialog.py b/Lib/idlelib/keybindingDialog.py index f0580cd..ef0fda9 100644 --- a/Lib/idlelib/keybindingDialog.py +++ b/Lib/idlelib/keybindingDialog.py @@ -5,8 +5,8 @@ from Tkinter import * import tkMessageBox import string, os -class GetAccelDialog(Toplevel): - def __init__(self,parent,title,action,keySequenceStr): +class GetKeysDialog(Toplevel): + def __init__(self,parent,title,action): Toplevel.__init__(self, parent) self.configure(borderwidth=5) self.resizable(height=FALSE,width=FALSE) @@ -16,7 +16,7 @@ class GetAccelDialog(Toplevel): self.protocol("WM_DELETE_WINDOW", self.Cancel) self.parent = parent self.action=action - self.keySequenceStr=keySequenceStr + self.result='' self.keyString=StringVar(self) self.keyString.set('') self.keyCtrl=StringVar(self) @@ -107,13 +107,12 @@ class GetAccelDialog(Toplevel): command=self.listKeysFinal.yview) self.listKeysFinal.config(yscrollcommand=scrollKeysFinal.set) scrollKeysFinal.grid(row=0,column=5,rowspan=4,sticky=NS) - self.buttonAddNew=Button(self.frameControlsBasic, - text='Accept Key Sequence',width=25,command=None) - self.buttonAddNew.grid(row=2,column=0,columnspan=4) - self.buttonClearLast=Button(self.frameControlsBasic, - text='Clear Last Key Sequence',width=25, - command=self.ClearLastKeySeq) - self.buttonClearLast.grid(row=3,column=0,columnspan=4) +# self.buttonAddNew=Button(self.frameControlsBasic, +# text='Accept Key Sequence',width=25,command=None) +# self.buttonAddNew.grid(row=2,column=0,columnspan=4) + self.buttonClear=Button(self.frameControlsBasic, + text='Clear Keys',command=self.ClearKeySeq) + self.buttonClear.grid(row=2,column=0,columnspan=4) labelTitleAdvanced = Label(self.frameKeySeqAdvanced,justify=LEFT, text="Enter new binding(s) for '"+self.action+"' :\n"+ "(will not be checked for validity)") @@ -133,11 +132,13 @@ class GetAccelDialog(Toplevel): def ToggleLevel(self): if self.buttonLevel.cget('text')[:8]=='Advanced': + self.ClearKeySeq() self.buttonLevel.config(text='<< Basic Key Binding Entry') self.frameKeySeqAdvanced.lift() self.frameHelpAdvanced.lift() self.entryKeysAdvanced.focus_set() else: + self.ClearKeySeq() self.buttonLevel.config(text='Advanced Key Binding Entry >>') self.frameKeySeqBasic.lift() self.frameControlsBasic.lift() @@ -147,8 +148,7 @@ class GetAccelDialog(Toplevel): def BuildKeyString(self): keyList=[] - modifiers=self.GetModifiers(self.keyCtrl.get(),self.keyAlt.get(), - self.keyShift.get()) + modifiers=self.GetModifiers() finalKey=self.listKeysFinal.get(ANCHOR) if modifiers: modifiers[0]='<'+modifiers[0] keyList=keyList+modifiers @@ -160,39 +160,67 @@ class GetAccelDialog(Toplevel): keyStr=string.join(keyList,'-') self.keyString.set(keyStr) - - -# if (finalKey not in self.functionKeys) and (not modifiers): -# tkMessageBox.showerror(title='Key Binding Error', -# message='At least one modifier key should be specified.') -# return - - def GetModifiers(self,ctrl,alt,shift): + def GetModifiers(self): modList=[] + ctrl=self.keyCtrl.get() + alt=self.keyAlt.get() + shift=self.keyShift.get() if ctrl: modList.append(ctrl) if alt: modList.append(alt) if shift: modList.append(shift) return modList - def ClearLastKeySeq(self): - pass + def ClearKeySeq(self): + self.listKeysFinal.select_clear(0,END) + self.listKeysFinal.yview(MOVETO, '0.0') + self.keyCtrl.set('') + self.keyAlt.set(''), + self.keyShift.set('') + self.keyString.set('') def LoadFinalKeyList(self): - #make a tuple of most of the useful common 'final' keys + #these tuples are also available for use in validity checks self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') - keys=(tuple(string.ascii_lowercase+string.digits+ - '~!@#%^&*()_-+={}[]|;:,./?')+('tab','space')+self.functionKeys) + self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,./?') + self.specialKeys=('tab','space') + self.alphanumKeys=tuple(string.ascii_lowercase+string.digits) + #make a tuple of most of the useful common 'final' keys + keys=(self.alphanumKeys+self.punctuationKeys+self.specialKeys+ + self.functionKeys) apply(self.listKeysFinal.insert, (END,)+keys) + def KeysOk(self): + #simple validity check + keysOk=1 + keys=self.keyString.get() + keys.strip() + finalKey=self.listKeysFinal.get(ANCHOR) + modifiers=self.GetModifiers() + if not keys: #no keys specified + tkMessageBox.showerror(title='Key Sequence Error', + message='No keys specified.') + keysOk=0 + elif not keys.endswith('>'): #no final key specified + tkMessageBox.showerror(title='Key Sequence Error', + message='No final key specified.') + keysOk=0 + elif (modifiers==['Shift']) and (finalKey not in self.functionKeys): + #shift alone is only a useful modifier with a function key + tkMessageBox.showerror(title='Key Sequence Error', + message='Shift alone is only a useful modifier '+ + 'when used with a function key.') + keysOk=0 + return keysOk + def Ok(self, event=None): if self.KeysOk(): - self.keySequenceStr=self.keyDisplay.get() + self.result=self.keyString.get() self.destroy() - + def Cancel(self, event=None): - self.keySequenceStr='' + self.result='' self.destroy() if __name__ == '__main__': @@ -202,7 +230,7 @@ if __name__ == '__main__': #import aboutDialog #aboutDialog.AboutDialog(root,'About') keySeq='' - GetAccelDialog(root,'Get Keys','find-again',keySeq) - print keySeq + dlg=GetKeysDialog(root,'Get Keys','find-again') + print dlg.result Button(root,text='Dialog',command=run).pack() root.mainloop() -- cgit v0.12