From 27999290277aa8bfb3cac03c65a9fed6fc935ea1 Mon Sep 17 00:00:00 2001 From: Serge Noiraud Date: Sun, 14 Mar 2010 17:59:29 +0000 Subject: [PATCH] GeoView : first try to have navigation for person and family views. svn: r14817 --- src/plugins/view/geoview.py | 300 +++++++++++++++++++++++++++++++++++- 1 file changed, 299 insertions(+), 1 deletion(-) diff --git a/src/plugins/view/geoview.py b/src/plugins/view/geoview.py index 7fb924b57..9f516cd6f 100644 --- a/src/plugins/view/geoview.py +++ b/src/plugins/view/geoview.py @@ -70,6 +70,10 @@ from gui.views.pageview import PageView from gui.editors import EditPlace from gui.selectors.selectplace import SelectPlace from Filters.SideBar import PlaceSidebarFilter, EventSidebarFilter +from gui.views.navigationview import NavigationView +import Bookmarks +from Utils import navigation_label + #------------------------------------------------------------------------- # @@ -109,6 +113,23 @@ from htmlrenderer import HtmlView GEOVIEW_SUBPATH = unicode(Utils.get_empty_tempdir('geoview'), sys.getfilesystemencoding()) NB_MARKERS_PER_PAGE = 200 +DISABLED = -1 +MRU_SIZE = 10 + +MRU_TOP = [ + '' + '' + '' + '' + ] + +MRU_BTM = [ + '' + '' + '' + '' + ] + #------------------------------------------------------------------------- # # Javascript template @@ -301,6 +322,18 @@ class GeoView(HtmlView): self.dbstate = dbstate self.uistate = uistate self.dbstate.connect('database-changed', self._new_database) + self.fwd_action = None + self.back_action = None + self.book_action = None + self.other_action = None + self.active_signal = None + self.mru_signal = None + self.nav_group = 0 + self.mru_active = DISABLED + + self.uistate.register(dbstate, self.navigation_type(), self.nav_group) + self.bookmarks = Bookmarks.PersonBookmarks(self.dbstate, self.uistate, + dbstate.db.get_bookmarks(), self.goto_handle) def build_widget(self): self.no_network = False @@ -861,6 +894,10 @@ class GeoView(HtmlView): """ self.key_active_changed = self.dbstate.connect('active-changed', self._goto_active_person) + hobj = self.get_history() + self.active_signal = hobj.connect('active-changed', self._goto_active_person) + self.mru_signal = hobj.connect('mru-changed', self.update_mru_menu) + self.update_mru_menu(hobj.mru) self._goto_active_person() self.filter.hide() # hide the filter self.active = True @@ -1044,6 +1081,11 @@ class GeoView(HtmlView): + + + + + ''' @@ -1052,6 +1094,52 @@ class GeoView(HtmlView): Required define_actions function for PageView. Builds the action group information required. """ + #NavigationView.define_actions(self) + #self.bookmark_actions() + 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) + + #self.navigation_actions() + # add the Forward action group to handle the Forward button + 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.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) + + # geoview actions self._add_action('AddPlace', 'geo-place-add', _('_Add Place'), callback=self._add_place, @@ -1103,6 +1191,210 @@ class GeoView(HtmlView): callback=self.filter_toggle_action) config.connect('interface.filter', self.filter_toggle) + #################################################################### + # BOOKMARKS + #################################################################### + def add_bookmark(self, obj): + """ + Add a bookmark to the list. + """ + from gen.display.name import displayer as name_displayer + + active_handle = self.uistate.get_active('Person') + active_person = self.dbstate.db.get_person_from_handle(active_handle) + if active_person: + self.bookmarks.add(active_handle) + name = name_displayer.display(active_person) + 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 edit_bookmarks(self, obj): + """ + Call the bookmark editor. + """ + self.bookmarks.edit() + + def bookmark_actions(self): + """ + Define the bookmark menu actions. + """ + 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) + + #################################################################### + # NAVIGATION + #################################################################### + def set_default_person(self, obj): + """ + Set the default person. + """ + active = self.uistate.get_active('Person') + if active: + self.dbstate.db.set_default_person_handle(active) + + def home(self, obj): + """ + Move to the default person. + """ + defperson = self.dbstate.db.get_default_person() + if defperson: + self.change_active(defperson.get_handle()) + + def jump(self): + """ + A dialog to move to a Gramps ID entered by the user. + """ + 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 is not None: + self.change_active(handle) + self.goto_handle(handle) + else: + self.uistate.push_message( + self.dbstate, + _("Error: %s is not a valid Gramps ID") % gid) + dialog.destroy() + + def get_handle_from_gramps_id(self, gid): + """ + Get an object handle from its Gramps ID. + Needs to be implemented by the inheriting class. + """ + pass + + def goto_handle(self, handle): + self.change_person(handle) + + def fwd_clicked(self, obj): + """ + Move forward one object in the history. + """ + hobj = self.get_history() + hobj.lock = True + if not hobj.at_end(): + hobj.forward() + self.uistate.modify_statusbar(self.dbstate) + self.fwd_action.set_sensitive(not hobj.at_end()) + self.back_action.set_sensitive(True) + hobj.lock = False + + def back_clicked(self, obj): + """ + Move backward one object in the history. + """ + hobj = self.get_history() + hobj.lock = True + if not hobj.at_front(): + hobj.back() + self.uistate.modify_statusbar(self.dbstate) + self.back_action.set_sensitive(not hobj.at_front()) + self.fwd_action.set_sensitive(True) + hobj.lock = False + + def navigation_group(self): + """ + Return the navigation group. + """ + return self.nav_group + + def navigation_type(self): + return 'Person' + + def get_history(self): + """ + Return the history object. + """ + return self.uistate.get_history(self.navigation_type(), + self.navigation_group()) + + #################################################################### + # MRU functions + #################################################################### + + def mru_disable(self): + """ + Remove the UI and action groups for the MRU list. + """ + if self.mru_active != DISABLED: + self.uistate.uimanager.remove_ui(self.mru_active) + self.uistate.uimanager.remove_action_group(self.mru_action) + self.mru_active = DISABLED + + def mru_enable(self): + """ + Enables the UI and action groups for the MRU list. + """ + if self.mru_active == DISABLED: + self.uistate.uimanager.insert_action_group(self.mru_action, 1) + self.mru_active = self.uistate.uimanager.add_ui_from_string(self.mru_ui) + self.uistate.uimanager.ensure_update() + + def update_mru_menu(self, items): + """ + Builds the UI and action group for the MRU list. + """ + self.mru_disable() + nav_type = self.navigation_type() + hobj = self.get_history() + menu_len = min(len(items) - 1, MRU_SIZE) + + entry = '' + data = [entry % (nav_type, index) for index in range(0, menu_len)] + self.mru_ui = "".join(MRU_TOP) + "".join(data) + "".join(MRU_BTM) + + mitems = items[-MRU_SIZE - 1:-1] # Ignore current handle + mitems.reverse() + data = [] + for index, handle in enumerate(mitems): + name, obj = navigation_label(self.dbstate.db, nav_type, handle) + data.append(('%s%02d'%(nav_type, index), None, name, + "%d" % index, None, + _make_callback(hobj.push, handle))) + + self.mru_action = gtk.ActionGroup(nav_type) + self.mru_action.add_actions(data) + self.mru_enable() + + #################################################################### + # End MRU functions + #################################################################### + def go_back(self, button): # pylint: disable-msg=W0613 """ Go to the previous loaded url. @@ -1130,7 +1422,13 @@ class GeoView(HtmlView): 4. set icon and label of the menutoolbutton now that it is realized 5. store label so it can be changed when selection changes """ - PageView.change_page(self) + hobj = self.get_history() + 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) + self.uistate.modify_statusbar(self.dbstate) + #PageView.change_page(self) + self.uistate.clear_filter_results() self._set_lock_unlock(config.get('geoview.lock')) self._savezoomandposition(500) # every 500 millisecondes self.endinit = True