summaryrefslogtreecommitdiff
path: root/grc/gui/Bars.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/gui/Bars.py')
-rw-r--r--grc/gui/Bars.py124
1 files changed, 93 insertions, 31 deletions
diff --git a/grc/gui/Bars.py b/grc/gui/Bars.py
index 2ab5b2a712..8a04b1c8f7 100644
--- a/grc/gui/Bars.py
+++ b/grc/gui/Bars.py
@@ -1,5 +1,5 @@
"""
-Copyright 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright 2007, 2008, 2009, 2015 Free Software Foundation, Inc.
This file is part of GNU Radio
GNU Radio Companion is free software; you can redistribute it and/or
@@ -26,8 +26,8 @@ from . import Actions
# The list of actions for the toolbar.
TOOLBAR_LIST = (
- Actions.FLOW_GRAPH_NEW,
- Actions.FLOW_GRAPH_OPEN,
+ (Actions.FLOW_GRAPH_NEW, 'flow_graph_new'),
+ (Actions.FLOW_GRAPH_OPEN, 'flow_graph_recent'),
Actions.FLOW_GRAPH_SAVE,
Actions.FLOW_GRAPH_CLOSE,
None,
@@ -64,6 +64,7 @@ MENU_BAR_LIST = (
(gtk.Action('File', '_File', None, None), [
'flow_graph_new',
Actions.FLOW_GRAPH_OPEN,
+ 'flow_graph_recent',
None,
Actions.FLOW_GRAPH_SAVE,
Actions.FLOW_GRAPH_SAVE_AS,
@@ -155,24 +156,90 @@ CONTEXT_MENU_LIST = [
]
-class Toolbar(gtk.Toolbar):
+class SubMenuCreator(object):
+
+ def __init__(self, generate_modes, action_handler_callback):
+ self.generate_modes = generate_modes
+ self.action_handler_callback = action_handler_callback
+ self.submenus = []
+
+ def create_submenu(self, action_tuple, item):
+ func = getattr(self, '_fill_' + action_tuple[1] + "_submenu")
+ self.submenus.append((action_tuple[0], func, item))
+ self.refresh_submenus()
+
+ def refresh_submenus(self):
+ for action, func, item in self.submenus:
+ try:
+ item.set_property("menu", func(action))
+ except TypeError:
+ item.set_property("submenu", func(action))
+ item.set_property('sensitive', True)
+
+ def callback_adaptor(self, item, action_key):
+ action, key = action_key
+ self.action_handler_callback(action, key)
+
+ def _fill_flow_graph_new_submenu(self, action):
+ """Sub menu to create flow-graph with pre-set generate mode"""
+ menu = gtk.Menu()
+ for key, name, default in self.generate_modes:
+ if default:
+ item = Actions.FLOW_GRAPH_NEW.create_menu_item()
+ item.set_label(name)
+ else:
+ item = gtk.MenuItem(name)
+ item.connect('activate', self.callback_adaptor, (action, key))
+ menu.append(item)
+ menu.show_all()
+ return menu
+
+ def _fill_flow_graph_recent_submenu(self, action):
+ """menu showing recent flow-graphs"""
+ import Preferences
+ menu = gtk.Menu()
+ recent_files = Preferences.files_recent()
+ if len(recent_files) > 0:
+ for i, file_name in enumerate(recent_files):
+ item = gtk.MenuItem("%d. %s" % (i+1, file_name))
+ item.connect('activate', self.callback_adaptor,
+ (action, file_name))
+ menu.append(item)
+ menu.show_all()
+ return menu
+ return None
+
+
+class Toolbar(gtk.Toolbar, SubMenuCreator):
"""The gtk toolbar with actions added from the toolbar list."""
- def __init__(self):
+ def __init__(self, generate_modes, action_handler_callback):
"""
Parse the list of action names in the toolbar list.
- Look up the action for each name in the action list and add it to the toolbar.
+ Look up the action for each name in the action list and add it to the
+ toolbar.
"""
gtk.Toolbar.__init__(self)
self.set_style(gtk.TOOLBAR_ICONS)
+ SubMenuCreator.__init__(self, generate_modes, action_handler_callback)
+
for action in TOOLBAR_LIST:
- if action: # add a tool item
+ if isinstance(action, tuple) and isinstance(action[1], str):
+ # create a button with a sub-menu
+ action[0].set_tool_item_type(gtk.MenuToolButton)
+ item = action[0].create_tool_item()
+ self.create_submenu(action, item)
+ self.refresh_submenus()
+
+ elif action is None:
+ item = gtk.SeparatorToolItem()
+
+ else:
+ action.set_tool_item_type(gtk.ToolButton)
item = action.create_tool_item()
# this reset of the tooltip property is required
# (after creating the tool item) for the tooltip to show
action.set_property('tooltip', action.get_property('tooltip'))
- else:
- item = gtk.SeparatorToolItem()
self.add(item)
@@ -202,42 +269,37 @@ class MenuHelperMixin(object):
return main
-class MenuBar(gtk.MenuBar, MenuHelperMixin):
+class MenuBar(gtk.MenuBar, MenuHelperMixin, SubMenuCreator):
"""The gtk menu bar with actions added from the menu bar list."""
def __init__(self, generate_modes, action_handler_callback):
"""
Parse the list of submenus from the menubar list.
For each submenu, get a list of action names.
- Look up the action for each name in the action list and add it to the submenu.
- Add the submenu to the menu bar.
+ Look up the action for each name in the action list and add it to the
+ submenu. Add the submenu to the menu bar.
"""
gtk.MenuBar.__init__(self)
- self.generate_modes = generate_modes
- self.action_handler_callback = action_handler_callback
+ SubMenuCreator.__init__(self, generate_modes, action_handler_callback)
for main_action, actions in MENU_BAR_LIST:
self.append(self._make_sub_menu(main_action, actions))
def create_flow_graph_new(self):
- """Sub menu to create flow-graph with pre-set generate mode"""
-
- def callback_adaptor(item, key):
- """Sets original FLOW_GRAPH_NEW action as source"""
- self.action_handler_callback(Actions.FLOW_GRAPH_NEW, key)
-
- sub_menu = gtk.Menu()
- for key, name, default in self.generate_modes:
- if default:
- item = Actions.FLOW_GRAPH_NEW.create_menu_item()
- item.set_label(name)
- else:
- item = gtk.MenuItem(name)
- item.connect('activate', callback_adaptor, key)
- sub_menu.append(item)
- sub_menu.show_all()
main = gtk.ImageMenuItem(gtk.STOCK_NEW)
main.set_label(Actions.FLOW_GRAPH_NEW.get_label())
- main.set_submenu(sub_menu)
+ func = self._fill_flow_graph_new_submenu
+ self.submenus.append((Actions.FLOW_GRAPH_NEW, func, main))
+ self.refresh_submenus()
+ return main
+
+ def create_flow_graph_recent(self):
+ main = gtk.ImageMenuItem(gtk.STOCK_OPEN)
+ main.set_label(Actions.FLOW_GRAPH_OPEN_RECENT.get_label())
+ func = self._fill_flow_graph_recent_submenu
+ self.submenus.append((Actions.FLOW_GRAPH_OPEN, func, main))
+ self.refresh_submenus()
+ if main.get_submenu() is None:
+ main.set_property('sensitive', False)
return main