diff --git a/src/gen/plug/_pluginreg.py b/src/gen/plug/_pluginreg.py index 0c224edf3..c28c98727 100644 --- a/src/gen/plug/_pluginreg.py +++ b/src/gen/plug/_pluginreg.py @@ -314,11 +314,6 @@ class PluginData(object): .. attribute:: viewclass A class of type ViewCreator that holds the needed info of the view to be created: icon, viewclass that derives from pageview, ... - .. attribute:: order - order can be START or END. Default is END. For END, on registering, - the view is appended to the list of views. If START, then the view is - prepended. Only set START if you want a view to be the first in the - order of views .. attribute:: stock_icon The icon in the toolbar or sidebar used to select the view @@ -327,6 +322,13 @@ class PluginData(object): The class that defines the sidebar. .. attribute:: menu_label A label to use on the seltion menu. + + Attributes for VIEW and SIDEBAR plugins + .. attribute:: order + order can be START or END. Default is END. For END, on registering, + the plugin is appended to the list of plugins. If START, then the + plugin is prepended. Only set START if you want a plugin to be the + first in the order of plugins """ def __init__(self): @@ -389,11 +391,12 @@ class PluginData(object): self._help_url = None #VIEW attr self._viewclass = None - self._order = END self._stock_icon = None #SIDEBAR attr self._sidebarclass = None self._menu_label = '' + #VIEW and SIDEBAR attr + self._order = END def _set_id(self, id): self._id = id @@ -833,14 +836,6 @@ class PluginData(object): def _get_viewclass(self): return self._viewclass - def _set_order(self, order): - if not self._ptype == VIEW: - raise ValueError, 'order may only be set for VIEW plugins' - self._order = order - - def _get_order(self): - return self._order - def _set_stock_icon(self, stock_icon): if not self._ptype == VIEW: raise ValueError, 'stock_icon may only be set for VIEW plugins' @@ -850,7 +845,6 @@ class PluginData(object): return self._stock_icon viewclass = property(_get_viewclass, _set_viewclass) - order = property(_get_order, _set_order) stock_icon = property(_get_stock_icon, _set_stock_icon) #SIDEBAR attributes @@ -872,6 +866,17 @@ class PluginData(object): sidebarclass = property(_get_sidebarclass, _set_sidebarclass) menu_label = property(_get_menu_label, _set_menu_label) + + #VIEW and SIDEBAR attributes + def _set_order(self, order): + if not self._ptype in (VIEW, SIDEBAR): + raise ValueError, 'order may only be set for VIEW and SIDEBAR plugins' + self._order = order + + def _get_order(self): + return self._order + + order = property(_get_order, _set_order) def newplugin(): """ diff --git a/src/gui/basesidebar.py b/src/gui/basesidebar.py index 239072be5..451d8aa41 100644 --- a/src/gui/basesidebar.py +++ b/src/gui/basesidebar.py @@ -37,20 +37,14 @@ class BaseSidebar(object): """ raise NotImplementedError + def loaded(self): + """ + Called after all the sidebar plugins have been loaded. + """ + raise NotImplementedError + def view_changed(self, page_num): """ Called when the active view is changed. """ raise NotImplementedError - - def handlers_block(self): - """ - Block signals to the buttons to prevent spurious events. - """ - raise NotImplementedError - - def handlers_unblock(self): - """ - Unblock signals to the buttons. - """ - raise NotImplementedError diff --git a/src/gui/sidebar.py b/src/gui/sidebar.py index 569c3f7a7..bb5c77b32 100644 --- a/src/gui/sidebar.py +++ b/src/gui/sidebar.py @@ -30,6 +30,13 @@ manage pages in the main Gramps window. #------------------------------------------------------------------------- import gtk +#------------------------------------------------------------------------- +# +# Gramps modules +# +#------------------------------------------------------------------------- +from gen.plug import (START, END) + #------------------------------------------------------------------------- # # Sidebar class @@ -87,7 +94,7 @@ class Sidebar(object): """ return self.top - def add(self, title, sidebar): + def add(self, title, sidebar, order): """ Add a page to the sidebar for a plugin. """ @@ -95,31 +102,28 @@ class Sidebar(object): index = self.notebook.append_page(sidebar.get_top(), gtk.Label(title)) menu_item = gtk.MenuItem(title) + if order == START: + self.menu.prepend(menu_item) + self.notebook.set_current_page(index) + else: + self.menu.append(menu_item) menu_item.connect('activate', self.cb_menu_activate, index) menu_item.show() - self.menu.append(menu_item) + def loaded(self): + """ + Called after all the sidebar plugins have been loaded. + """ + for page in self.pages: + page[1].loaded() + def view_changed(self, page_num): """ Called when a Gramps view is changed. """ for page in self.pages: page[1].view_changed(page_num) - - def handlers_block(self): - """ - Block signals to the buttons to prevent spurious events. - """ - for page in self.pages: - page[1].handlers_block() - - def handlers_unblock(self): - """ - Unblock signals to the buttons. - """ - for page in self.pages: - page[1].handlers_unblock() - + def __menu_button_pressed(self, button, event): """ Called when the button to select a sidebar page is pressed. diff --git a/src/gui/viewmanager.py b/src/gui/viewmanager.py index b63ec8e75..caac831fd 100644 --- a/src/gui/viewmanager.py +++ b/src/gui/viewmanager.py @@ -295,7 +295,6 @@ class ViewManager(CLIManager): self.notebook.set_scrollable(True) self.notebook.set_show_tabs(False) self.notebook.show() - self.notebook_cat = [] self.__init_lists() self.__build_ui_manager() @@ -361,7 +360,7 @@ class ViewManager(CLIManager): sidebar_class = getattr(module, pdata.sidebarclass) sidebar_page = sidebar_class(self.dbstate, self.uistate) - self.sidebar.add(pdata.menu_label, sidebar_page) + self.sidebar.add(pdata.menu_label, sidebar_page, pdata.order) def __setup_statusbar(self): """ @@ -557,9 +556,7 @@ class ViewManager(CLIManager): new_page = 0 else: new_page = current_page + 1 - self.sidebar.handlers_block() self.notebook.set_current_page(new_page) - self.sidebar.handlers_unblock() def __prev_view(self, action): """ @@ -572,15 +569,12 @@ class ViewManager(CLIManager): new_page = len(self.pages)-1 else: new_page = current_page - 1 - self.sidebar.handlers_block() self.notebook.set_current_page(new_page) - self.sidebar.handlers_unblock() def init_interface(self): """ Initialize the interface, creating the pages as given in vieworder """ - self.__init_lists() self.__load_sidebar_plugins() if not self.file_loaded: @@ -616,6 +610,7 @@ class ViewManager(CLIManager): Showing the main window is deferred so that ArgHandler can work without it always shown """ + self.sidebar.loaded() self.window.show() if not self.dbstate.db.is_open() and show_manager: self.__open_activate(None) @@ -827,6 +822,9 @@ class ViewManager(CLIManager): config.save() def create_page(self, pdata, page_def): + """ + Create a new page and set it as the current page. + """ try: page = page_def(self.dbstate, self.uistate) except: @@ -863,16 +861,18 @@ class ViewManager(CLIManager): hbox.show_all() page_num = self.notebook.append_page(page_display, hbox) - return page_num + self.notebook.set_current_page(page_num) def goto_page(self, page_num): - self.sidebar.handlers_block() + """ + Change the current page. + """ self.notebook.set_current_page(page_num) - self.sidebar.handlers_unblock() - - self.__change_page(page_num) def __change_page(self, page_num): + """ + Perform necessary actions when a page is changed. + """ self.__disconnect_previous_page() self.active_page = self.pages[page_num] @@ -885,6 +885,12 @@ class ViewManager(CLIManager): self.active_page.change_page() + def get_n_pages(self): + """ + Return the total number of pages. + """ + return self.notebook.get_n_pages() + def __delete_pages(self): """ Calls on_delete() for each view diff --git a/src/plugins/sidebar/categorysidebar.py b/src/plugins/sidebar/categorysidebar.py index dc435363c..4204c3b4a 100644 --- a/src/plugins/sidebar/categorysidebar.py +++ b/src/plugins/sidebar/categorysidebar.py @@ -153,8 +153,6 @@ class CategorySidebar(BaseSidebar): #allow for switching views in a category self.ui_category[cat_num] = UICATEGORY % (uimenuitems, uitoolitems) - # Open the default view - self.__category_clicked(self.buttons[defaults[0]], defaults[0]) def get_top(self): """ @@ -162,6 +160,14 @@ class CategorySidebar(BaseSidebar): """ return self.window + def loaded(self): + """ + Open the default view after all the sidebar plugins have been loaded. + """ + defaults = views_to_show(self.views, + config.get('preferences.use-last-view')) + self.__category_clicked(self.buttons[defaults[0]], defaults[0]) + def view_changed(self, page_num): """ Called when the active view is changed. @@ -202,22 +208,22 @@ class CategorySidebar(BaseSidebar): self.merge_ids.append(mergeid) # Set new button as selected - self.handlers_block() + self.__handlers_block() for index, button in enumerate(self.buttons): if index == cat_num: button.set_active(True) else: button.set_active(False) - self.handlers_unblock() - - def handlers_block(self): + self.__handlers_unblock() + + def __handlers_block(self): """ Block signals to the buttons to prevent spurious events. """ for idx in range(len(self.buttons)): self.buttons[idx].handler_block(self.button_handlers[idx]) - def handlers_unblock(self): + def __handlers_unblock(self): """ Unblock signals to the buttons. """ @@ -252,11 +258,10 @@ class CategorySidebar(BaseSidebar): page_num = self.pages.get((cat_num, view_num)) if page_num is None: page = self.page_defs[(cat_num, view_num)] - page_num = self.viewmanager.create_page(page[0], page[1]) - self.pages[(cat_num, view_num)] = page_num - - self.current_views[cat_num] = view_num - self.viewmanager.goto_page(page_num) + self.pages[(cat_num, view_num)] = self.viewmanager.get_n_pages() + self.viewmanager.create_page(page[0], page[1]) + else: + self.viewmanager.goto_page(page_num) def __make_sidebar_button(self, use_text, index, page_title, page_stock): """ diff --git a/src/plugins/sidebar/sidebar.gpr.py b/src/plugins/sidebar/sidebar.gpr.py index 4249ddb94..c5d3797ff 100644 --- a/src/plugins/sidebar/sidebar.gpr.py +++ b/src/plugins/sidebar/sidebar.gpr.py @@ -36,5 +36,6 @@ fname = 'categorysidebar.py', authors = [u"Nick Hall"], authors_email = ["nick__hall@hotmail.com"], sidebarclass = 'CategorySidebar', -menu_label = _('Category') +menu_label = _('Category'), +order = START )