summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib
diff options
context:
space:
mode:
authorSteven M. Gava <elguavas@python.net>2002-01-19 10:33:21 (GMT)
committerSteven M. Gava <elguavas@python.net>2002-01-19 10:33:21 (GMT)
commitc628a06c709dcf0d96ad55a475a5a1318d06dba4 (patch)
tree6a08e02872fbe4f059def12dde386a554400fb2c /Lib/idlelib
parent68d7336cb06ce84c01ee4307cd9fd23d5b273519 (diff)
downloadcpython-c628a06c709dcf0d96ad55a475a5a1318d06dba4.zip
cpython-c628a06c709dcf0d96ad55a475a5a1318d06dba4.tar.gz
cpython-c628a06c709dcf0d96ad55a475a5a1318d06dba4.tar.bz2
further work on keybinding configuration
Diffstat (limited to 'Lib/idlelib')
-rw-r--r--Lib/idlelib/configDialog.py5
-rw-r--r--Lib/idlelib/configHandler.py101
-rw-r--r--Lib/idlelib/keybindingDialog.py32
3 files changed, 123 insertions, 15 deletions
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index 2b13391..42df594 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -583,7 +583,7 @@ class ConfigDialog(Toplevel):
self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
self.SetKeysType()
##load keyset element list
- keySet=idleConf.GetKeys(currentOption)
+ keySet=idleConf.GetCurrentKeySet()
bindNames=keySet.keys()
bindNames.sort()
for bindName in bindNames:
@@ -595,8 +595,7 @@ class ConfigDialog(Toplevel):
listIndex=self.listBindings.index(ANCHOR)
binding=self.listBindings.get(listIndex)
bindName=binding.split()[0] #first part, up to first space
- currentKeySet=idleConf.CurrentKeys()
- currentKeySequences=idleConf.GetKeys(currentKeySet).values()
+ currentKeySequences=idleConf.GetCurrentKeySet().values()
newKeys=GetKeysDialog(self,'Get New Keys',bindName,currentKeySequences)
if newKeys.result: #new keys were specified
self.listBindings.delete(listIndex)
diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py
index b78ae75..34be897 100644
--- a/Lib/idlelib/configHandler.py
+++ b/Lib/idlelib/configHandler.py
@@ -153,7 +153,6 @@ class IdleConf:
cfgParser=self.defaultCfg[configType]
else:
raise 'Invalid configSet specified'
-
return cfgParser.sections()
def GetHighlight(self, theme, element, fgBg=None):
@@ -215,8 +214,10 @@ class IdleConf:
Gets a list of all idle extensions declared in the config files.
activeOnly - boolean, if true only return active (enabled) extensions
"""
- extns=self.GetSectionList('default','extensions')
- userExtns=self.GetSectionList('user','extensions')
+ extns=self.RemoveKeyBindNames(
+ self.GetSectionList('default','extensions'))
+ userExtns=self.RemoveKeyBindNames(
+ self.GetSectionList('user','extensions'))
for extn in userExtns:
if extn not in extns: #user has added own extension
extns.append(extn)
@@ -230,6 +231,75 @@ class IdleConf:
else:
return extns
+ def RemoveKeyBindNames(self,extnNameList):
+ #get rid of keybinding section names
+ names=extnNameList
+ kbNameIndicies=[]
+ for name in names:
+ if name.endswith('_bindings') or name.endswith('_cfgBindings'):
+ kbNameIndicies.append(names.index(name))
+ kbNameIndicies.sort()
+ kbNameIndicies.reverse()
+ for index in kbNameIndicies: #delete each keybinding section name
+ del(names[index])
+ return names
+
+ def GetExtensionKeys(self,extensionName):
+ """
+ returns a dictionary of the configurable keybindings for a particular
+ extension,as they exist in the dictionary returned by GetCurrentKeySet;
+ that is, where previously re-used bindings are disabled.
+ """
+ keysName=extensionName+'_cfgBindings'
+ activeKeys=self.GetCurrentKeySet()
+ extKeys={}
+ if self.defaultCfg['extensions'].has_section(keysName):
+ eventNames=self.defaultCfg['extensions'].GetOptionList(keysName)
+ for eventName in eventNames:
+ event='<<'+eventName+'>>'
+ binding=activeKeys[event]
+ extKeys[event]=binding
+ return extKeys
+
+ def __GetRawExtensionKeys(self,extensionName):
+ """
+ returns a dictionary of the configurable keybindings for a particular
+ extension, as defined in the configuration files, or an empty dictionary
+ if no bindings are found
+ """
+ keysName=extensionName+'_cfgBindings'
+ extKeys={}
+ if self.defaultCfg['extensions'].has_section(keysName):
+ eventNames=self.defaultCfg['extensions'].GetOptionList(keysName)
+ for eventName in eventNames:
+ binding=self.GetOption('extensions',keysName,
+ eventName,default='').split()
+ event='<<'+eventName+'>>'
+ extKeys[event]=binding
+ return extKeys
+
+ def GetExtensionBindings(self,extensionName):
+ """
+ Returns a dictionary of all the event bindings for a particular
+ extension. The configurable keybindings are returned as they exist in
+ the dictionary returned by GetCurrentKeySet; that is, where re-used
+ keybindings are disabled.
+ """
+ bindsName=extensionName+'_bindings'
+ extBinds=self.GetExtensionKeys(extensionName)
+ #add the non-configurable bindings
+ if self.defaultCfg['extensions'].has_section(bindsName):
+ eventNames=self.defaultCfg['extensions'].GetOptionList(bindsName)
+ for eventName in eventNames:
+ binding=self.GetOption('extensions',bindsName,
+ eventName,default='').split()
+ event='<<'+eventName+'>>'
+ extBinds[event]=binding
+
+ return extBinds
+
+
+
def GetKeyBinding(self, keySetName, eventStr):
"""
returns the keybinding for a specific event.
@@ -241,12 +311,31 @@ class IdleConf:
binding=self.GetOption('keys',keySetName,eventName,default='').split()
return binding
- def GetKeys(self, keySetName=None):
+ def GetCurrentKeySet(self):
+ """
+ Returns a dictionary of: all current core keybindings, plus the
+ keybindings for all currently active extensions. If a binding defined
+ in an extension is already in use, that binding is disabled.
+ """
+ currentKeySet=self.GetCoreKeys(keySetName=self.CurrentKeys())
+ activeExtns=self.GetExtensions(activeOnly=1)
+ for extn in activeExtns:
+ extKeys=self.__GetRawExtensionKeys(extn)
+ if extKeys: #the extension defines keybindings
+ for event in extKeys.keys():
+ if extKeys[event] in currentKeySet.values():
+ #the binding is already in use
+ extKeys[event]='' #disable this binding
+ currentKeySet[event]=extKeys[event] #add binding
+ return currentKeySet
+
+ def GetCoreKeys(self, keySetName=None):
"""
- returns the requested set of keybindings, with fallbacks if required.
+ returns the requested set of core keybindings, with fallbacks if
+ required.
"""
#keybindings loaded from the config file(s) are loaded _over_ these
- #defaults, so if there is a problem getting any binding there will
+ #defaults, so if there is a problem getting any core binding there will
#be an 'ultimate last resort fallback' to the CUA-ish bindings
#defined here.
keyBindings={
diff --git a/Lib/idlelib/keybindingDialog.py b/Lib/idlelib/keybindingDialog.py
index 0958578..c510257 100644
--- a/Lib/idlelib/keybindingDialog.py
+++ b/Lib/idlelib/keybindingDialog.py
@@ -161,9 +161,10 @@ class GetKeysDialog(Toplevel):
keyList=keyList+modifiers
if finalKey:
if (not modifiers) and (finalKey in self.functionKeys):
- finalKey='<'+finalKey
+ finalKey='<'+self.TranslateKey(finalKey)
+ else:
+ finalKey=self.TranslateKey(finalKey)
keyList.append(finalKey+'>')
-
keyStr=string.join(keyList,'-')
self.keyString.set(keyStr)
@@ -189,15 +190,34 @@ class GetKeysDialog(Toplevel):
#these tuples are also available for use in validity checks
self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9',
'F10','F11','F12')
- self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,./?')
- self.specialKeys=('tab','space')
self.alphanumKeys=tuple(string.ascii_lowercase+string.digits)
+ self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,.<>/?')
+ self.whitespaceKeys=('Tab','Space','Return')
+ self.editKeys=('BackSpace','Delete','Insert')
+ self.moveKeys=('Home','End','Page Up','Page Down','Left Arrow',
+ 'Right Arrow','Up Arrow','Down Arrow')
#make a tuple of most of the useful common 'final' keys
- keys=(self.alphanumKeys+self.punctuationKeys+self.specialKeys+
- self.functionKeys)
+ keys=(self.alphanumKeys+self.punctuationKeys+self.functionKeys+
+ self.whitespaceKeys+self.editKeys+self.moveKeys)
apply(self.listKeysFinal.insert,
(END,)+keys)
+ def TranslateKey(self,key):
+ #translate from key list value to tkinter key-id
+ translateDict={'~':'asciitilde','!':'exclam','@':'at','#':'numbersign',
+ '%':'percent','^':'asciicircum','&':'ampersand','*':'asterisk',
+ '(':'parenleft',')':'parenright','_':'underscore','-':'minus',
+ '+':'plus','=':'equal','{':'braceleft','}':'braceright',
+ '[':'bracketleft',']':'bracketright','|':'bar',';':'semicolon',
+ ':':'colon',',':'comma','.':'period','<':'less','>':'greater',
+ '/':'slash','?':'question','Page Up':'Prior','Page Down':'Next',
+ 'Left Arrow':'Left','Right Arrow':'Right','Up Arrow':'Up',
+ 'Down Arrow': 'Down'}
+ if key in translateDict.keys():
+ key=translateDict[key]
+ key='Key-'+key
+ return key
+
def Ok(self, event=None):
if self.KeysOk():
self.result=self.keyString.get()