diff options
author | jblum | 2008-11-26 23:51:43 +0000 |
---|---|---|
committer | jblum | 2008-11-26 23:51:43 +0000 |
commit | 715009be8e02990af5497edb251cce7839123a06 (patch) | |
tree | 67b1a0fb8d7ac8cf9a6b679bf407d5d26c439099 /grc/src | |
parent | af26023ef8414044a4229688c2ad5853e3eb3cb6 (diff) | |
download | gnuradio-715009be8e02990af5497edb251cce7839123a06.tar.gz gnuradio-715009be8e02990af5497edb251cce7839123a06.tar.bz2 gnuradio-715009be8e02990af5497edb251cce7839123a06.zip |
switched hotkey handling to gtk accelerators
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10075 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'grc/src')
-rw-r--r-- | grc/src/gui/ActionHandler.py | 95 | ||||
-rw-r--r-- | grc/src/gui/Actions.py | 50 | ||||
-rw-r--r-- | grc/src/gui/Bars.py | 1 | ||||
-rw-r--r-- | grc/src/gui/Dialogs.py | 40 | ||||
-rw-r--r-- | grc/src/gui/MainWindow.py | 3 |
5 files changed, 68 insertions, 121 deletions
diff --git a/grc/src/gui/ActionHandler.py b/grc/src/gui/ActionHandler.py index 66b652d25..cb31b3756 100644 --- a/grc/src/gui/ActionHandler.py +++ b/grc/src/gui/ActionHandler.py @@ -32,7 +32,7 @@ from .. utils import ParseXML import random from .. platforms.gui.Platform import Platform from MainWindow import MainWindow -from Dialogs import PreferencesDialog, AboutDialog, HotKeysDialog +from Dialogs import PreferencesDialog, AboutDialog from FileDialogs import OpenFlowGraphFileDialog, SaveFlowGraphFileDialog, SaveImageFileDialog gobject.threads_init() @@ -56,7 +56,7 @@ class ActionHandler: #setup icon using icon theme try: gtk.window_set_default_icon(gtk.IconTheme().load_icon('gnuradio-grc', 256, 0)) except: pass - for action in Actions.ACTIONS_LIST: action.connect('activate', self._handle_actions) + for action in Actions.get_all_actions(): action.connect('activate', self._handle_actions) #setup the main window self.main_window = MainWindow(self.handle_states, platform) self.main_window.connect('delete_event', self._quit) @@ -77,72 +77,26 @@ class ActionHandler: """ Handle key presses from the keyboard. Translate key combos into actions. - Key combinations that do not include special keys, such as ctrl or Fcn*, - Also, require that the flow graph has mouse focus when choosing to handle keys. - @return true if the flow graph is in active use + @return false to let the accelerators handle the key action """ - keyname = gtk.gdk.keyval_name(event.keyval) - ctrl = event.state & gtk.gdk.CONTROL_MASK - alt = event.state & gtk.gdk.MOD1_MASK - shift = event.state & gtk.gdk.SHIFT_MASK - #################### save/open/new/close ############################### - if ctrl and keyname == 's': - self.handle_states(Actions.FLOW_GRAPH_SAVE) - elif ctrl and keyname == 'o': - self.handle_states(Actions.FLOW_GRAPH_OPEN) - elif ctrl and keyname == 'n': - self.handle_states(Actions.FLOW_GRAPH_NEW) - elif ctrl and keyname == 'q': - self.handle_states(Actions.FLOW_GRAPH_CLOSE) - #################### Cut/Copy/Paste ############################### - elif self.get_focus_flag() and ctrl and keyname == 'x': #mouse focus - self.handle_states(Actions.BLOCK_CUT) - elif self.get_focus_flag() and ctrl and keyname == 'c': #mouse focus - self.handle_states(Actions.BLOCK_COPY) - elif self.get_focus_flag() and ctrl and keyname == 'v': #mouse focus - self.handle_states(Actions.BLOCK_PASTE) - #################### Undo/Redo ############################### - elif ctrl and keyname == 'z': - self.handle_states(Actions.FLOW_GRAPH_UNDO) - elif ctrl and keyname == 'y': - self.handle_states(Actions.FLOW_GRAPH_REDO) - #################### Delete ############################### - elif self.get_focus_flag() and keyname == 'Delete': #mouse focus - self.handle_states(Actions.ELEMENT_DELETE) - #################### Params ############################### - elif self.get_focus_flag() and keyname == 'Return': #mouse focus - self.handle_states(Actions.BLOCK_PARAM_MODIFY) - #################### Rotate ############################### - elif self.get_focus_flag() and keyname == 'Right': #mouse focus - self.handle_states(Actions.BLOCK_ROTATE_RIGHT) - elif self.get_focus_flag() and keyname == 'Left': #mouse focus - self.handle_states(Actions.BLOCK_ROTATE_LEFT) - #################### Enable/Disable ############################### - elif self.get_focus_flag() and keyname == 'e': #mouse focus - self.handle_states(Actions.BLOCK_ENABLE) - elif self.get_focus_flag() and keyname == 'd': #mouse focus - self.handle_states(Actions.BLOCK_DISABLE) - #################### Data Type ############################### - elif self.get_focus_flag() and keyname == 'Down': #mouse focus - self.handle_states(Actions.BLOCK_INC_TYPE) - elif self.get_focus_flag() and keyname == 'Up': #mouse focus - self.handle_states(Actions.BLOCK_DEC_TYPE) - #################### Port Controllers ############################### - elif self.get_focus_flag() and keyname in ('equal','plus', 'KP_Add'): #mouse focus - self.handle_states(Actions.PORT_CONTROLLER_INC) - elif self.get_focus_flag() and keyname in ('minus', 'KP_Subtract'): #mouse focus - self.handle_states(Actions.PORT_CONTROLLER_DEC) - #################### Gen/Exec/Stop/Print ############################### - elif keyname == 'F5': - self.handle_states(Actions.FLOW_GRAPH_GEN) - elif keyname == 'F6': - self.handle_states(Actions.FLOW_GRAPH_EXEC) - elif keyname == 'F7': - self.handle_states(Actions.FLOW_GRAPH_KILL) - elif keyname == 'Print': - self.handle_states(Actions.FLOW_GRAPH_SCREEN_CAPTURE) - #propagate this if the fg is not in focus or nothing is selected - return self.get_focus_flag() and self.get_flow_graph().is_selected() + if self.get_focus_flag() and self.get_flow_graph().is_selected(): + try: + self.handle_states({ + 'Left': Actions.BLOCK_ROTATE_LEFT, + 'Right': Actions.BLOCK_ROTATE_RIGHT, + 'Up': Actions.BLOCK_DEC_TYPE, + 'Down': Actions.BLOCK_INC_TYPE, + 'equal': Actions.PORT_CONTROLLER_INC, + 'plus': Actions.PORT_CONTROLLER_INC, + 'KP_Add': Actions.PORT_CONTROLLER_INC, + 'minus': Actions.PORT_CONTROLLER_DEC, + 'KP_Subtract': Actions.PORT_CONTROLLER_DEC, + }[gtk.gdk.keyval_name(event.keyval)]) + return True + #focus + selection: always return false for accelerator to handle + except: return False + #no focus + selection: only allow accelerator to handle when a mod is used + return not event.state def _quit(self, window, event): """ @@ -177,14 +131,13 @@ class ActionHandler: # Initalize/Quit ################################################## if state == Actions.APPLICATION_INITIALIZE: - for action in Actions.ACTIONS_LIST: action.set_sensitive(False) #set all actions disabled + for action in Actions.get_all_actions(): action.set_sensitive(False) #set all actions disabled # enable a select few actions for action in ( Actions.APPLICATION_QUIT, Actions.FLOW_GRAPH_NEW, Actions.FLOW_GRAPH_OPEN, Actions.FLOW_GRAPH_SAVE_AS, Actions.FLOW_GRAPH_CLOSE, Actions.ABOUT_WINDOW_DISPLAY, - Actions.HOTKEYS_WINDOW_DISPLAY, Actions.PREFS_WINDOW_DISPLAY, - Actions.FLOW_GRAPH_SCREEN_CAPTURE, + Actions.PREFS_WINDOW_DISPLAY, Actions.FLOW_GRAPH_SCREEN_CAPTURE, ): Actions.get_action_from_name(action).set_sensitive(True) if not self.init_file_paths and Preferences.restore_files(): self.init_file_paths = Preferences.files_open() @@ -288,8 +241,6 @@ class ActionHandler: self.get_flow_graph().update() elif state == Actions.ABOUT_WINDOW_DISPLAY: AboutDialog() - elif state == Actions.HOTKEYS_WINDOW_DISPLAY: - HotKeysDialog() ################################################## # Param Modifications ################################################## diff --git a/grc/src/gui/Actions.py b/grc/src/gui/Actions.py index ddd2573a8..818995a32 100644 --- a/grc/src/gui/Actions.py +++ b/grc/src/gui/Actions.py @@ -22,7 +22,7 @@ pygtk.require('2.0') import gtk ###################################################################################################### -# States +# Action Names ###################################################################################################### APPLICATION_INITIALIZE = 'app init' APPLICATION_QUIT = 'app quit' @@ -56,13 +56,39 @@ FLOW_GRAPH_EXEC = 'flow graph exec' FLOW_GRAPH_KILL = 'flow graph kill' FLOW_GRAPH_SCREEN_CAPTURE = 'flow graph screen capture' ABOUT_WINDOW_DISPLAY = 'about window display' -HOTKEYS_WINDOW_DISPLAY = 'hotkeys window display' PREFS_WINDOW_DISPLAY = 'prefs window display' ###################################################################################################### +# Action Key Map +###################################################################################################### +_actions_key_map = { + #action name: (key name, mask) + FLOW_GRAPH_NEW: ('n', gtk.gdk.CONTROL_MASK), + FLOW_GRAPH_OPEN: ('o', gtk.gdk.CONTROL_MASK), + FLOW_GRAPH_SAVE: ('s', gtk.gdk.CONTROL_MASK), + FLOW_GRAPH_CLOSE: ('w', gtk.gdk.CONTROL_MASK), + APPLICATION_QUIT: ('q', gtk.gdk.CONTROL_MASK), + FLOW_GRAPH_UNDO: ('z', gtk.gdk.CONTROL_MASK), + FLOW_GRAPH_REDO: ('y', gtk.gdk.CONTROL_MASK), + ELEMENT_DELETE: ('Delete', 0), + BLOCK_ROTATE_LEFT: ('Left', 0), + BLOCK_ROTATE_RIGHT: ('Right', 0), + BLOCK_PARAM_MODIFY: ('Return', 0), + BLOCK_ENABLE: ('e', 0), + BLOCK_DISABLE: ('d', 0), + BLOCK_CUT: ('x', gtk.gdk.CONTROL_MASK), + BLOCK_COPY: ('c', gtk.gdk.CONTROL_MASK), + BLOCK_PASTE: ('v', gtk.gdk.CONTROL_MASK), + FLOW_GRAPH_GEN: ('F5', 0), + FLOW_GRAPH_EXEC: ('F6', 0), + FLOW_GRAPH_KILL: ('F7', 0), + FLOW_GRAPH_SCREEN_CAPTURE: ('Print', 0), +} + +###################################################################################################### # Actions ###################################################################################################### -ACTIONS_LIST = ( +_actions_list = ( gtk.Action(FLOW_GRAPH_NEW, '_New', 'Create a new flow graph', 'gtk-new'), gtk.Action(FLOW_GRAPH_OPEN, '_Open', 'Open an existing flow graph', 'gtk-open'), gtk.Action(FLOW_GRAPH_SAVE, '_Save', 'Save the current flow graph', 'gtk-save'), @@ -82,15 +108,14 @@ ACTIONS_LIST = ( gtk.Action(BLOCK_PASTE, '_Paste', 'Paste', 'gtk-paste'), gtk.Action(PREFS_WINDOW_DISPLAY, '_Preferences', 'Configure Preferences', 'gtk-preferences'), gtk.Action(ABOUT_WINDOW_DISPLAY, '_About', 'About this program', 'gtk-about'), - gtk.Action(HOTKEYS_WINDOW_DISPLAY, '_HotKeys', 'Hot Keys', 'gtk-info'), gtk.Action(FLOW_GRAPH_GEN, '_Generate', 'Generate the flow graph', 'gtk-convert'), gtk.Action(FLOW_GRAPH_EXEC, '_Execute', 'Execute the flow graph', 'gtk-execute'), gtk.Action(FLOW_GRAPH_KILL, '_Kill', 'Kill the flow graph', 'gtk-stop'), gtk.Action(FLOW_GRAPH_SCREEN_CAPTURE, 'S_creen Capture', 'Create a screen capture of the flow graph', 'gtk-print'), ) +def get_all_actions(): return _actions_list -ACTIONS_DICT = dict((action.get_name(), action) for action in ACTIONS_LIST) - +_actions_dict = dict((action.get_name(), action) for action in _actions_list) def get_action_from_name(action_name): """ Retrieve the action from the action list. @@ -99,5 +124,16 @@ def get_action_from_name(action_name): @throw KeyError bad action name @return a gtk action object """ - if ACTIONS_DICT.has_key(action_name): return ACTIONS_DICT[action_name] + if _actions_dict.has_key(action_name): return _actions_dict[action_name] raise KeyError('Action Name: "%s" does not exist'%action_name) + +_accel_group = gtk.AccelGroup() +def get_accel_group(): return _accel_group + +#load the actions key map +#set the accelerator group, and accelerator path +#register the key and mod with the accelerator path +for action_name, (key_name, mod) in _actions_key_map.iteritems(): + get_action_from_name(action_name).set_accel_group(get_accel_group()) + get_action_from_name(action_name).set_accel_path('<main>/'+action_name) + gtk.accel_map_add_entry('<main>/'+action_name, gtk.gdk.keyval_from_name(key_name),mod) diff --git a/grc/src/gui/Bars.py b/grc/src/gui/Bars.py index 915e5abec..1416d4dd5 100644 --- a/grc/src/gui/Bars.py +++ b/grc/src/gui/Bars.py @@ -91,7 +91,6 @@ MENU_BAR_LIST = ( ]), (gtk.Action('Help', '_Help', None, None), [ Actions.ABOUT_WINDOW_DISPLAY, - Actions.HOTKEYS_WINDOW_DISPLAY, ]), ) diff --git a/grc/src/gui/Dialogs.py b/grc/src/gui/Dialogs.py index 5f278e343..995fe4628 100644 --- a/grc/src/gui/Dialogs.py +++ b/grc/src/gui/Dialogs.py @@ -103,43 +103,3 @@ Achilleas Anastasopoulos -> trellis support -----""") self.run() self.destroy() - -class HotKeysDialog(gtk.Dialog): - """Display each action with the associated hotkey.""" - - def __init__(self): - """HotKeysDialog constructor.""" - gtk.Dialog.__init__(self, buttons=('gtk-close', gtk.RESPONSE_CLOSE)) - self.set_title('Hot Keys') - markup = '' - for action, hotkey in ( - ('New Flow Graph', 'Ctrl + n'), - ('Open Flow Graph', 'Ctrl + o'), - ('Save Flow Graph', 'Ctrl + s'), - ('Close Flow Graph', 'Ctrl + q'), - ('Cut Block', 'Ctrl + x'), - ('Copy Block', 'Ctrl + c'), - ('Paste Block', 'Ctrl + v'), - ('Undo Change', 'Ctrl + z'), - ('Redo Change', 'Ctrl + y'), - ('Delete Element', 'Delete'), - ('Modify Parameters', 'Enter'), - ('Rotate Block', 'Right'), - ('Rotate Block', 'Left'), - ('Enable Block', 'e'), - ('Disable Block', 'd'), - ('Modify Data Type', 'Up'), - ('Modify Data Type', 'Down'), - ('Add a Port', '+'), - ('Remove a Port', '-'), - ('Flow Graph Generate', 'F5'), - ('Flow Graph Execute', 'F6'), - ('Flow Graph Kill', 'F7'), - ('Screen Shot', 'PrintScreen'), - ): markup = '%s\n<b>%s:</b>%s'%(markup, action, hotkey.rjust(25-len(action), ' ')) - label = gtk.Label() - label.set_markup('<tt>%s</tt>\n'%markup) #append newline - self.vbox.pack_start(label, False) - self.show_all() - self.run() - self.destroy() diff --git a/grc/src/gui/MainWindow.py b/grc/src/gui/MainWindow.py index ce1eb274e..4c572c446 100644 --- a/grc/src/gui/MainWindow.py +++ b/grc/src/gui/MainWindow.py @@ -22,7 +22,7 @@ from Constants import \ NEW_FLOGRAPH_TITLE, REPORTS_WINDOW_HEIGHT from Actions import \ APPLICATION_QUIT, FLOW_GRAPH_KILL, \ - FLOW_GRAPH_SAVE + FLOW_GRAPH_SAVE, get_accel_group import pygtk pygtk.require('2.0') import gtk @@ -55,6 +55,7 @@ class MainWindow(gtk.Window): hbox = gtk.HBox() self.add(vbox) #create the menu bar and toolbar + self.add_accel_group(get_accel_group()) vbox.pack_start(Bars.MenuBar(), False) vbox.pack_start(Bars.Toolbar(), False) #setup scrolled window |