diff --git a/src/PedView.py b/src/PedView.py index ac365691a..ba2081d33 100644 --- a/src/PedView.py +++ b/src/PedView.py @@ -371,15 +371,7 @@ class PedigreeView: # button. The menu consists of the children of the current root # person of the tree. Attach a child to each menu item. - def find_children(p): - childlist = [] - for family_id in p.get_family_id_list(): - family = self.parent.db.find_family_from_id(family_id) - for child_id in family.get_child_id_list(): - childlist.append(child_id) - return childlist - - childlist = find_children(self.active_person) + childlist = find_children(self.parent.db,self.active_person) if len(childlist) == 1: child = self.parent.db.try_to_find_person_from_id(childlist[0]) if child: @@ -390,7 +382,7 @@ class PedigreeView: child = self.parent.db.try_to_find_person_from_id(child_id) cname = GrampsCfg.nameof(child) menuitem = gtk.MenuItem(None) - if find_children(child): + if find_children(self.parent.db,child): label = gtk.Label('%s' % cname) else: label = gtk.Label(cname) @@ -525,13 +517,14 @@ class PedigreeView: def on_canvas_press(self,obj,event): if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: self.build_nav_menu(event) + return gtk.TRUE - def build_nav_menu(self,event): - """Builds the menu with only history-based navigation.""" - - menu = gtk.Menu() - menu.set_title(_('People Menu')) - + def add_nav_portion_to_menu(self,menu): + """ + This function adds a common history-navigation portion + to the context menu. Used by both build_nav_menu() and + build_full_nav_menu() methods. + """ back_sensitivity = self.parent.hindex > 0 fwd_sensitivity = self.parent.hindex + 1 < len(self.parent.history) entries = [ @@ -557,12 +550,19 @@ class PedigreeView: item.set_sensitive(sensitivity) item.show() menu.append(item) + + def build_nav_menu(self,event): + """Builds the menu with only history-based navigation.""" + + menu = gtk.Menu() + menu.set_title(_('People Menu')) + self.add_nav_portion_to_menu(menu) menu.popup(None,None,None,event.button,event.time) def build_full_nav_menu(self,event,person): """ - Builds the full menu (including Siblings, Spouses, etc) - with navigation. + Builds the full menu (including Siblings, Spouses, Children, + and Parents) with navigation. """ menu = gtk.Menu() @@ -628,33 +628,82 @@ class PedigreeView: item.set_sensitive(0) item.show() menu.append(item) + + # Go over children and build their menu + item = gtk.MenuItem(_("Children")) + no_children = 1 + childlist = find_children(self.parent.db,person) + for child_id in childlist: + child = self.parent.db.try_to_find_person_from_id(child_id) + if not child: + continue + + if no_children: + no_children = 0 + item.set_submenu(gtk.Menu()) + child_menu = item.get_submenu() - back_sensitivity = self.parent.hindex > 0 - fwd_sensitivity = self.parent.hindex + 1 < len(self.parent.history) - entries = [ - (None,None,0), - (gtk.STOCK_GO_BACK,self.parent.back_clicked,back_sensitivity), - (gtk.STOCK_GO_FORWARD,self.parent.fwd_clicked,fwd_sensitivity), - #FIXME: revert to stock item when German gtk translation is fixed - #(gtk.STOCK_HOME,self.parent.on_home_clicked,1), - (_("Home"),self.parent.on_home_clicked,1), - (None,None,0), - (_("Set anchor"),self.on_anchor_set,1), - (_("Remove anchor"),self.on_anchor_removed,1), - ] + if find_children(self.parent.db,child): + label = gtk.Label('%s' % GrampsCfg.nameof(child)) + else: + label = gtk.Label(GrampsCfg.nameof(child)) - for stock_id,callback,sensitivity in entries: - item = gtk.ImageMenuItem(stock_id) - #FIXME: remove when German gtk translation is fixed - if stock_id == _("Home"): - im = gtk.image_new_from_stock(gtk.STOCK_HOME,gtk.ICON_SIZE_MENU) - im.show() - item.set_image(im) - if callback: - item.connect("activate",callback) - item.set_sensitive(sensitivity) - item.show() - menu.append(item) + child_item = gtk.MenuItem(None) + label.set_use_markup(gtk.TRUE) + label.show() + label.set_alignment(0,0) + child_item.add(label) + child_item.set_data(_PERSON,child_id) + child_item.connect("activate",self.on_childmenu_changed) + child_item.show() + child_menu.append(child_item) + + if no_children: + item.set_sensitive(0) + item.show() + menu.append(item) + + # Go over parents and build their menu + item = gtk.MenuItem(_("Parents")) + no_parents = 1 + par_list = find_parents(self.parent.db,person) + for par_id in par_list: + par = self.parent.db.try_to_find_person_from_id(par_id) + if not par: + continue + + if no_parents: + no_parents = 0 + item.set_submenu(gtk.Menu()) + par_menu = item.get_submenu() + + if find_parents(self.parent.db,par): + label = gtk.Label('%s' % GrampsCfg.nameof(par)) + else: + label = gtk.Label(GrampsCfg.nameof(par)) + + par_item = gtk.MenuItem(None) + label.set_use_markup(gtk.TRUE) + label.show() + label.set_alignment(0,0) + par_item.add(label) + par_item.set_data(_PERSON,par_id) + par_item.connect("activate",self.on_childmenu_changed) + par_item.show() + par_menu.append(par_item) + + if no_parents: + item.set_sensitive(0) + item.show() + menu.append(item) + + # Add separator + item = gtk.MenuItem(None) + item.show() + menu.append(item) + + # Add history-based navigation + self.add_nav_portion_to_menu(menu) menu.popup(None,None,None,event.button,event.time) #------------------------------------------------------------------------- @@ -707,11 +756,45 @@ def get_distance(db,orig_person,other_person): firstRel = None secondRel = None - length = len(common) - person_id = common[0] secondRel = secondMap[person_id] firstRel = firstMap[person_id] if firstRel == None or secondRel == None: return None return firstRel-secondRel + +#------------------------------------------------------------------------- +# +# Function to return children's list of a person +# +#------------------------------------------------------------------------- +def find_children(db,p): + """ + Returns the list of all children's IDs for a person. + """ + childlist = [] + for family_id in p.get_family_id_list(): + family = db.find_family_from_id(family_id) + for child_id in family.get_child_id_list(): + childlist.append(child_id) + return childlist + +#------------------------------------------------------------------------- +# +# Function to return parent's list of a person +# +#------------------------------------------------------------------------- +def find_parents(db,p): + """ + Returns the unique list of all parents' IDs for a person. + """ + parentlist = [] + for (f,mrel,frel) in p.get_parent_family_id_list(): + family = db.find_family_from_id(f) + father_id = family.get_father_id() + mother_id = family.get_mother_id() + if father_id not in parentlist: + parentlist.append(father_id) + if mother_id not in parentlist: + parentlist.append(mother_id) + return parentlist