diff --git a/gramps/gui/basesidebar.py b/gramps/gui/basesidebar.py index 14bc7394e..1b2bce7ff 100644 --- a/gramps/gui/basesidebar.py +++ b/gramps/gui/basesidebar.py @@ -42,3 +42,15 @@ class BaseSidebar(object): Called when the active view is changed. """ raise NotImplementedError + + def active(self, cat_num, view_num): + """ + Called when the sidebar is made visible. + """ + pass + + def inactive(self): + """ + Called when the sidebar is hidden. + """ + pass diff --git a/gramps/gui/navigator.py b/gramps/gui/navigator.py index 96793b757..5475ae975 100644 --- a/gramps/gui/navigator.py +++ b/gramps/gui/navigator.py @@ -17,7 +17,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# $Id$ +# $Id: navigator.py 20492 2012-10-02 21:08:19Z nick-h $ """ A module that provides pluggable sidebars. These provide an interface to @@ -29,6 +29,7 @@ manage pages in the main Gramps window. # #------------------------------------------------------------------------- from gi.repository import Gtk +from gi.repository import Gdk #------------------------------------------------------------------------- # @@ -36,6 +37,38 @@ from gi.repository import Gtk # #------------------------------------------------------------------------- from gramps.gen.plug import (START, END) +from .pluginmanager import GuiPluginManager + +#------------------------------------------------------------------------- +# +# Constants +# +#------------------------------------------------------------------------- +UICATEGORY = ''' + + + %s + + + + +''' + +CATEGORY_ICON = { + 'Dashboard': 'gramps-gramplet', + 'People': 'gramps-person', + 'Relationships': 'gramps-relation', + 'Families': 'gramps-family', + 'Events': 'gramps-event', + 'Ancestry': 'gramps-pedigree', + 'Places': 'gramps-place', + 'Geography': 'gramps-geo', + 'Sources': 'gramps-source', + 'Repositories': 'gramps-repository', + 'Media': 'gramps-media', + 'Notes': 'gramps-notes', + 'Citations': 'gramps-citation', +} #------------------------------------------------------------------------- # @@ -50,6 +83,14 @@ class Navigator(object): self.viewmanager = viewmanager self.pages = [] + self.active_cat = None + self.active_view = None + + self.ui_category = {} + self.view_toggle_actions = {} + self.cat_view_group = None + self.merge_ids = [] + self.top = Gtk.VBox() frame = Gtk.Frame() @@ -92,6 +133,59 @@ class Navigator(object): self.top.show() self.top.pack_start(self.notebook, True, True, 0) + def load_plugins(self, dbstate, uistate): + """ + Load the sidebar plugins. + """ + plugman = GuiPluginManager.get_instance() + + categories = [] + views = {} + for cat_num, cat_views in enumerate(self.viewmanager.get_views()): + uimenuitems = '' + self.view_toggle_actions[cat_num] = [] + for view_num, page in enumerate(cat_views): + + if view_num == 0: + views[cat_num] = [] + cat_name = page[0].category[1] + cat_icon = CATEGORY_ICON.get(page[0].category[0]) + if cat_icon is None: + cat_icon = 'gramps-view' + categories.append([cat_num, cat_name, cat_icon]) + + pageid = 'page_%i_%i' % (cat_num, view_num) + uimenuitems += '\n' % pageid + # id, stock, button text, UI, tooltip, page + if view_num < 9: + modifier = "%d" % ((view_num % 9) + 1) + else: + modifier = "" + + stock_icon = page[0].stock_icon + if stock_icon is None: + stock_icon = cat_icon + self.view_toggle_actions[cat_num].append((pageid, + stock_icon, + page[0].name, modifier, page[0].name, view_num)) + + views[cat_num].append((view_num, page[0].name, stock_icon)) + + if len(cat_views) > 1: + #allow for switching views in a category + self.ui_category[cat_num] = UICATEGORY % uimenuitems + + for pdata in plugman.get_reg_sidebars(): + module = plugman.load_plugin(pdata) + if not module: + print("Error loading sidebar '%s': skipping content" + % pdata.name) + continue + + sidebar_class = getattr(module, pdata.sidebarclass) + sidebar_page = sidebar_class(dbstate, uistate, categories, views) + self.add(pdata.menu_label, sidebar_page, pdata.order) + def get_top(self): """ Return the top container widget for the GUI. @@ -121,8 +215,37 @@ class Navigator(object): """ Called when a Gramps view is changed. """ - for page in self.pages: - page[1].view_changed(cat_num, view_num) + self.active_cat = cat_num + self.active_view = view_num + + # Add buttons to the menu for the different view in the category + uimanager = self.viewmanager.uimanager + if self.cat_view_group: + if self.cat_view_group in uimanager.get_action_groups(): + uimanager.remove_action_group(self.cat_view_group) + + list(map(uimanager.remove_ui, self.merge_ids)) + + if cat_num in self.ui_category: + self.cat_view_group = Gtk.ActionGroup('viewmenu') + self.cat_view_group.add_radio_actions( + self.view_toggle_actions[cat_num], value=view_num, + on_change=self.cb_view_clicked, user_data=cat_num) + self.cat_view_group.set_sensitive(True) + uimanager.insert_action_group(self.cat_view_group, 1) + mergeid = uimanager.add_ui_from_string(self.ui_category[cat_num]) + self.merge_ids.append(mergeid) + + # Call the view_changed method for the active sidebar + sidebar = self.pages[self.notebook.get_current_page()][1] + sidebar.view_changed(cat_num, view_num) + + def cb_view_clicked(self, radioaction, current, cat_num): + """ + Called when a view is selected from the menu. + """ + view_num = radioaction.get_current_value() + self.viewmanager.goto_page(cat_num, view_num) def __menu_button_pressed(self, button, event): """ @@ -145,6 +268,11 @@ class Navigator(object): """ Called when the user has switched to a new sidebar plugin page. """ + old_page = notebook.get_current_page() + if old_page != -1: + self.pages[old_page][1].inactive() + self.pages[index][1].active(self.active_cat, self.active_view) + self.pages[index][1].view_changed(self.active_cat, self.active_view) if self.pages: self.title_label.set_text(self.pages[index][0]) @@ -164,9 +292,9 @@ def cb_menu_position(menu, button): """ Determine the position of the popup menu. """ - x_pos, y_pos = button.window.get_origin() - x_pos += button.allocation.x - y_pos += button.allocation.y + button.allocation.height + ret_val, x_pos, y_pos = button.get_window().get_origin() + x_pos += button.get_allocation().x + y_pos += button.get_allocation().y + button.get_allocation().height return (x_pos, y_pos, False) diff --git a/gramps/gui/viewmanager.py b/gramps/gui/viewmanager.py index e1ea4c3fa..6ecb2bc32 100644 --- a/gramps/gui/viewmanager.py +++ b/gramps/gui/viewmanager.py @@ -685,21 +685,6 @@ class ViewManager(CLIManager): # But we need to realize it here to have Gdk.window handy self.window.realize() - def __load_sidebar_plugins(self): - """ - Load the sidebar plugins. - """ - for pdata in self._pmgr.get_reg_sidebars(): - module = self._pmgr.load_plugin(pdata) - if not module: - print("Error loading sidebar '%s': skipping content" - % pdata.name) - continue - - sidebar_class = getattr(module, pdata.sidebarclass) - sidebar_page = sidebar_class(self.dbstate, self.uistate) - self.navigator.add(pdata.menu_label, sidebar_page, pdata.order) - def __setup_statusbar(self): """ Create the statusbar that sits at the bottom of the window @@ -957,7 +942,7 @@ class ViewManager(CLIManager): config.get('preferences.use-last-view')) self.current_views = defaults[2] - self.__load_sidebar_plugins() + self.navigator.load_plugins(self.dbstate, self.uistate) self.goto_page(defaults[0], defaults[1]) diff --git a/gramps/plugins/sidebar/categorysidebar.py b/gramps/plugins/sidebar/categorysidebar.py index 843411905..f9774ed2d 100644 --- a/gramps/plugins/sidebar/categorysidebar.py +++ b/gramps/plugins/sidebar/categorysidebar.py @@ -45,12 +45,6 @@ from gramps.gui.viewmanager import get_available_views, views_to_show # #------------------------------------------------------------------------- UICATEGORY = ''' - - - %s - - - %s @@ -58,22 +52,6 @@ UICATEGORY = ''' ''' -CATEGORY_ICON = { - 'Dashboard': 'gramps-gramplet', - 'People': 'gramps-person', - 'Relationships': 'gramps-relation', - 'Families': 'gramps-family', - 'Events': 'gramps-event', - 'Ancestry': 'gramps-pedigree', - 'Places': 'gramps-place', - 'Geography': 'gramps-geo', - 'Sources': 'gramps-source', - 'Repositories': 'gramps-repository', - 'Media': 'gramps-media', - 'Notes': 'gramps-notes', - 'Citations': 'gramps-citation', -} - #------------------------------------------------------------------------- # # CategorySidebar class @@ -84,7 +62,7 @@ class CategorySidebar(BaseSidebar): A sidebar displaying a column of toggle buttons that allows the user to change the current view. """ - def __init__(self, dbstate, uistate): + def __init__(self, dbstate, uistate, categories, views): self.viewmanager = uistate.viewmanager @@ -92,8 +70,6 @@ class CategorySidebar(BaseSidebar): self.button_handlers = [] self.ui_category = {} - self.view_toggle_actions = {} - self.cat_view_group = None self.merge_ids = [] self.window = Gtk.ScrolledWindow() @@ -103,49 +79,26 @@ class CategorySidebar(BaseSidebar): self.window.show() use_text = config.get('interface.sidebar-text') - for cat_num, cat_views in enumerate(self.viewmanager.get_views()): - uimenuitems = '' + for cat_num, cat_name, cat_icon in categories: + + # create the button and add it to the sidebar + button = self.__make_sidebar_button(use_text, cat_num, + cat_name, cat_icon) + vbox.pack_start(button, False, True, 0) + + # Enable view switching during DnD + button.drag_dest_set(0, [], 0) + button.connect('drag_motion', self.cb_switch_page_on_dnd, cat_num) + + # toollbar buttons for switching views in a category uitoolitems = '' - self.view_toggle_actions[cat_num] = [] - for view_num, page in enumerate(cat_views): - - if view_num == 0: - category = page[0].category[1] - cat_icon = CATEGORY_ICON.get(page[0].category[0]) - if cat_icon is None: - cat_icon = 'gramps-view' - - # create the button and add it to the sidebar - button = self.__make_sidebar_button(use_text, cat_num, - category, cat_icon) - vbox.pack_start(button, False, True, 0) - - # Enable view switching during DnD - button.drag_dest_set(0, [], 0) - button.connect('drag_motion', self.cb_switch_page_on_dnd, - cat_num) - vbox.show_all() - - pageid = (page[0].id + '_%i' % view_num) - uimenuitems += '\n' % pageid + for view_num, view_name, view_icon in views[cat_num]: + pageid = 'page_%i_%i' % (cat_num, view_num) uitoolitems += '\n' % pageid - # id, stock, button text, UI, tooltip, page - if view_num < 9: - modifier = "%d" % ((view_num % 9) + 1) - else: - modifier = "" + if len(views[cat_num]) > 1: + self.ui_category[cat_num] = UICATEGORY % uitoolitems - stock_icon = page[0].stock_icon - if stock_icon is None: - stock_icon = cat_icon - self.view_toggle_actions[cat_num].append((pageid, - stock_icon, - page[0].name, modifier, page[0].name, view_num)) - - if len(cat_views) > 1: - #allow for switching views in a category - self.ui_category[cat_num] = UICATEGORY % (uimenuitems, - uitoolitems) + vbox.show_all() def get_top(self): """ @@ -159,19 +112,8 @@ class CategorySidebar(BaseSidebar): """ # Add buttons to the toolbar for the different view in the category uimanager = self.viewmanager.uimanager - if self.cat_view_group: - if self.cat_view_group in uimanager.get_action_groups(): - uimanager.remove_action_group(self.cat_view_group) - - list(map(uimanager.remove_ui, self.merge_ids)) - + list(map(uimanager.remove_ui, self.merge_ids)) if cat_num in self.ui_category: - self.cat_view_group = Gtk.ActionGroup('categoryviews') - self.cat_view_group.add_radio_actions( - self.view_toggle_actions[cat_num], value=view_num, - on_change=self.cb_view_clicked, user_data=cat_num) - self.cat_view_group.set_sensitive(True) - uimanager.insert_action_group(self.cat_view_group, 1) mergeid = uimanager.add_ui_from_string(self.ui_category[cat_num]) self.merge_ids.append(mergeid) @@ -263,3 +205,10 @@ class CategorySidebar(BaseSidebar): if self.viewmanager.notebook.get_current_page() != page_no: self.viewmanager.notebook.set_current_page(page_no) self.__handlers_unblock() + + def inactive(self): + """ + Called when the sidebar is hidden. + """ + uimanager = self.viewmanager.uimanager + list(map(uimanager.remove_ui, self.merge_ids)) diff --git a/gramps/plugins/sidebar/dropdownsidebar.py b/gramps/plugins/sidebar/dropdownsidebar.py new file mode 100644 index 000000000..db7e480a4 --- /dev/null +++ b/gramps/plugins/sidebar/dropdownsidebar.py @@ -0,0 +1,220 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2005-2007 Donald N. Allingham +# Copyright (C) 2008 Brian G. Matherly +# Copyright (C) 2009 Benny Malengier +# Copyright (C) 2010 Nick Hall +# Copyright (C) 2011 Tim G L Lyons +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id: categorysidebar.py 20634 2012-11-07 17:53:14Z bmcage $ + +#------------------------------------------------------------------------- +# +# GNOME modules +# +#------------------------------------------------------------------------- +from gi.repository import Gtk + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +from gramps.gen.config import config +from gramps.gui.basesidebar import BaseSidebar + +#------------------------------------------------------------------------- +# +# DropdownSidebar class +# +#------------------------------------------------------------------------- +class DropdownSidebar(BaseSidebar): + """ + A sidebar displaying toggle buttons and buttons with drop-down menus that + allows the user to change the current view. + """ + def __init__(self, dbstate, uistate, categories, views): + + self.viewmanager = uistate.viewmanager + self.views = views + + self.buttons = [] + self.button_handlers = [] + + self.window = Gtk.ScrolledWindow() + vbox = Gtk.VBox() + self.window.add_with_viewport(vbox) + self.window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self.window.show() + + use_text = config.get('interface.sidebar-text') + for cat_num, cat_name, cat_icon in categories: + + # create the button and add it to the sidebar + button = self.__make_sidebar_button(use_text, cat_num, + cat_name, cat_icon) + vbox.pack_start(button, False, True, 0) + + # Enable view switching during DnD + button.drag_dest_set(0, [], 0) + button.connect('drag_motion', self.cb_switch_page_on_dnd, cat_num) + + vbox.show_all() + + def get_top(self): + """ + Return the top container widget for the GUI. + """ + return self.window + + def view_changed(self, cat_num, view_num): + """ + Called when the active view is changed. + """ + # Set new button as selected + 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): + """ + 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): + """ + Unblock signals to the buttons. + """ + for idx in range(len(self.buttons)): + self.buttons[idx].handler_unblock(self.button_handlers[idx]) + + def cb_view_clicked(self, radioaction, current, cat_num): + """ + Called when a button causes a view change. + """ + view_num = radioaction.get_current_value() + self.viewmanager.goto_page(cat_num, view_num) + + def __category_clicked(self, button, cat_num): + """ + Called when a category button is clicked. + """ + # Make the button inactive. It will be set to active in the + # view_changed method if the change was successful. + button.set_active(False) + self.viewmanager.goto_page(cat_num, None) + + def __view_clicked(self, button, cat_num): + """ + Called when a view drop-down arrow is clicked. + """ + menu = Gtk.Menu() + for item in self.views[cat_num]: + menuitem = Gtk.ImageMenuItem(label=item[1]) + image = Gtk.Image.new_from_stock(item[2], Gtk.IconSize.MENU) + image.show() + menuitem.set_image(image) + menuitem.connect("activate", self.cb_menu_clicked, cat_num, item[0]) + menuitem.show() + menu.append(menuitem) + menu.popup(None, None, cb_menu_position, button, 0, 0) + + def cb_menu_clicked(self, menuitem, cat_num, view_num): + """ + Called when a view is selected from a drop-down menu. + """ + self.viewmanager.goto_page(cat_num, view_num) + + def __make_sidebar_button(self, use_text, index, page_title, page_stock): + """ + Create the sidebar button. The page_title is the text associated with + the button. + """ + top = Gtk.HBox() + + # create the button + button = Gtk.ToggleButton() + button.set_relief(Gtk.ReliefStyle.NONE) + button.set_alignment(0, 0.5) + self.buttons.append(button) + + button2 = Gtk.Button() + button2.set_relief(Gtk.ReliefStyle.NONE) + button2.set_alignment(0.5, 0.5) + arrow = Gtk.Arrow(Gtk.ArrowType.DOWN, Gtk.ShadowType.NONE) + button2.add(arrow) + button2.connect('clicked', self.__view_clicked, index) + + # add the tooltip + button.set_tooltip_text(page_title) + + # connect the signal, along with the index as user data + handler_id = button.connect('clicked', self.__category_clicked, index) + self.button_handlers.append(handler_id) + button.show() + + # add the image. If we are using text, use the BUTTON (larger) size. + # otherwise, use the smaller size + hbox = Gtk.HBox() + hbox.show() + image = Gtk.Image() + if use_text: + image.set_from_stock(page_stock, Gtk.IconSize.BUTTON) + else: + image.set_from_stock(page_stock, Gtk.IconSize.DND) + image.show() + hbox.pack_start(image, False, False, 0) + hbox.set_spacing(4) + + # add text if requested + if use_text: + label = Gtk.Label(label=page_title) + label.show() + hbox.pack_start(label, False, True, 0) + + button.add(hbox) + + top.pack_start(button, False, True, 0) + top.pack_start(button2, False, True, 0) + + return top + + def cb_switch_page_on_dnd(self, widget, context, xpos, ypos, time, page_no): + """ + Switches the page based on drag and drop. + """ + self.__handlers_block() + if self.viewmanager.notebook.get_current_page() != page_no: + self.viewmanager.notebook.set_current_page(page_no) + self.__handlers_unblock() + +def cb_menu_position(menu, button): + """ + Determine the position of the popup menu. + """ + ret_val, x_pos, y_pos = button.get_window().get_origin() + x_pos += button.get_allocation().x + y_pos += button.get_allocation().y + button.get_allocation().height + + return (x_pos, y_pos, False) diff --git a/gramps/plugins/sidebar/expandersidebar.py b/gramps/plugins/sidebar/expandersidebar.py new file mode 100644 index 000000000..05e3dca4d --- /dev/null +++ b/gramps/plugins/sidebar/expandersidebar.py @@ -0,0 +1,229 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2005-2007 Donald N. Allingham +# Copyright (C) 2008 Brian G. Matherly +# Copyright (C) 2009 Benny Malengier +# Copyright (C) 2010 Nick Hall +# Copyright (C) 2011 Tim G L Lyons +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id: categorysidebar.py 20634 2012-11-07 17:53:14Z bmcage $ + +#------------------------------------------------------------------------- +# +# GNOME modules +# +#------------------------------------------------------------------------- +from gi.repository import Gtk + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +from gramps.gen.config import config +from gramps.gui.basesidebar import BaseSidebar + +#------------------------------------------------------------------------- +# +# ExpanderSidebar class +# +#------------------------------------------------------------------------- +class ExpanderSidebar(BaseSidebar): + """ + A sidebar displaying toggle buttons and buttons with drop-down menus that + allows the user to change the current view. + """ + def __init__(self, dbstate, uistate, categories, views): + + self.viewmanager = uistate.viewmanager + self.views = views + + self.expanders = [] + self.buttons = [] + self.button_handlers = [] + self.lookup = {} + + self.window = Gtk.ScrolledWindow() + vbox = Gtk.VBox() + self.window.add_with_viewport(vbox) + self.window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self.window.show() + + use_text = config.get('interface.sidebar-text') + for cat_num, cat_name, cat_icon in categories: + + expander = Gtk.Expander() + self.expanders.append(expander) + + catbox = Gtk.HBox() + image = Gtk.Image() + image.set_from_stock(cat_icon, Gtk.IconSize.BUTTON) + catbox.pack_start(image, False, False, 4) + if use_text: + label = Gtk.Label(label=cat_name) + catbox.pack_start(label, False, True, 4) + catbox.set_tooltip_text(cat_name) + expander.set_label_widget(catbox) + + viewbox = Gtk.VBox() + for view_num, view_name, view_icon in views[cat_num]: + # create the button and add it to the sidebar + button = self.__make_sidebar_button(use_text, cat_num, view_num, + view_name, view_icon) + + viewbox.pack_start(button, False, False, 0) + expander.add(viewbox) + vbox.pack_start(expander, False, True, 0) + + # Enable view switching during DnD + #catbox.drag_dest_set(0, [], 0) + #catbox.connect('drag_motion', self.cb_switch_page_on_dnd, cat_num) + + vbox.show_all() + + def get_top(self): + """ + Return the top container widget for the GUI. + """ + return self.window + + def view_changed(self, cat_num, view_num): + """ + Called when the active view is changed. + """ + if cat_num is None: + return + # Expand category + self.expanders[cat_num].set_expanded(True) + # Set new button as selected + button_num = self.lookup[(cat_num, view_num)] + self.__handlers_block() + for index, button in enumerate(self.buttons): + if index == button_num: + button.set_active(True) + else: + button.set_active(False) + 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): + """ + Unblock signals to the buttons. + """ + for idx in range(len(self.buttons)): + self.buttons[idx].handler_unblock(self.button_handlers[idx]) + + def cb_view_clicked(self, radioaction, current, cat_num): + """ + Called when a button causes a view change. + """ + view_num = radioaction.get_current_value() + self.viewmanager.goto_page(cat_num, view_num) + + def __category_clicked(self, button, cat_num): + """ + Called when a category button is clicked. + """ + # Make the button inactive. It will be set to active in the + # view_changed method if the change was successful. + button.set_active(False) + self.viewmanager.goto_page(cat_num, None) + + def __view_clicked(self, button, cat_num, view_num): + """ + Called when a view button is clicked. + """ + self.viewmanager.goto_page(cat_num, view_num) + + def cb_menu_clicked(self, menuitem, cat_num, view_num): + """ + Called when a view is selected from a drop-down menu. + """ + self.viewmanager.goto_page(cat_num, view_num) + + def __make_sidebar_button(self, use_text, cat_num, view_num, view_name, view_icon): + """ + Create the sidebar button. The page_title is the text associated with + the button. + """ + top = Gtk.HBox() + + # create the button + button = Gtk.ToggleButton() + button.set_relief(Gtk.ReliefStyle.NONE) + button.set_alignment(0, 0.5) + self.buttons.append(button) + self.lookup[(cat_num, view_num)] = len(self.buttons) - 1 + + # add the tooltip + button.set_tooltip_text(view_name) + + # connect the signal, along with the index as user data + handler_id = button.connect('clicked', self.__view_clicked, cat_num, view_num) + self.button_handlers.append(handler_id) + button.show() + + # add the image. If we are using text, use the BUTTON (larger) size. + # otherwise, use the smaller size + hbox = Gtk.HBox() + hbox.show() + image = Gtk.Image() + if use_text: + image.set_from_stock(view_icon, Gtk.IconSize.BUTTON) + else: + image.set_from_stock(view_icon, Gtk.IconSize.DND) + image.show() + hbox.pack_start(image, False, False, 0) + hbox.set_spacing(4) + + # add text if requested + if use_text: + label = Gtk.Label(label=view_name) + label.show() + hbox.pack_start(label, False, True, 0) + + button.add(hbox) + + top.pack_start(button, False, True, 0) + + return top + + def cb_switch_page_on_dnd(self, widget, context, xpos, ypos, time, page_no): + """ + Switches the page based on drag and drop. + """ + self.__handlers_block() + if self.viewmanager.notebook.get_current_page() != page_no: + self.viewmanager.notebook.set_current_page(page_no) + self.__handlers_unblock() + +def cb_menu_position(menu, button): + """ + Determine the position of the popup menu. + """ + ret_val, x_pos, y_pos = button.get_window().get_origin() + x_pos += button.get_allocation().x + y_pos += button.get_allocation().y + button.get_allocation().height + + return (x_pos, y_pos, False) diff --git a/gramps/plugins/sidebar/sidebar.gpr.py b/gramps/plugins/sidebar/sidebar.gpr.py index 93b97e910..ba151f06f 100644 --- a/gramps/plugins/sidebar/sidebar.gpr.py +++ b/gramps/plugins/sidebar/sidebar.gpr.py @@ -17,7 +17,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# $Id$ +# $Id: sidebar.gpr.py 20634 2012-11-07 17:53:14Z bmcage $ #------------------------------------------------------------------------ # @@ -39,3 +39,33 @@ sidebarclass = 'CategorySidebar', menu_label = _('Category'), order = START ) + +register(SIDEBAR, +id = 'dropdownsidebar', +name = _("Drop-down Sidebar"), +description = _("Selection of categories and views from drop-down lists"), +version = '1.0', +gramps_target_version = '4.1', +status = STABLE, +fname = 'dropdownsidebar.py', +authors = ["Nick Hall"], +authors_email = ["nick__hall@hotmail.com"], +sidebarclass = 'DropdownSidebar', +menu_label = _('Drop-Down'), +order = END +) + +register(SIDEBAR, +id = 'expandersidebar', +name = _("Expander Sidebar"), +description = _("Selection of views from lists with expanders"), +version = '1.0', +gramps_target_version = '4.1', +status = STABLE, +fname = 'expandersidebar.py', +authors = ["Nick Hall"], +authors_email = ["nick__hall@hotmail.com"], +sidebarclass = 'ExpanderSidebar', +menu_label = _('Expander'), +order = END +)