From d3fd2f150d1abfeccbc90b338da81aae8bc9f459 Mon Sep 17 00:00:00 2001 From: Benny Malengier Date: Sat, 14 Nov 2009 17:17:34 +0000 Subject: [PATCH] GEPS_014:_Plugin_registration_and_management finish views in category, todo: configuration svn: r13578 --- po/POTFILES.in | 2 +- src/PageView.py | 1215 ----------------- src/gui/grampsgui.py | 20 +- src/gui/viewmanager.py | 165 ++- src/gui/views/listview.py | 5 + src/gui/views/pageview.py | 11 +- src/images/16x16/Makefile.am | 3 + src/images/16x16/gramps-tree-group.png | Bin 0 -> 555 bytes src/images/16x16/gramps-tree-list.png | Bin 0 -> 488 bytes src/images/16x16/gramps-tree-select.png | Bin 0 -> 753 bytes src/images/16x16/source/gramps-tree-group.svg | 297 ++++ src/images/16x16/source/gramps-tree-list.svg | 290 ++++ .../16x16/source/gramps-tree-select.svg | 379 +++++ src/images/22x22/Makefile.am | 3 + src/images/22x22/gramps-tree-group.png | Bin 0 -> 776 bytes src/images/22x22/gramps-tree-list.png | Bin 0 -> 749 bytes src/images/22x22/gramps-tree-select.png | Bin 0 -> 1022 bytes src/images/48x48/Makefile.am | 6 + src/images/48x48/gramps-config.png | Bin 0 -> 3661 bytes src/images/48x48/gramps-fanchart.png | Bin 0 -> 2937 bytes src/images/48x48/gramps-tree-group.png | Bin 0 -> 1423 bytes src/images/48x48/gramps-tree-list.png | Bin 0 -> 1349 bytes src/images/48x48/gramps-tree-select.png | Bin 0 -> 2416 bytes src/images/48x48/gramps-view.png | Bin 0 -> 2133 bytes src/images/scalable/Makefile.am | 6 + src/images/scalable/gramps-config.svg | 864 ++++++++++++ src/images/scalable/gramps-fanchart.svg | 965 +++++++++++++ src/images/scalable/gramps-gramplet.svg | 27 +- src/images/scalable/gramps-parents-open.svg | 31 +- src/images/scalable/gramps-tree-group.svg | 362 +++++ src/images/scalable/gramps-tree-list.svg | 363 +++++ src/images/scalable/gramps-tree-select.svg | 452 ++++++ src/images/scalable/gramps-view.svg | 705 ++++++++++ src/plugins/view/fanchartview.py | 11 + src/plugins/view/geoview.py | 13 + src/plugins/view/grampletview.py | 5 + src/plugins/view/htmlrenderer.py | 11 +- src/plugins/view/pedigreeview.py | 9 +- src/plugins/view/personview.py | 5 + src/plugins/view/relview.py | 5 + 40 files changed, 4943 insertions(+), 1287 deletions(-) delete mode 100644 src/PageView.py create mode 100644 src/images/16x16/gramps-tree-group.png create mode 100644 src/images/16x16/gramps-tree-list.png create mode 100644 src/images/16x16/gramps-tree-select.png create mode 100644 src/images/16x16/source/gramps-tree-group.svg create mode 100644 src/images/16x16/source/gramps-tree-list.svg create mode 100644 src/images/16x16/source/gramps-tree-select.svg create mode 100644 src/images/22x22/gramps-tree-group.png create mode 100644 src/images/22x22/gramps-tree-list.png create mode 100644 src/images/22x22/gramps-tree-select.png create mode 100644 src/images/48x48/gramps-config.png create mode 100644 src/images/48x48/gramps-fanchart.png create mode 100644 src/images/48x48/gramps-tree-group.png create mode 100644 src/images/48x48/gramps-tree-list.png create mode 100644 src/images/48x48/gramps-tree-select.png create mode 100644 src/images/48x48/gramps-view.png create mode 100644 src/images/scalable/gramps-config.svg create mode 100644 src/images/scalable/gramps-fanchart.svg create mode 100644 src/images/scalable/gramps-tree-group.svg create mode 100644 src/images/scalable/gramps-tree-list.svg create mode 100644 src/images/scalable/gramps-tree-select.svg create mode 100644 src/images/scalable/gramps-view.svg diff --git a/po/POTFILES.in b/po/POTFILES.in index 22f5a4e5c..48f62e5d0 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -25,7 +25,6 @@ src/ImgManip.py src/ListModel.py src/ManagedWindow.py src/Navigation.py -src/PageView.py src/PlaceUtils.py src/QuestionDialog.py src/QuickReports.py @@ -439,6 +438,7 @@ src/plugins/import/ImportXml.py # plugins/lib directory src/plugins/lib/libcairodoc.py +src/plugins/lib/libformatting.py src/plugins/lib/libgrampsxml.py src/plugins/lib/libgrdb.py src/plugins/lib/libholiday.py diff --git a/src/PageView.py b/src/PageView.py deleted file mode 100644 index b3bcddae6..000000000 --- a/src/PageView.py +++ /dev/null @@ -1,1215 +0,0 @@ -# -# Gramps - a GTK+/GNOME based genealogy program -# -# Copyright (C) 2001-2007 Donald N. Allingham -# -# 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:PageView.py 9912 2008-01-22 09:17:46Z acraphae $ - -""" -Provide the base classes for GRAMPS' DataView classes -""" - -#---------------------------------------------------------------- -# -# python modules -# -#---------------------------------------------------------------- -import cPickle as pickle -import time -import logging - -_LOG = logging.getLogger('.pageview') - -#---------------------------------------------------------------- -# -# gtk -# -#---------------------------------------------------------------- -import gtk -import pango - -#---------------------------------------------------------------- -# -# GRAMPS -# -#---------------------------------------------------------------- -import config -import TreeTips -import Bookmarks -import Errors -from Filters import SearchBar -import Utils -from gui.utils import add_menuitem -from gui.dbguielement import DbGUIElement -import const -from widgets.menutoolbuttonaction import MenuToolButtonAction - -from TransUtils import sgettext as _ -from QuestionDialog import QuestionDialog, QuestionDialog2 - -NAVIGATION_NONE = -1 -NAVIGATION_PERSON = 0 - -#------------------------------------------------------------------------------ -# -# PageView -# -#------------------------------------------------------------------------------ -class PageView(DbGUIElement): - """ - The PageView class is the base class for all Data Views in GRAMPS. All - Views should derive from this class. The ViewManager understands the public - interface of this class - """ - - def __init__(self, title, dbstate, uistate): - self.title = title - self.dbstate = dbstate - self.uistate = uistate - self.action_list = [] - self.action_toggle_list = [] - self.action_toolmenu_list = [] - self.action_toolmenu = {} #easy access to toolmenuaction and proxies - self.action_group = None - self.additional_action_groups = [] - self.additional_uis = [] - self.widget = None - self.model = None - self.ui_def = '' - self.dbstate.connect('no-database', self.disable_action_group) - self.dbstate.connect('database-changed', self.enable_action_group) - self.dirty = True - self.active = False - self.handle_col = 0 - self.selection = None - self.func_list = {} - DbGUIElement.__init__(self, dbstate.db) - - def call_function(self, key): - """ - Calls the function associated with the key value - """ - self.func_list.get(key)() - - def post(self): - pass - - def set_active(self): - """ - Called with the PageView is set as active. If the page is "dirty", - then we rebuild the data. - """ - self.active = True - if self.dirty: - self.uistate.set_busy_cursor(True) - self.build_tree() - self.uistate.set_busy_cursor(False) - - def set_inactive(self): - """ - Marks page as being active (currently displayed) - """ - self.active = False - - def build_tree(self): - """ - Rebuilds the current display. This must be overridden by the derived - class. - """ - raise NotImplementedError - - def navigation_type(self): - """ - Indictates the navigation type. Currently, we only support navigation - for views that are Person centric. - """ - return NAVIGATION_NONE - - def ui_definition(self): - """ - returns the XML UI definition for the UIManager - """ - return self.ui_def - - def additional_ui_definitions(self): - """ - Return any additional interfaces for the UIManager that the view - needs to define. - """ - return self.additional_uis - - def disable_action_group(self): - """ - Turns off the visibility of the View's action group, if defined - """ - if self.action_group: - self.action_group.set_visible(False) - - def enable_action_group(self, obj): - """ - Turns on the visibility of the View's action group, if defined - """ - if self.action_group: - self.action_group.set_visible(True) - - def get_stock(self): - """ - Return image associated with the view, which is used for the - icon for the button. - """ - return gtk.STOCK_MISSING_IMAGE - - def get_title(self): - """ - Return the title of the view. This is used to define the text for the - button, and for the tab label. - """ - return self.title - - def get_display(self): - """ - Builds the graphical display, returning the top level widget. - """ - if not self.widget: - self.widget = self.build_widget() - return self.widget - - def build_widget(self): - """ - Builds the container widget for the interface. Must be overridden by the - the base class. Returns a gtk container widget. - """ - raise NotImplementedError - - def define_actions(self): - """ - Defines the UIManager actions. Called by the ViewManager to set up the - View. The user typically defines self.action_list and - self.action_toggle_list in this function. - - Derived classes must override this function. - """ - raise NotImplementedError - - def __build_action_group(self): - """ - Create an UIManager ActionGroup from the values in self.action_list - and self.action_toggle_list. The user should define these in - self.define_actions - """ - self.action_group = gtk.ActionGroup(self.title) - if len(self.action_list) > 0: - self.action_group.add_actions(self.action_list) - if len(self.action_toggle_list) > 0: - self.action_group.add_toggle_actions(self.action_toggle_list) - for action_toolmenu in self.action_toolmenu_list: - self.action_toolmenu[action_toolmenu[0]] = \ - MenuToolButtonAction(action_toolmenu[0], #unique name - action_toolmenu[1], #label - action_toolmenu[2], #tooltip - action_toolmenu[3], #callback - action_toolmenu[4] #arrow tooltip - ) - self.action_group.add_action( - self.action_toolmenu[action_toolmenu[0]]) - - def _add_action(self, name, stock_icon, label, accel=None, tip=None, - callback=None): - """ - Add an action to the action list for the current view. - """ - self.action_list.append((name, stock_icon, label, accel, tip, - callback)) - - def _add_toggle_action(self, name, stock_icon, label, accel=None, - tip=None, callback=None, value=False): - """ - Add a toggle action to the action list for the current view. - """ - self.action_toggle_list.append((name, stock_icon, label, accel, - tip, callback, value)) - - def _add_toolmenu_action(self, name, label, tooltip, callback, - arrowtooltip): - self.action_toolmenu_list.append((name, label, tooltip, callback, - arrowtooltip)) - - def get_actions(self): - """ - Return the actions that should be used for the view. This includes the - standard action group (which handles the main toolbar), along with - additional action groups. - - If the action group is not defined, we build it the first time. This - allows us to delay the intialization until it is really needed. - - The ViewManager uses this function to extract the actions to install - into the UIManager. - """ - if not self.action_group: - self.__build_action_group() - return [self.action_group] + self.additional_action_groups - - def _add_action_group(self, group): - """ - Allows additional action groups to be added to the view. - """ - self.additional_action_groups.append(group) - - def change_page(self): - """ - Called when the page changes. - """ - self.uistate.clear_filter_results() - - def edit(self, obj): - """ - Template function to allow the editing of the selected object - """ - raise NotImplementedError - - def remove(self, handle): - """ - Template function to allow the removal of an object by its handle - """ - raise NotImplementedError - - def remove_selected_objects(self): - """ - Function to remove selected objects - """ - prompt = True - if len(self.selected_handles()) > 1: - q = QuestionDialog2( - _("Remove selected items?"), - _("More than one item has been selected for deletion. " - "Ask before deleting each one?"), - _("Yes"), - _("No")) - prompt = q.run() - - if not prompt: - self.uistate.set_busy_cursor(1) - - for handle in self.selected_handles(): - (query, is_used, object) = self.remove_object_from_handle(handle) - if prompt: - if is_used: - msg = _('This item is currently being used. ' - 'Deleting it will remove it from the database and ' - 'from all other items that reference it.') - else: - msg = _('Deleting item will remove it from the database.') - - msg = "%s %s" % (msg, Utils.data_recover_msg) - #descr = object.get_description() - #if descr == "": - descr = object.get_gramps_id() - self.uistate.set_busy_cursor(1) - QuestionDialog(_('Delete %s?') % descr, msg, - _('_Delete Item'), query.query_response) - self.uistate.set_busy_cursor(0) - else: - query.query_response() - - if not prompt: - self.uistate.set_busy_cursor(0) - - def remove_object_from_handle(self, handle): - """ - Template function to allow the removal of an object by its handle - """ - raise NotImplementedError - - def add(self, obj): - """ - Template function to allow the adding of a new object - """ - raise NotImplementedError - - def _key_press(self, obj, event): - #act if no modifier, and allow Num Lock as MOD2_MASK - if not event.state or event.state in (gtk.gdk.MOD2_MASK, ): - if event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter): - self.edit(obj) - return True - return False - - def blist(self, store, path, node, sel_list): - handle = store.get_value(node, self.handle_col) - sel_list.append(handle) - - def selected_handles(self): - mlist = [] - self.selection.selected_foreach(self.blist, mlist) - return mlist - - def first_selected(self): - mlist = [] - self.selection.selected_foreach(self.blist, mlist) - if mlist: - return mlist[0] - else: - return None - - def on_delete(self): - """ - Method called on shutdown. Data views should put code here - that should be called when quiting the main application. - """ - pass - -class BookMarkView(PageView): - - def __init__(self, title, state, uistate, bookmarks, bm_type): - PageView.__init__(self, title, state, uistate) - self.bm_type = bm_type - self.setup_bookmarks(bookmarks) - - def goto_handle(self, obj): - raise NotImplementedError - - def setup_bookmarks(self, bookmarks): - self.bookmarks = self.bm_type( - self.dbstate, self.uistate, bookmarks, self.goto_handle) - - def add_bookmark(self, obj): - from BasicUtils import name_displayer - - if self.dbstate.active: - self.bookmarks.add(self.dbstate.active.get_handle()) - name = name_displayer.display(self.dbstate.active) - self.uistate.push_message(self.dbstate, - _("%s has been bookmarked") % name) - else: - from QuestionDialog import WarningDialog - WarningDialog( - _("Could Not Set a Bookmark"), - _("A bookmark could not be set because " - "no one was selected.")) - - def set_active(self): - PageView.set_active(self) - self.bookmarks.display() - - def set_inactive(self): - PageView.set_inactive(self) - self.bookmarks.undisplay() - - def edit_bookmarks(self, obj): - self.bookmarks.edit() - - def enable_action_group(self, obj): - PageView.enable_action_group(self, obj) - - def disable_action_group(self): - PageView.disable_action_group(self) - - def define_actions(self): - self.book_action = gtk.ActionGroup(self.title + '/Bookmark') - self.book_action.add_actions([ - ('AddBook', 'gramps-bookmark-new', _('_Add Bookmark'), - 'd', None, self.add_bookmark), - ('EditBook', 'gramps-bookmark-edit', - _("%(title)s...") % {'title': _("Organize Bookmarks")}, - 'b', None, - self.edit_bookmarks), - ]) - - self._add_action_group(self.book_action) - -#---------------------------------------------------------------- -# -# PersonNavView -# -#---------------------------------------------------------------- -class PersonNavView(BookMarkView): - - def __init__(self, title, dbstate, uistate, callback=None): - BookMarkView.__init__(self, title, dbstate, uistate, - dbstate.db.get_bookmarks(), - Bookmarks.Bookmarks) - - def navigation_type(self): - return NAVIGATION_PERSON - - def define_actions(self): - # add the Forward action group to handle the Forward button - - BookMarkView.define_actions(self) - - self.fwd_action = gtk.ActionGroup(self.title + '/Forward') - self.fwd_action.add_actions([ - ('Forward', gtk.STOCK_GO_FORWARD, _("_Forward"), - "Right", _("Go to the next person in the history"), - self.fwd_clicked) - ]) - - # add the Backward action group to handle the Forward button - self.back_action = gtk.ActionGroup(self.title + '/Backward') - self.back_action.add_actions([ - ('Back', gtk.STOCK_GO_BACK, _("_Back"), - "Left", _("Go to the previous person in the history"), - self.back_clicked) - ]) - - self._add_action('HomePerson', gtk.STOCK_HOME, _("_Home"), - accel="Home", - tip=_("Go to the default person"), callback=self.home) - self._add_action('FilterEdit', None, _('Person Filter Editor'), - callback=self.filter_editor) - - self.other_action = gtk.ActionGroup(self.title + '/PersonOther') - self.other_action.add_actions([ - ('SetActive', gtk.STOCK_HOME, _("Set _Home Person"), None, - None, self.set_default_person), - ]) - - self._add_action_group(self.back_action) - self._add_action_group(self.fwd_action) - self._add_action_group(self.other_action) - - def disable_action_group(self): - """ - Normally, this would not be overridden from the base class. However, - in this case, we have additional action groups that need to be - handled correctly. - """ - BookMarkView.disable_action_group(self) - - self.fwd_action.set_visible(False) - self.back_action.set_visible(False) - - def enable_action_group(self, obj): - """ - Normally, this would not be overridden from the base class. However, - in this case, we have additional action groups that need to be - handled correctly. - """ - BookMarkView.enable_action_group(self, obj) - - self.fwd_action.set_visible(True) - self.back_action.set_visible(True) - hobj = self.uistate.phistory - self.fwd_action.set_sensitive(not hobj.at_end()) - self.back_action.set_sensitive(not hobj.at_front()) - - def set_default_person(self, obj): - active = self.dbstate.active - if active: - self.dbstate.db.set_default_person_handle(active.get_handle()) - - def home(self, obj): - defperson = self.dbstate.db.get_default_person() - if defperson: - self.dbstate.change_active_person(defperson) - - def jump(self): - dialog = gtk.Dialog(_('Jump to by GRAMPS ID'), None, - gtk.DIALOG_NO_SEPARATOR) - dialog.set_border_width(12) - label = gtk.Label('%s' % - _('Jump to by GRAMPS ID')) - label.set_use_markup(True) - dialog.vbox.add(label) - dialog.vbox.set_spacing(10) - dialog.vbox.set_border_width(12) - hbox = gtk.HBox() - hbox.pack_start(gtk.Label("%s: " % _('ID')), False) - text = gtk.Entry() - text.set_activates_default(True) - hbox.pack_start(text, False) - dialog.vbox.pack_start(hbox, False) - dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_JUMP_TO, gtk.RESPONSE_OK) - dialog.set_default_response(gtk.RESPONSE_OK) - dialog.vbox.show_all() - - if dialog.run() == gtk.RESPONSE_OK: - gid = text.get_text() - person = self.dbstate.db.get_person_from_gramps_id(gid) - if person: - self.dbstate.change_active_person(person) - else: - self.uistate.push_message( - self.dbstate, - _("Error: %s is not a valid GRAMPS ID") % gid) - dialog.destroy() - - def filter_editor(self, obj): - from FilterEditor import FilterEditor - - try: - FilterEditor('Person', const.CUSTOM_FILTERS, - self.dbstate, self.uistate) - except Errors.WindowActiveError: - return - - def fwd_clicked(self, obj, step=1): - hobj = self.uistate.phistory - hobj.lock = True - if not hobj.at_end(): - try: - handle = hobj.forward() - self.dbstate.change_active_handle(handle) - self.uistate.modify_statusbar(self.dbstate) - hobj.mhistory.append(hobj.history[hobj.index]) - self.fwd_action.set_sensitive(not hobj.at_end()) - self.back_action.set_sensitive(True) - except: - hobj.clear() - self.fwd_action.set_sensitive(False) - self.back_action.set_sensitive(False) - else: - self.fwd_action.set_sensitive(False) - self.back_action.set_sensitive(True) - hobj.lock = False - - def back_clicked(self, obj, step=1): - hobj = self.uistate.phistory - hobj.lock = True - if not hobj.at_front(): - try: - handle = hobj.back() - self.active = self.dbstate.db.get_person_from_handle(handle) - self.uistate.modify_statusbar(self.dbstate) - self.dbstate.change_active_handle(handle) - hobj.mhistory.append(hobj.history[hobj.index]) - self.back_action.set_sensitive(not hobj.at_front()) - self.fwd_action.set_sensitive(True) - except: - hobj.clear() - self.fwd_action.set_sensitive(False) - self.back_action.set_sensitive(False) - else: - self.back_action.set_sensitive(False) - self.fwd_action.set_sensitive(True) - hobj.lock = False - - def handle_history(self, handle): - """ - Updates the person history information - It will push the person at the end of the history if that person is - not present person - """ - hobj = self.uistate.phistory - if handle and not hobj.lock and not (handle == hobj.present()): - hobj.push(handle) - self.fwd_action.set_sensitive(not hobj.at_end()) - self.back_action.set_sensitive(not hobj.at_front()) - - def change_page(self): - hobj = self.uistate.phistory - self.fwd_action.set_sensitive(not hobj.at_end()) - self.back_action.set_sensitive(not hobj.at_front()) - self.other_action.set_sensitive(not self.dbstate.db.readonly) - -#---------------------------------------------------------------- -# -# ListView -# -#---------------------------------------------------------------- -class ListView(BookMarkView): - - ADD_MSG = "" - EDIT_MSG = "" - DEL_MSG = "" - QR_CATEGORY = -1 - - def __init__(self, title, dbstate, uistate, columns, handle_col, - make_model, signal_map, get_bookmarks, bm_type, - multiple=False, filter_class=None): - - BookMarkView.__init__(self, title, dbstate, uistate, - get_bookmarks, bm_type) - - self.filter_class = filter_class - self.renderer = gtk.CellRendererText() - self.renderer.set_property('ellipsize', pango.ELLIPSIZE_END) - self.sort_col = 0 - self.sort_order = gtk.SORT_ASCENDING - self.columns = [] - self.colinfo = columns - self.handle_col = handle_col - self.make_model = make_model - self.model = None - self.signal_map = signal_map - self.multiple_selection = multiple - self.generic_filter = None - dbstate.connect('database-changed', self.change_db) - - def build_filter_container(self, box, filter_class): - self.filter_sidebar = filter_class(self.dbstate, self.uistate, - self.filter_clicked) - self.filter_pane = self.filter_sidebar.get_widget() - - hpaned = gtk.HBox() - hpaned.pack_start(self.vbox, True, True) - hpaned.pack_end(self.filter_pane, False, False) - self.filter_toggle(None, None, None, None) - return hpaned - - def filter_toggle(self, client, cnxn_id, entry, data): - if config.get('interface.filter'): - self.search_bar.hide() - self.filter_pane.show() - else: - self.search_bar.show() - self.filter_pane.hide() - - def post(self): - if self.filter_class: - if config.get('interface.filter'): - self.search_bar.hide() - self.filter_pane.show() - else: - self.search_bar.show() - self.filter_pane.hide() - - def filter_clicked(self): - self.generic_filter = self.filter_sidebar.get_filter() - self.build_tree() - - def add_bookmark(self, obj): - mlist = [] - self.selection.selected_foreach(self.blist, mlist) - - if mlist: - self.bookmarks.add(mlist[0]) - else: - from QuestionDialog import WarningDialog - WarningDialog( - _("Could Not Set a Bookmark"), - _("A bookmark could not be set because " - "nothing was selected.")) - - def jump(self): - dialog = gtk.Dialog(_('Jump to by GRAMPS ID'), None, - gtk.DIALOG_NO_SEPARATOR) - dialog.set_border_width(12) - label = gtk.Label('%s' % - _('Jump to by GRAMPS ID')) - label.set_use_markup(True) - dialog.vbox.add(label) - dialog.vbox.set_spacing(10) - dialog.vbox.set_border_width(12) - hbox = gtk.HBox() - hbox.pack_start(gtk.Label("%s: " % _('ID')), False) - text = gtk.Entry() - text.set_activates_default(True) - hbox.pack_start(text, False) - dialog.vbox.pack_start(hbox, False) - dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_JUMP_TO, gtk.RESPONSE_OK) - dialog.set_default_response(gtk.RESPONSE_OK) - dialog.vbox.show_all() - - if dialog.run() == gtk.RESPONSE_OK: - gid = text.get_text() - handle = self.get_handle_from_gramps_id(gid) - if handle: - self.goto_handle(handle) - else: - self.uistate.push_message( - self.dbstate, - _("Error: %s is not a valid GRAMPS ID") % gid) - dialog.destroy() - - def drag_info(self): - return None - - def drag_begin(self, widget, context): - widget.drag_source_set_icon_stock(self.get_stock()) - return True - - def column_order(self): - """ - Must be set by children. The method that obtains the column order - to be used. Format: see ColumnOrder. - """ - raise NotImplementedError - - def column_ord_setfunc(self, clist): - """ - Must be set by children. The method that stores the column order - given by clist (result of ColumnOrder class). - """ - raise NotImplementedError - - def set_column_order(self, clist): - """ - change the order of the columns to that given in clist - """ - self.column_ord_setfunc(clist) - #now we need to rebuild the model so it contains correct column info - self.dirty = True - #make sure we sort on first column. We have no idea where the - # column that was sorted on before is situated now. - self.sort_col = 0 - self.sort_order = gtk.SORT_ASCENDING - self.setup_filter() - self.build_tree() - - def build_widget(self): - """ - Builds the interface and returns a gtk.Container type that - contains the interface. This containter will be inserted into - a gtk.Notebook page. - """ - self.vbox = gtk.VBox() - self.vbox.set_border_width(4) - self.vbox.set_spacing(4) - - self.search_bar = SearchBar(self.dbstate, self.uistate, - self.search_build_tree) - filter_box = self.search_bar.build() - - self.list = gtk.TreeView() - self.list.set_rules_hint(True) - self.list.set_headers_visible(True) - self.list.set_headers_clickable(True) - self.list.set_fixed_height_mode(True) - self.list.connect('button-press-event', self._button_press) - self.list.connect('key-press-event', self._key_press) - if self.drag_info(): - self.list.connect('drag_data_get', self.drag_data_get) - self.list.connect('drag_begin', self.drag_begin) - - scrollwindow = gtk.ScrolledWindow() - scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - scrollwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) - scrollwindow.add(self.list) - - self.vbox.pack_start(filter_box, False) - self.vbox.pack_start(scrollwindow, True) - - self.renderer = gtk.CellRendererText() - self.renderer.set_property('ellipsize', pango.ELLIPSIZE_END) - self.inactive = False - - self.columns = [] - self.build_columns() - self.selection = self.list.get_selection() - if self.multiple_selection: - self.selection.set_mode(gtk.SELECTION_MULTIPLE) - self.selection.connect('changed', self.row_changed) - - self.setup_filter() - - if self.filter_class: - return self.build_filter_container(self.vbox, self.filter_class) - else: - return self.vbox - - def search_build_tree(self): - self.build_tree() - - def row_changed(self, obj): - """Called with a row is changed. Check the selected objects from - the person_tree to get the IDs of the selected objects. Set the - active person to the first person in the list. If no one is - selected, set the active person to None""" - - if self.drag_info(): - selected_ids = self.selected_handles() - - if len(selected_ids) == 1: - self.list.drag_source_set(gtk.gdk.BUTTON1_MASK, - [self.drag_info().target()], - gtk.gdk.ACTION_COPY) - - def drag_data_get(self, widget, context, sel_data, info, time): - selected_ids = self.selected_handles() - - if selected_ids: - data = (self.drag_info().drag_type, id(self), selected_ids[0], 0) - sel_data.set(sel_data.target, 8 , pickle.dumps(data)) - return True - - def setup_filter(self): - """Build the default filters and add them to the filter menu.""" - cols = [] - for pair in [pair for pair in self.column_order() if pair[0]]: - cols.append((self.colinfo[pair[1]], pair[1])) - self.search_bar.setup_filter(cols) - - def goto_handle(self, handle): - if not handle or self.inactive: - return - - # mark inactive to prevent recursion - self.inactive = True - - # select the handle in the view - try: - path = self.model.on_get_path(handle) - self.selection.unselect_all() - self.selection.select_path(path) - self.list.scroll_to_cell(path, None, 1, 0.5, 0) - except KeyError: - self.selection.unselect_all() - - # disable the inactive flag - self.inactive = False - - def __display_column_sort(self): - for i in xrange(len(self.columns)): - enable_sort_flag = (i==self.sort_col) - self.columns[i].set_sort_indicator(enable_sort_flag) - self.columns[self.sort_col].set_sort_order(self.sort_order) - - def column_clicked(self, obj, data): - cput = time.clock() - same_col = False - if self.sort_col != data: - order = gtk.SORT_ASCENDING - else: - same_col = True - if (self.columns[data].get_sort_order() == gtk.SORT_DESCENDING - or not self.columns[data].get_sort_indicator()): - order = gtk.SORT_ASCENDING - else: - order = gtk.SORT_DESCENDING - - self.sort_col = data - self.sort_order = order - handle = self.first_selected() - - if config.get('interface.filter'): - search = (True, self.generic_filter) - else: - search = (False, self.search_bar.get_value()) - - if same_col: - self.model.reverse_order() - else: - self.model = self.make_model(self.dbstate.db, self.sort_col, - self.sort_order, - search=search, - sort_map=self.column_order()) - - self.list.set_model(self.model) - self.__display_column_sort() - - if handle: - self.goto_handle(handle) - - # set the search column to be the sorted column - search_col = self.column_order()[data][1] - self.list.set_search_column(search_col) - _LOG.debug(' ' + self.__class__.__name__ + ' column_clicked ' + - str(time.clock() - cput) + ' sec') - - def build_columns(self): - for column in self.columns: - self.list.remove_column(column) - - self.columns = [] - - index = 0 - for pair in [pair for pair in self.column_order() if pair[0]]: - name = self.colinfo[pair[1]] - - if self.model and 'marker_color_column' in self.model.__dict__: - mcol = self.model.marker_color_column - column = gtk.TreeViewColumn(name, self.renderer, text=pair[1], - foreground=mcol) - else: - column = gtk.TreeViewColumn(name, self.renderer, text=pair[1]) - - column.connect('clicked', self.column_clicked, index) - column.set_resizable(True) - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - column.set_fixed_width(pair[2]) - column.set_clickable(True) - self.columns.append(column) - self.list.append_column(column) - index += 1 - - def build_tree(self): - if self.active: - cput = time.clock() - if config.get('interface.filter'): - filter_info = (True, self.generic_filter) - else: - filter_info = (False, self.search_bar.get_value()) - - if self.dirty or self.model is None \ - or not self.model.node_map.full_srtkey_hndl_map(): - self.model = self.make_model(self.dbstate.db, self.sort_col, - search=filter_info, - sort_map=self.column_order()) - else: - #the entire data to show is already in memory. - #run only the part that determines what to show - self.list.set_model(None) - self.model.set_search(filter_info) - self.model.rebuild_data() - - self.build_columns() - self.list.set_model(self.model) - self.__display_column_sort() - - if const.USE_TIPS and self.model.tooltip_column is not None: - self.tooltips = TreeTips.TreeTips( - self.list, self.model.tooltip_column, True) - self.dirty = False - self.uistate.show_filter_results(self.dbstate, - self.model.displayed(), - self.model.total()) - _LOG.debug(self.__class__.__name__ + ' build_tree ' + - str(time.clock() - cput) + ' sec') - - else: - self.dirty = True - - def object_build(self): - """callback, for if tree must be rebuilt and bookmarks redrawn - """ - self.dirty = True - if self.active: - self.bookmarks.redraw() - self.build_tree() - - def filter_toggle_action(self, obj): - if obj.get_active(): - self.search_bar.hide() - self.filter_pane.show() - active = True - else: - self.search_bar.show() - self.filter_pane.hide() - active = False - config.set('interface.filter', active) - self.build_tree() - - def filter_editor(self, obj): - from FilterEditor import FilterEditor - - try: - FilterEditor(self.FILTER_TYPE , const.CUSTOM_FILTERS, - self.dbstate, self.uistate) - except Errors.WindowActiveError: - return - - def change_db(self, db): - self._change_db(db) - for sig in self.signal_map: - self.callman.add_db_signal(sig, self.signal_map[sig]) - self.bookmarks.update_bookmarks(self.get_bookmarks()) - if self.active: - #force rebuild of the model on build of tree - self.dirty = True - self.build_tree() - self.bookmarks.redraw() - else: - self.dirty = True - - def row_add(self, handle_list): - if self.active: - cput = time.clock() - for handle in handle_list: - self.model.add_row_by_handle(handle) - _LOG.debug(' ' + self.__class__.__name__ + ' row_add ' + - str(time.clock() - cput) + ' sec') - self.uistate.show_filter_results(self.dbstate, - self.model.displayed(), - self.model.total()) - else: - self.dirty = True - - def row_update(self, handle_list): - if self.model: - self.model.prev_handle = None - if self.active: - cput = time.clock() - for handle in handle_list: - self.model.update_row_by_handle(handle) - _LOG.debug(' ' + self.__class__.__name__ + ' row_update ' + - str(time.clock() - cput) + ' sec') - else: - self.dirty = True - - def row_delete(self, handle_list): - if self.active: - cput = time.clock() - for handle in handle_list: - self.model.delete_row_by_handle(handle) - _LOG.debug(' ' + self.__class__.__name__ + ' row_delete ' + - str(time.clock() - cput) + ' sec') - self.uistate.show_filter_results(self.dbstate, - self.model.displayed(), - self.model.total()) - else: - self.dirty = True - - def define_actions(self): - """ - Required define_actions function for PageView. Builds the action - group information required. We extend beyond the normal here, - since we want to have more than one action group for the PersonView. - Most PageViews really won't care about this. - """ - - BookMarkView.define_actions(self) - - self.edit_action = gtk.ActionGroup(self.title + '/ChangeOrder') - self.edit_action.add_actions([ - ('Add', gtk.STOCK_ADD, _("_Add..."), "Insert", - self.ADD_MSG, self.add), - ('Remove', gtk.STOCK_REMOVE, _("_Remove"), "Delete", - self.DEL_MSG, self.remove), - ('ExportTab', None, _('Export View...'), None, None, self.export), - ]) - - self._add_action_group(self.edit_action) - - self._add_action('Edit', gtk.STOCK_EDIT, _("action|_Edit..."), - accel="Return", - tip=self.EDIT_MSG, - callback=self.edit) - - self._add_toggle_action('Filter', None, _('_Filter'), - callback=self.filter_toggle_action) - - def _column_editor(self, obj): - """ - Causes the View to display a column editor. This should be overridden - by any class that provides columns (such as a list based view) - """ - raise NotImplemented - - def _button_press(self, obj, event): - if not self.dbstate.open: - return False - from QuickReports import create_quickreport_menu - if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: - self.edit(obj) - return True - elif event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: - menu = self.uistate.uimanager.get_widget('/Popup') - #construct quick reports if needed - if menu and self.QR_CATEGORY > -1 : - qr_menu = self.uistate.uimanager.\ - get_widget('/Popup/QuickReport').get_submenu() - if qr_menu : - self.uistate.uimanager.\ - get_widget('/Popup/QuickReport').remove_submenu() - reportactions = [] - if menu and self.dbstate.active: - (ui, reportactions) = create_quickreport_menu( - self.QR_CATEGORY, - self.dbstate, - self.uistate, - self.first_selected()) - if len(reportactions) > 1 : - qr_menu = gtk.Menu() - for action in reportactions[1:] : - add_menuitem(qr_menu, action[2], None, action[5]) - self.uistate.uimanager.get_widget('/Popup/QuickReport').\ - set_submenu(qr_menu) - if menu: - menu.popup(None, None, None, event.button, event.time) - return True - - return False - - def _key_press(self, obj, event): - if not self.dbstate.open: - return False - if not event.state or event.state in (gtk.gdk.MOD2_MASK, ): - if event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter): - self.edit(obj) - return True - return False - - def change_page(self): - if self.model: - self.uistate.show_filter_results(self.dbstate, - self.model.displayed(), - self.model.total()) - self.edit_action.set_sensitive(not self.dbstate.db.readonly) - - def key_delete(self): - self.remove(None) - - def export(self, obj): - chooser = gtk.FileChooserDialog( - _("Export View as Spreadsheet"), - self.uistate.window, - gtk.FILE_CHOOSER_ACTION_SAVE, - (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK)) - chooser.set_do_overwrite_confirmation(True) - - combobox = gtk.combo_box_new_text() - label = gtk.Label(_("Format:")) - label.set_alignment(1.0, 0.5) - box = gtk.HBox() - box.pack_start(label, True, True, padding=12) - box.pack_start(combobox, False, False) - combobox.append_text(_('CSV')) - combobox.append_text(_('Open Document Spreadsheet')) - combobox.set_active(0) - box.show_all() - chooser.set_extra_widget(box) - - while True: - value = chooser.run() - fn = chooser.get_filename() - fl = combobox.get_active() - if value == gtk.RESPONSE_OK: - if fn: - chooser.destroy() - break - else: - chooser.destroy() - return - self.write_tabbed_file(fn, fl) - - def write_tabbed_file(self, name, type): - """ - Write a tabbed file to the specified name. - - The output file type is determined by the type variable. - """ - from docgen import CSVTab, ODSTab - ofile = None - data_cols = [pair[1] for pair in self.column_order() if pair[0]] - - column_names = [self.colinfo[i] for i in data_cols] - if type == 0: - ofile = CSVTab(len(column_names)) - else: - ofile = ODSTab(len(column_names)) - - ofile.open(name) - ofile.start_page() - ofile.start_row() - for name in column_names: - ofile.write_cell(name) - ofile.end_row() - - for row in self.model: - ofile.start_row() - for index in data_cols: - ofile.write_cell(row[index]) - ofile.end_row() - ofile.end_page() - ofile.close() - diff --git a/src/gui/grampsgui.py b/src/gui/grampsgui.py index 8d3f6e5b4..3c067192f 100644 --- a/src/gui/grampsgui.py +++ b/src/gui/grampsgui.py @@ -62,13 +62,13 @@ from QuestionDialog import ErrorDialog import config import Utils from gui.pluginmanager import GuiPluginManager -from gen.plug import (VIEW_MISC, VIEW_PERSON, VIEW_REL, VIEW_FAMILY, - VIEW_EVENT, VIEW_PLACE, VIEW_SOURCE, VIEW_REPO, VIEW_MEDIA, - VIEW_NOTE, VIEW_GEO) +from gen.plug import (VIEW_MISC, VIEW_PERSON, VIEW_REL, VIEW_FAMILY, + VIEW_EVENT, VIEW_PLACE, VIEW_GEO, VIEW_SOURCE, VIEW_REPO, + VIEW_MEDIA, VIEW_NOTE) DEFAULT_SIDEBAR_ORDER = (VIEW_MISC, VIEW_PERSON, VIEW_REL, VIEW_FAMILY, - VIEW_EVENT, VIEW_PLACE, VIEW_SOURCE, VIEW_REPO, VIEW_MEDIA, - VIEW_NOTE, VIEW_GEO) + VIEW_EVENT, VIEW_PLACE, VIEW_GEO, VIEW_SOURCE, VIEW_REPO, + VIEW_MEDIA, VIEW_NOTE) #------------------------------------------------------------------------- # # Functions @@ -112,11 +112,12 @@ def register_stock_icons (): #('gramps-bookmark', _('Bookmarks'), gtk.gdk.CONTROL_MASK, 0, ''), #('gramps-bookmark-delete', _('Delete bookmark'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-bookmark-edit', _('Organize Bookmarks'), gtk.gdk.CONTROL_MASK, 0, ''), - ('gramps-bookmark-new', _('Add Bookmark'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-config', _('Configure'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-date', _('Date'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-date-edit', _('Edit Date'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-event', _('Events'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-family', _('Family'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-fanchart', _('Fan Chart'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-font', _('Font'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-font-color', _('Font Color'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-font-bgcolor', _('Font Background Color'), gtk.gdk.CONTROL_MASK, 0, ''), @@ -137,8 +138,11 @@ def register_stock_icons (): ('gramps-reports', _('Reports'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-repository', _('Repositories'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-source', _('Sources'), gtk.gdk.CONTROL_MASK, 0, ''), - ('gramps-spouse', _('Add Spouse'), gtk.gdk.CONTROL_MASK, 0, ''), - ('gramps-tools', _('Tools'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-spouse', _('Add Spouse'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-tools', _('Tools'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-tree-group', _('Grouped List'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-tree-list', _('List'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-tree-select', _('Select'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-unlock', _('Private'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-viewmedia', _('View'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-zoom-in', _('Zoom In'), gtk.gdk.CONTROL_MASK, 0, ''), diff --git a/src/gui/viewmanager.py b/src/gui/viewmanager.py index ad7fc10de..63e1cc04f 100644 --- a/src/gui/viewmanager.py +++ b/src/gui/viewmanager.py @@ -116,10 +116,13 @@ UIDEFAULT = ''' + - + + + @@ -156,11 +159,15 @@ UIDEFAULT = ''' - - - + + + + + + + @@ -179,6 +186,20 @@ UIDEFAULT = ''' ''' +UICATEGORY = ''' + + + %s + + + + + %s + + + +''' + WIKI_HELP_PAGE_FAQ = '%s_-_FAQ' % const.URL_MANUAL_PAGE WIKI_HELP_PAGE_KEY = '%s_-_Keybindings' % const.URL_MANUAL_PAGE WIKI_HELP_PAGE_MAN = '%s' % const.URL_MANUAL_PAGE @@ -395,7 +416,7 @@ class ViewManager(CLIManager): connects the signals needed """ self.window.connect('delete-event', self.quit) - self.notebook.connect('switch-page', self.change_page) + self.notebook.connect('switch-page', self.change_category) def __init_lists(self): """ @@ -477,7 +498,10 @@ class ViewManager(CLIManager): _("Open the tools dialog"), self.tools_clicked), ('EditMenu', None, _('_Edit')), ('BookMenu', None, _('_Bookmarks')), - ('ToolsMenu', None, _('_Tools')), + ('ToolsMenu', None, _('_Tools')), + ('ConfigView', 'gramps-config', _('_Configure View...'), + 'c', _('Configure the active view'), + self.config_view), ] self._file_toggle_action_list = [ @@ -488,7 +512,7 @@ class ViewManager(CLIManager): ('Filter', None, _('_Filter Sidebar'), None, None, filter_toggle, self.show_filter), ('Fullscreen', None, _('F_ull Screen'), "F11", None, - self.fullscreen_toggle, self.fullscreen), + self.fullscreen_toggle, self.fullscreen), ] self._undo_action_list = [ @@ -811,6 +835,22 @@ class ViewManager(CLIManager): self.window.unfullscreen() config.set('interface.fullscreen', False) config.save() + + def view_toggle(self, radioaction, current, category_page): + """ + Go to the views in category_page, with in category: view_page + The view has id id_page + This is the only method that can call change of views in a category + """ + self.__vb_handlers_block() + if self.notebook.get_current_page() != category_page: + raise Error, 'Error changing view, category is not active' + cat_notebook = self.notebook_cat[category_page] + view_page = radioaction.get_current_value() + if self.notebook_cat[category_page].get_current_page() != view_page: + self.notebook_cat[category_page].set_current_page(view_page) + self.__change_view(category_page, view_page) + self.__vb_handlers_unblock() def __switch_page_on_dnd(self, widget, context, xpos, ypos, time, page_no): """ @@ -835,6 +875,9 @@ class ViewManager(CLIManager): """ self.pages = [] self.prev_nav = PageView.NAVIGATION_NONE + self.ui_category = {} + self.view_toggle_actions = {} + self.cat_view_group = None use_text = config.get('interface.sidebar-text') @@ -842,14 +885,17 @@ class ViewManager(CLIManager): for cat_views in self.views: #for every category, we create a button in the sidebar and a main #workspace in which to show the view - first = True nr_views = len(cat_views) + uimenuitems = '' + uitoolitems = '' + self.view_toggle_actions[index] = [] self.pages.append([]) + nrpage = 0 for id, page_def in cat_views: page = page_def(self.dbstate, self.uistate) page_title = page.get_title() page_stock = page.get_stock() - if first: + if nrpage == 0: #the first page of this category, used to obtain #category workspace notebook notebook = gtk.Notebook() @@ -874,7 +920,6 @@ class ViewManager(CLIManager): button = self.__make_sidebar_button(use_text, index, page_title, page_stock) - index += 1 self.bbox.pack_start(button, False) self.buttons.append(button) @@ -891,13 +936,37 @@ class ViewManager(CLIManager): page_no = self.notebook_cat[-1].append_page(page_display, gtk.Label(page_title)) self.pages[-1].append(page) + pageid = (id + '_%i' % nrpage) + uimenuitems += '\n' % pageid + uitoolitems += '\n' % pageid + self.view_toggle_actions[index].append((pageid, + page.get_viewtype_stock(), + page_title, '%i' % (nrpage+1), page_title, + nrpage)) - first = False + nrpage += 1 + if nr_views > 1: + #allow for switching views in a category + self.ui_category[index] = UICATEGORY % (uimenuitems, + uitoolitems) + index += 1 + current_cat, current_cat_view = self.__view_to_show( + config.get('preferences.use-last-view')) + + self.active_page = self.pages[current_cat][current_cat_view] + self.buttons[current_cat].set_active(True) + self.active_page.set_active() + self.notebook.set_current_page(current_cat) + self.notebook_cat[current_cat].set_current_page(current_cat_view) + + def __view_to_show(self, use_last = True): + """ + Determine based on preference setting which view should be shown + """ current_cat = 0 current_cat_view = 0 - use_current = config.get('preferences.use-last-view') - if use_current: + if use_last: current_page_id = config.get('preferences.last-view') found = False for cat_views in self.views: @@ -914,12 +983,7 @@ class ViewManager(CLIManager): if not found: current_cat = 0 current_cat_view = 0 - - self.active_page = self.pages[current_cat][current_cat_view] - self.buttons[current_cat].set_active(True) - self.active_page.set_active() - self.notebook.set_current_page(current_cat) - self.notebook_cat[current_cat].set_current_page(current_cat_view) + return current_cat, current_cat_view def __make_sidebar_button(self, use_text, index, page_title, page_stock): """ @@ -1011,10 +1075,13 @@ class ViewManager(CLIManager): self.active_page.set_inactive() groups = self.active_page.get_actions() for grp in groups: - if grp in self.uimanager.get_action_groups(): + if grp in self.uimanager.get_action_groups(): self.uimanager.remove_action_group(grp) + if self.cat_view_group: + if self.cat_view_group in self.uimanager.get_action_groups(): + self.uimanager.remove_action_group(self.cat_view_group) - def __connect_active_page(self): + def __connect_active_page(self, category_page, view_page): """ Inserts the action groups associated with the current page into the UIManager @@ -1028,6 +1095,18 @@ class ViewManager(CLIManager): for uidef in self.active_page.additional_ui_definitions(): mergeid = self.uimanager.add_ui_from_string(uidef) self.merge_ids.append(mergeid) + + if category_page in self.ui_category: + #add entries for the different views in the category + self.cat_view_group = gtk.ActionGroup('categoryviews') + self.cat_view_group.add_radio_actions( + self.view_toggle_actions[category_page], value=view_page, + on_change=self.view_toggle, user_data=category_page) + self.cat_view_group.set_sensitive(True) + self.uimanager.insert_action_group(self.cat_view_group, 1) + mergeid = self.uimanager.add_ui_from_string(self.ui_category[ + category_page]) + self.merge_ids.append(mergeid) def __setup_navigation(self): """ @@ -1042,38 +1121,56 @@ class ViewManager(CLIManager): if nav_type[0] is not None: nav_type[0].enable() - def change_page(self, obj, page, num=-1): + def change_category(self, obj, page, num=-1): """ - Wrapper for the __do_change_page, to prevent entering into the + Wrapper for the __do_change_category, to prevent entering into the routine while already in it. """ if not self.page_is_changing: self.page_is_changing = True - self.__do_change_page(num) + self.__do_change_category(num) self.page_is_changing = False - def __do_change_page(self, num): + def __do_change_category(self, num): """ - Change the page to the new page + Change the category to the new category """ if num == -1: num = self.notebook.get_current_page() - num_view = self.notebook_cat[num].get_current_page() # set button of current page active self.__set_active_button(num) + # now do view specific change + self.__change_view(num) + def __change_view(self, category_page, view_page=-1): + """ + Change a view in a category. + + :Param category_page: the category number the view is in + :Type category_page: integer >= 0 + + :Param view_page: the view page number to switch to. If -1 is passed + the currently already active view in the category is switched to. + Use this when a category changes. + :Type view_page: integer >=0 to switch to a specific page, or -1 to + switch to the active view in the category + """ + if view_page == -1: + #just show active one + view_page = self.notebook_cat[category_page].get_current_page() if self.dbstate.open: self.__disconnect_previous_page() if len(self.pages) > 0: - self.active_page = self.pages[num][num_view] + self.active_page = self.pages[category_page][view_page] self.active_page.set_active() - config.set('preferences.last-view', self.views[num][num_view][0]) + config.set('preferences.last-view', + self.views[category_page][view_page][0]) config.save() self.__setup_navigation() - self.__connect_active_page() + self.__connect_active_page(category_page, view_page) self.uimanager.ensure_update() @@ -1161,7 +1258,7 @@ class ViewManager(CLIManager): self.setup_bookmarks() - self.change_page(None, None) + self.change_category(None, None) self.actiongroup.set_visible(True) self.readonlygroup.set_visible(True) @@ -1286,6 +1383,12 @@ class ViewManager(CLIManager): except Errors.WindowActiveError: return + def config_view(self, obj): + """ + Displays the configuration dialog for the active view + """ + pass + def undo(self, obj): """ Calls the undo function on the database diff --git a/src/gui/views/listview.py b/src/gui/views/listview.py index 441d0b64a..cb18a6df8 100644 --- a/src/gui/views/listview.py +++ b/src/gui/views/listview.py @@ -306,6 +306,11 @@ class ListView(NavigationView): self.search_bar.show() self.filter_pane.hide() + def get_viewtype_stock(self): + """Type of view in category, default listview is a flat list + """ + return 'gramps-tree-list' + def filter_clicked(self): self.generic_filter = self.filter_sidebar.get_filter() self.build_tree() diff --git a/src/gui/views/pageview.py b/src/gui/views/pageview.py index 8cc2446ed..00a6200b9 100644 --- a/src/gui/views/pageview.py +++ b/src/gui/views/pageview.py @@ -161,11 +161,18 @@ class PageView(DbGUIElement): def get_stock(self): """ - Return image associated with the view, which is used for the + Return image associated with the view category, which is used for the icon for the button. """ return gtk.STOCK_MISSING_IMAGE - + + def get_viewtype_stock(self): + """ + Return immage associated with the viewtype inside a view category, it + will be used for the icon on the button to select view in the category + """ + return gtk.STOCK_MISSING_IMAGE + def get_title(self): """ Return the title of the view. This is used to define the text for the diff --git a/src/images/16x16/Makefile.am b/src/images/16x16/Makefile.am index 20d58210f..0d00c1df4 100644 --- a/src/images/16x16/Makefile.am +++ b/src/images/16x16/Makefile.am @@ -38,6 +38,9 @@ dist_pkgdata_DATA = \ gramps-source.png \ gramps-spouse.png \ gramps-tools.png \ + gramps-tree-group.png \ + gramps-tree-list.png \ + gramps-tree-select.png \ gramps-unlock.png \ gramps-viewmedia.png \ gramps-zoom-best-fit.png \ diff --git a/src/images/16x16/gramps-tree-group.png b/src/images/16x16/gramps-tree-group.png new file mode 100644 index 0000000000000000000000000000000000000000..077f07425c389bb38b190dc84c123cc9b1b47386 GIT binary patch literal 555 zcmV+`0@VG9P)RxqTzAXTpG*53#)4Z}Qi}85Odc6jq+wD>+mG;D1YeY0aWB_1U767eQi!clUC>Dzu zp@<+Nk-_#`fn1rU`7CnOH8zOe8H43=Nwr$#?(Qe6)e3;&@H6Fdc`MLavE&HCFhnWE z<>jY6+~*9096>(oKJp6)7K;TB55I9;7ZIV~?{R>!C;?2DFe&0==IKb zn4-D3=x5eiM|2qiA6s}OO*OD2Cqok_< tU{CE)d`P>er1nZq2Ghx8^x^$S{sX00SB_IL;#vRz002ovPDHLkV1i~I?6Lp= literal 0 HcmV?d00001 diff --git a/src/images/16x16/gramps-tree-list.png b/src/images/16x16/gramps-tree-list.png new file mode 100644 index 0000000000000000000000000000000000000000..57dd66b74004c7900204e705121b90a5cfd85b57 GIT binary patch literal 488 zcmVP)%!H&( zfzfExh?gY$NGcu7ug#1Kp&`(KmHgKhkc8MmaDV>*fOC#4%lP}x z0YMNDh7M`%3=jmxAW;`E6^Ch>HZY?oDyOcPfpuE#HkJhKJnMB>i`Zrxs~XJbb0p!M zV=x$y=Xo_1RUA%Ej@jGW^_>f=doyD)nfUx9ad>#pj9OCEEd=;le9e5d{a>}WYPrE8 e&u3?+=llXo-d1pN^#%9<000051^Waw8m`N~IdR$Jb z5|76*O%ruI?oTU~=b@0n$FI9o4s4>)F8p3Mz0m+e2|u~TLqu#W%fhlOY+DdfRGSd) zomY1@N)<~kUobhcx=Hi|5D`QyQi&ktdXRK_nBn0x>2w;?G!YS66x;wy8`ZikZVZ=j zRBIq2M7j+2%2lppLL4`22lQmAgJ1xJ{Py;4*~*NMMkxL|B$@DGc$9kGra$K6#mo0h z4%q;Vj*b$G#o7!EfCt%grNW+_8S@*|>PLtOd;1nW5ii{~)O-U>PxqtR?7x$N8^H9r z<;zBuYE3viY9ON2>OwH!!M25<;X2d8DF%vi>uQuY`5kUwOR!z4(iQTtvQg#rLW$Wi zi}m$&RF!BnN-$`io&lZq`@1ytLC*^412M}lbECr)Au#5s2|P@2K{d>&QB z!s>7nw41lfTR<1RqlU+Mv j^`A5-77DrXu}k~~&U15cr##tB00000NkvXXu0mjfJ%&xD literal 0 HcmV?d00001 diff --git a/src/images/16x16/source/gramps-tree-group.svg b/src/images/16x16/source/gramps-tree-group.svg new file mode 100644 index 000000000..c4552579c --- /dev/null +++ b/src/images/16x16/source/gramps-tree-group.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + tree list + 2005-10-29 + + + Benny Malengier + + + + + justify + left + + + + based on justify, left, Andreas Nilsson + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/16x16/source/gramps-tree-list.svg b/src/images/16x16/source/gramps-tree-list.svg new file mode 100644 index 000000000..d86a8fda0 --- /dev/null +++ b/src/images/16x16/source/gramps-tree-list.svg @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + tree list + 2005-10-29 + + + Benny Malengier + + + + + justify + left + + + + based on justify, left, Andreas Nilsson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/16x16/source/gramps-tree-select.svg b/src/images/16x16/source/gramps-tree-select.svg new file mode 100644 index 000000000..00ce3efdc --- /dev/null +++ b/src/images/16x16/source/gramps-tree-select.svg @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + tree list select + 2005-10-29 + + + Benny Malengier + + + + + justify + left + + + + based on justify, left, Andreas Nilsson, and gramps-parents-open + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/22x22/Makefile.am b/src/images/22x22/Makefile.am index 1578603bb..cb749ad65 100644 --- a/src/images/22x22/Makefile.am +++ b/src/images/22x22/Makefile.am @@ -38,6 +38,9 @@ dist_pkgdata_DATA = \ gramps-source.png \ gramps-spouse.png \ gramps-tools.png \ + gramps-tree-group.png \ + gramps-tree-list.png \ + gramps-tree-select.png \ gramps-unlock.png \ gramps-viewmedia.png \ gramps-zoom-best-fit.png \ diff --git a/src/images/22x22/gramps-tree-group.png b/src/images/22x22/gramps-tree-group.png new file mode 100644 index 0000000000000000000000000000000000000000..15850551647cb18f4340c01668c6a4b8cf2d556b GIT binary patch literal 776 zcmV+j1NZ!iP)Hq)$8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10)>D?3zOhWp!hej5-o-_$~vLrcwxr zQmLeXb@f6>5QR|58W;c=V^~~VOr*K6a6Rd%GQ*Idx}31W_kUt%=c5*^Uaw!QL9zctsnqWN(dp)XfzV( zuC1*>?Fik9culc_aC+K?ZQF2NS4*{AE`u?a37hQegkr-GkkW){=Atx*trUVW7Ck4y zqZKJ&5TV!m1;@F9rKP2e>QAnEpiGa2knlVY`}<$CB2}x^Q9&n1T)gGwTL9uOpr+Vy z91sy!S64M9xm*q_E4QPf#ZVfxTQXz>HiY2gzr=7=ixCHn^Ccz7aP)csKmLAPh`{gO zzW*^bb#+&8kvF95>3->#$JtE|zuPVJ`+@gq_p`?sHq)$8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10%}P_K~y-6rIbx;6G0fq|2w-`YTKn+l7NN8Qv((nAteo%K%+^p zH`9|n_zgUZ;0F-Yv!6i3W4+Z#g$k6Ntgfcs&B=3f_>WLERqb@z&t5!#c_}%4cOGm#e5xo)eK0#Gg-Y%C* zI5_wUfV@IHL{UVw`uJ+&ot|<_C<+Y2;FBduf}$uPAYj`Hg5WWpk&0L>=9HTa5Jd^`c$_cawRYS5d73d1 z;qb7D(P+fM*=!cgX45yu8;mg&3WXWQ1Xz}ZVsVRa%J?dkN)B-H=DGG0z~h(odL61d z;sZ7|GB`T==Ckx#Gsck5-=Cfe0$^E$bow4F%iYEaO_O=9HTqxm*s7M#Hy!Z!pGCE*Bj*n`TU?R4Sno+TMNyOgI$5K5uZa zC`n9~<-jEGdfa~3-Vf9?ot^wRQ8@U+`;UXArJMT_lNQBDMDyos!oPBY;h)P(#W3{Y f=lw53K@iwqBbx>`v|=}i00000NkvXXu0mjf5Oqsw literal 0 HcmV?d00001 diff --git a/src/images/22x22/gramps-tree-select.png b/src/images/22x22/gramps-tree-select.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2573df65d700e814ca0e906db8e342ae5b44fb GIT binary patch literal 1022 zcmVHq)$8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11A9qCK~y-6m6J_q990~^fAe-`GW*pg&Bka=Hm#aA2C|VYn3|+i zn??gIwiQLFUaZoK2T!HoLGRvr5Qbt?g%lwZ(smxt^O`o-b#Yx6$8pr&Li%bd zcS|?)8e&u+# zpTE~6QWje{q?1f%IeEO5r;bE9+}=_&t7%fIdSig6{R^M3WsY4r+T~+2vxAf&q?A~O zB9(S{qTS%*&+hV4&p&m}KA(?^7cVq6?u(?-50K9o|7jg9RBYfFu)K8?V8 zA7^G}$mQ~-2`5g(xp(j9D$7c1Ap|2M!_8Bn04Wu**x>H1D=riW1c}GvHOAHOeT`8H zr6kGZ2CnOt0H$fOzP?@qfXZ?Ug@UDiQ{zm=rcfx9K#@p>x6fS|k`ts|{!Go=ny3j*D!zfhe stKOzAAHYsF8+KjCo|^pL)-+B03)N?FKee7EVE_OC07*qoM6N<$f(1_NR{#J2 literal 0 HcmV?d00001 diff --git a/src/images/48x48/Makefile.am b/src/images/48x48/Makefile.am index f47c9ae26..60d075f8b 100644 --- a/src/images/48x48/Makefile.am +++ b/src/images/48x48/Makefile.am @@ -11,10 +11,12 @@ dist_pkgdata_DATA = \ gramps-bookmark-edit.png \ gramps-bookmark-new.png \ gramps-bookmark.png \ + gramps-config.png \ gramps-date-edit.png \ gramps-date.png \ gramps-event.png \ gramps-family.png \ + gramps-fanchart.png \ gramps-font-bgcolor.png \ gramps-font-color.png \ gramps-font.png \ @@ -38,7 +40,11 @@ dist_pkgdata_DATA = \ gramps-source.png \ gramps-spouse.png \ gramps-tools.png \ + gramps-tree-group.png \ + gramps-tree-list.png \ + gramps-tree-select.png \ gramps-unlock.png \ + gramps-view.png \ gramps-viewmedia.png \ gramps-zoom-best-fit.png \ gramps-zoom-fit-width.png \ diff --git a/src/images/48x48/gramps-config.png b/src/images/48x48/gramps-config.png new file mode 100644 index 0000000000000000000000000000000000000000..e874391d9862d095c0d4c8913e29566b81207026 GIT binary patch literal 3661 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 Hu0mjfo+)cj literal 0 HcmV?d00001 diff --git a/src/images/48x48/gramps-tree-select.png b/src/images/48x48/gramps-tree-select.png new file mode 100644 index 0000000000000000000000000000000000000000..180d83f53c60483608af0c7c7a716e53d1c9004a GIT binary patch literal 2416 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 LNkvXXu0mjfp56u& literal 0 HcmV?d00001 diff --git a/src/images/scalable/Makefile.am b/src/images/scalable/Makefile.am index 887f89b82..4dbeb47d8 100644 --- a/src/images/scalable/Makefile.am +++ b/src/images/scalable/Makefile.am @@ -11,10 +11,12 @@ dist_pkgdata_DATA = \ gramps-bookmark-edit.svg \ gramps-bookmark-new.svg \ gramps-bookmark.svg \ + gramps-config.png \ gramps-date-edit.svg \ gramps-date.svg \ gramps-event.svg \ gramps-family.svg \ + gramps-fanchart.png \ gramps-font-bgcolor.svg \ gramps-font-color.svg \ gramps-font.svg \ @@ -38,7 +40,11 @@ dist_pkgdata_DATA = \ gramps-source.svg \ gramps-spouse.svg \ gramps-tools.svg \ + gramps-tree-group.png \ + gramps-tree-list.png \ + gramps-tree-select.png \ gramps-unlock.svg \ + gramps-view.svg \ gramps-viewmedia.svg \ gramps-zoom-best-fit.svg \ gramps-zoom-fit-width.svg \ diff --git a/src/images/scalable/gramps-config.svg b/src/images/scalable/gramps-config.svg new file mode 100644 index 000000000..0d3b2bab8 --- /dev/null +++ b/src/images/scalable/gramps-config.svg @@ -0,0 +1,864 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Benny Malengi + + + http://jimmac.musichall.cz + + Config view gramps + + + preferences + settings + control panel + tweaks + system + + + Based on icons of Jakub Steiner, http://jimmac.musichall.cz/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/scalable/gramps-fanchart.svg b/src/images/scalable/gramps-fanchart.svg new file mode 100644 index 000000000..1dadfd0f4 --- /dev/null +++ b/src/images/scalable/gramps-fanchart.svg @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + application + gramps + pedigree + + + + + B. Malengier + + + GRAMPS + + + + rework of original design of Don Allingham + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/scalable/gramps-gramplet.svg b/src/images/scalable/gramps-gramplet.svg index dc6e70e1a..55c858d69 100644 --- a/src/images/scalable/gramps-gramplet.svg +++ b/src/images/scalable/gramps-gramplet.svg @@ -2,7 +2,7 @@ + + rdf:resource="http://creativecommons.org/licenses/by/3.0/" /> release of GRAMPS @@ -992,19 +999,17 @@ + rdf:about="http://creativecommons.org/licenses/by/3.0/"> + rdf:resource="http://creativecommons.org/ns#Reproduction" /> + rdf:resource="http://creativecommons.org/ns#Distribution" /> + rdf:resource="http://creativecommons.org/ns#Notice" /> + rdf:resource="http://creativecommons.org/ns#Attribution" /> - + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> diff --git a/src/images/scalable/gramps-parents-open.svg b/src/images/scalable/gramps-parents-open.svg index 8165c75fa..e1fa55d1d 100644 --- a/src/images/scalable/gramps-parents-open.svg +++ b/src/images/scalable/gramps-parents-open.svg @@ -2,7 +2,7 @@ + @@ -699,7 +706,7 @@ + rdf:resource="http://creativecommons.org/licenses/by/3.0/" /> Benny Malengier, book @@ -708,19 +715,17 @@ Benny Malengier, grouping + rdf:about="http://creativecommons.org/licenses/by/3.0/"> + rdf:resource="http://creativecommons.org/ns#Reproduction" /> + rdf:resource="http://creativecommons.org/ns#Distribution" /> + rdf:resource="http://creativecommons.org/ns#Notice" /> + rdf:resource="http://creativecommons.org/ns#Attribution" /> - + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> diff --git a/src/images/scalable/gramps-tree-group.svg b/src/images/scalable/gramps-tree-group.svg new file mode 100644 index 000000000..d3ae5157a --- /dev/null +++ b/src/images/scalable/gramps-tree-group.svg @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + tree list + 2005-10-29 + + + Benny Malengier + + + + + justify + left + + + + based on justify, left, Andreas Nilsson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/scalable/gramps-tree-list.svg b/src/images/scalable/gramps-tree-list.svg new file mode 100644 index 000000000..7a9a9141c --- /dev/null +++ b/src/images/scalable/gramps-tree-list.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + tree list + 2005-10-29 + + + Benny Malengier + + + + + justify + left + + + + based on justify, left, Andreas Nilsson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/scalable/gramps-tree-select.svg b/src/images/scalable/gramps-tree-select.svg new file mode 100644 index 000000000..0d62fbfb2 --- /dev/null +++ b/src/images/scalable/gramps-tree-select.svg @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + tree list select + 2005-10-29 + + + Benny Malengier + + + + + justify + left + + + + based on justify, left, Andreas Nilsson, and gramps-parents-open + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/scalable/gramps-view.svg b/src/images/scalable/gramps-view.svg new file mode 100644 index 000000000..d31099a06 --- /dev/null +++ b/src/images/scalable/gramps-view.svg @@ -0,0 +1,705 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Benny Malengi + + + http://jimmac.musichall.cz + + Config view gramps + + + preferences + settings + control panel + tweaks + system + + + Based on icons of Jakub Steiner, http://jimmac.musichall.cz/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/view/fanchartview.py b/src/plugins/view/fanchartview.py index 29cbe3fc8..080924a34 100644 --- a/src/plugins/view/fanchartview.py +++ b/src/plugins/view/fanchartview.py @@ -583,6 +583,17 @@ class FanChartView(NavigationView): context_popup_callback=self.on_popup) return self.fan + def get_stock(self): + """ + The category stock icon + """ + return 'gramps-relation' + + def get_viewtype_stock(self): + """Type of view in category + """ + return 'gramps-fanchart' + def ui_definition(self): return ''' diff --git a/src/plugins/view/geoview.py b/src/plugins/view/geoview.py index 94e78ea82..8c8a5d0f1 100644 --- a/src/plugins/view/geoview.py +++ b/src/plugins/view/geoview.py @@ -577,6 +577,19 @@ class GeoView(HtmlView): HtmlView.set_inactive(self) self.dbstate.disconnect(self.key_active_changed) + def get_stock(self): + """ + Returns the name of the stock icon to use for the display. + This assumes that this icon has already been registered + as a stock icon. + """ + return 'gramps-geo' + + def get_viewtype_stock(self): + """Type of view in category + """ + return 'gramps-geo' + def _savezoomandposition(self, timeloop=None): """ The only way we have to save the zoom and position is to change the diff --git a/src/plugins/view/grampletview.py b/src/plugins/view/grampletview.py index 3825cd4f3..4d958b609 100644 --- a/src/plugins/view/grampletview.py +++ b/src/plugins/view/grampletview.py @@ -1171,6 +1171,11 @@ class GrampletView(PageView): """ return 'gramps-gramplet' + def get_viewtype_stock(self): + """Type of view in category + """ + return 'gramps-gramplet' + def build_tree(self): return diff --git a/src/plugins/view/htmlrenderer.py b/src/plugins/view/htmlrenderer.py index 0b2dc9af0..3d77a68f3 100644 --- a/src/plugins/view/htmlrenderer.py +++ b/src/plugins/view/htmlrenderer.py @@ -546,10 +546,15 @@ class HtmlView(PageView): def get_stock(self): """ Returns the name of the stock icon to use for the display. - This assumes that this icon has already been registered with - GNOME as a stock icon. + This assumes that this icon has already been registered + as a stock icon. """ - return 'gramps-geo' + return 'gramps-view' + + def get_viewtype_stock(self): + """Type of view in category + """ + return 'gramps-view' def ui_definition(self): """ diff --git a/src/plugins/view/pedigreeview.py b/src/plugins/view/pedigreeview.py index 94659a6d7..29e1dae11 100644 --- a/src/plugins/view/pedigreeview.py +++ b/src/plugins/view/pedigreeview.py @@ -414,9 +414,12 @@ class PedigreeView(NavigationView): def get_stock(self): """ - Return the name of the stock icon to use for the display. - This assumes that this icon has already been registered with - GNOME as a stock icon. + The category stock icon + """ + return 'gramps-relation' + + def get_viewtype_stock(self): + """Type of view in category """ return 'gramps-pedigree' diff --git a/src/plugins/view/personview.py b/src/plugins/view/personview.py index a04b255ca..4ca3eb576 100644 --- a/src/plugins/view/personview.py +++ b/src/plugins/view/personview.py @@ -163,6 +163,11 @@ class PersonView(ListView): Use the gramps-person stock icon """ return 'gramps-person' + + def get_viewtype_stock(self): + """Type of view in category + """ + return 'gramps-tree-group' def ui_definition(self): """ diff --git a/src/plugins/view/relview.py b/src/plugins/view/relview.py index 3595946d5..135309f7e 100644 --- a/src/plugins/view/relview.py +++ b/src/plugins/view/relview.py @@ -235,6 +235,11 @@ class RelationshipView(NavigationView): GNOME as a stock icon. """ return 'gramps-relation' + + def get_viewtype_stock(self): + """Type of view in category + """ + return 'gramps-relation' def build_widget(self):