class MainMachine(object): ui = '''<ui> <menubar name="MenuBar"> <menu action="File"> <menuitem action="Quit"/> </menu> <menu action="Components"> </menu> </menubar> <toolbar name="Toolbar"> <placeholder name="Components"> </placeholder> <separator/> <placeholder name="Common Actions"> </placeholder> <separator/> <placeholder name="Additional Actions"> </placeholder> <separator/> <toolitem action="Quit"/> </toolbar> </ui>''' component_ui = '''<ui> <menubar name="MenuBar"> <menu action="Components"> <menuitem action="%s"/> </menu> </menubar> <toolbar name="Toolbar"> <placeholder name="Components"> <toolitem action="%s"/> </placeholder> </toolbar> </ui>''' common_action_ui = '''<ui> <menubar name="MenuBar"> <menu action="Components"> </menu> </menubar> <toolbar name="Toolbar"> <placeholder name="Common Actions"> <toolitem action="%s"/> </placeholder> </toolbar> </ui>''' def __init__(self): self.components = get_components() self.w = gtk.Window() self.w.connect('destroy', self.quit_cb) self.w.set_size_request(700, 600) vbox = gtk.VBox(False, 0) # Create a UIManager instance self.uimanager = gtk.UIManager() self.merge_id = 0 # Add the accelerator group to the toplevel window accelgroup = self.uimanager.get_accel_group() self.w.add_accel_group(accelgroup) # Create an ActionGroup self.actiongroup = gtk.ActionGroup('MMUIManager') # Create actions self.actiongroup.add_actions([('Quit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', self.quit_cb), ('File', None, '_File'), ('Components', None, '_Components')]) self.actiongroup.get_action('Quit').set_property( 'short-label', '_Quit') # Add the actiongroup to the uimanager self.uimanager.insert_action_group(self.actiongroup, 0) # Add a UI description self.uimanager.add_ui_from_string(self.ui) # Create a MenuBar menubar = self.uimanager.get_widget('/MenuBar') vbox.pack_start(menubar, False) # Create a Toolbar toolbar = self.uimanager.get_widget('/Toolbar') vbox.pack_start(toolbar, False) self.new_component_id = 0 for component_name, component_class in self.components.items(): self.actiongroup.add_actions([ (component_name, gtk.STOCK_NEW, '_' + component_name, '<Control>%s' % component_name[0], component_class.description, self.start_component_cb) ]) self.uimanager.add_ui_from_string(self.component_ui % (component_name, component_name)) self.notebook = NotebookWithCloseButtonOnTabs() self.notebook.set_scrollable(True) self.notebook.set_property('homogeneous', True) self.notebook.connect('switch-page', self.switch_page) # self.notebook.connect('page-added', self.on_page_added) vbox.pack_start(self.notebook, True, True, 0) self.w.add(vbox) self.w.show_all() gtk.main() def new_tab(self, component): child = MMMainFrame(component) child.show_all() child.searchform.advancedbox.hide() #self.w.set_default(child.searchform.start_button) #FIXME: doesn't work # TODO: change tab label according to what user types in search tab_label = gtk.Label(component.name) tab_label.show() nbpages = self.notebook.get_n_pages() self.notebook.append_page(child, tab_label) self.notebook.set_current_page(nbpages) def start_component_cb(self, action): component = self.components[action.get_name()]() self.new_component_id += 1 component.id = self.new_component_id self.new_tab(component) if component.has_additional_actions: logging.debug('Loading additional actions for %s component' % component.name) component.set_additional_actions(self.actiongroup) current_searchform = self.notebook.get_nth_page( self.notebook.get_current_page()).searchform self.actiongroup.add_toggle_actions([ ('ToggleAdvancedBox%i' % component.id, gtk.STOCK_PREFERENCES, '_Advanced options', '<Control>a', 'Show advanced options', current_searchform.toggle_show_advancedbox) ]) # def on_page_added(self, notebook, child, page_num): # pass def switch_page(self, notebook, page, page_num): active_component = notebook.get_nth_page(page_num).component logging.debug('Selecting page %i (%s)' % (page_num, active_component.name)) # remove any previous left addictional actions if self.merge_id: self.uimanager.remove_ui(self.merge_id) self.merge_id = 0 if active_component.has_additional_actions: # set additional actions if present and common actions # FIXME: common actions should be entirely handled here and not inside each # component self.merge_id = active_component.set_uimanager_for_additional_actions( self.uimanager) else: # set only common actions self.merge_id = self.uimanager.add_ui_from_string( self.common_action_ui % ('ToggleAdvancedBox%i' % active_component.id)) def quit_cb(self, b): gtk.main_quit()
class MainMachine(object): ui = '''<ui> <menubar name="MenuBar"> <menu action="File"> <menuitem action="Quit"/> </menu> <menu action="Components"> </menu> </menubar> <toolbar name="Toolbar"> <placeholder name="Components"> </placeholder> <separator/> <placeholder name="Common Actions"> </placeholder> <separator/> <placeholder name="Additional Actions"> </placeholder> <separator/> <toolitem action="Quit"/> </toolbar> </ui>''' component_ui = '''<ui> <menubar name="MenuBar"> <menu action="Components"> <menuitem action="%s"/> </menu> </menubar> <toolbar name="Toolbar"> <placeholder name="Components"> <toolitem action="%s"/> </placeholder> </toolbar> </ui>''' common_action_ui = '''<ui> <menubar name="MenuBar"> <menu action="Components"> </menu> </menubar> <toolbar name="Toolbar"> <placeholder name="Common Actions"> <toolitem action="%s"/> </placeholder> </toolbar> </ui>''' def __init__(self): self.components = get_components() self.w = gtk.Window() self.w.connect('destroy', self.quit_cb) self.w.set_size_request(700, 600) vbox = gtk.VBox(False, 0) # Create a UIManager instance self.uimanager = gtk.UIManager() self.merge_id = 0 # Add the accelerator group to the toplevel window accelgroup = self.uimanager.get_accel_group() self.w.add_accel_group(accelgroup) # Create an ActionGroup self.actiongroup = gtk.ActionGroup('MMUIManager') # Create actions self.actiongroup.add_actions([('Quit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', self.quit_cb), ('File', None, '_File'), ('Components', None, '_Components')]) self.actiongroup.get_action('Quit').set_property('short-label', '_Quit') # Add the actiongroup to the uimanager self.uimanager.insert_action_group(self.actiongroup, 0) # Add a UI description self.uimanager.add_ui_from_string(self.ui) # Create a MenuBar menubar = self.uimanager.get_widget('/MenuBar') vbox.pack_start(menubar, False) # Create a Toolbar toolbar = self.uimanager.get_widget('/Toolbar') vbox.pack_start(toolbar, False) self.new_component_id = 0 for component_name, component_class in self.components.items(): self.actiongroup.add_actions([(component_name, gtk.STOCK_NEW, '_' + component_name, '<Control>%s' % component_name[0], component_class.description, self.start_component_cb)]) self.uimanager.add_ui_from_string(self.component_ui % (component_name, component_name)) self.notebook = NotebookWithCloseButtonOnTabs() self.notebook.set_scrollable(True) self.notebook.set_property('homogeneous', True) self.notebook.connect('switch-page', self.switch_page) # self.notebook.connect('page-added', self.on_page_added) vbox.pack_start(self.notebook, True, True, 0) self.w.add(vbox) self.w.show_all() gtk.main() def new_tab(self, component): child = MMMainFrame(component) child.show_all() child.searchform.advancedbox.hide() #self.w.set_default(child.searchform.start_button) #FIXME: doesn't work # TODO: change tab label according to what user types in search tab_label = gtk.Label(component.name) tab_label.show() nbpages = self.notebook.get_n_pages() self.notebook.append_page(child, tab_label) self.notebook.set_current_page(nbpages) def start_component_cb(self, action): component = self.components[action.get_name()]() self.new_component_id += 1 component.id = self.new_component_id self.new_tab(component) if component.has_additional_actions: logging.debug('Loading additional actions for %s component' % component.name) component.set_additional_actions(self.actiongroup) current_searchform = self.notebook.get_nth_page(self.notebook.get_current_page()).searchform self.actiongroup.add_toggle_actions([('ToggleAdvancedBox%i' % component.id, gtk.STOCK_PREFERENCES, '_Advanced options', '<Control>a', 'Show advanced options', current_searchform.toggle_show_advancedbox)]) # def on_page_added(self, notebook, child, page_num): # pass def switch_page(self, notebook, page, page_num): active_component = notebook.get_nth_page(page_num).component logging.debug('Selecting page %i (%s)' % (page_num, active_component.name)) # remove any previous left addictional actions if self.merge_id: self.uimanager.remove_ui(self.merge_id) self.merge_id = 0 if active_component.has_additional_actions: # set additional actions if present and common actions # FIXME: common actions should be entirely handled here and not inside each # component self.merge_id = active_component.set_uimanager_for_additional_actions(self.uimanager) else: # set only common actions self.merge_id = self.uimanager.add_ui_from_string(self.common_action_ui % ('ToggleAdvancedBox%i' % active_component.id)) def quit_cb(self, b): gtk.main_quit()