From bfdb86069bdf5dacf78cc1352c65264b7eb44244 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sun, 20 Apr 2008 04:52:53 +0000 Subject: [PATCH] 0001782: Further refinements to Relationship View: added sibling collapse arrows; compressed data vertically; config theme; frame around selected sibling svn: r10602 --- src/Config/_GrampsConfigKeys.py | 6 +- src/DataViews/RelationView.py | 298 +++++++++++++++++++++----------- src/GrampsWidgets.py | 28 ++- 3 files changed, 218 insertions(+), 114 deletions(-) diff --git a/src/Config/_GrampsConfigKeys.py b/src/Config/_GrampsConfigKeys.py index 27d45388d..833a10e97 100644 --- a/src/Config/_GrampsConfigKeys.py +++ b/src/Config/_GrampsConfigKeys.py @@ -172,6 +172,7 @@ NO_RECORD_TEXT = ('preferences', 'no-record-text', 2) PRIVATE_SURNAME_TEXT = ('preferences', 'private-surname-text', 2) PRIVATE_GIVEN_TEXT = ('preferences', 'private-given-text', 2) PRIVATE_RECORD_TEXT = ('preferences', 'private-record-text', 2) +RELATION_DISPLAY_THEME= ('preferences', 'relation-display-theme', 2) default_value = { DEFAULT_SOURCE : False, @@ -278,8 +279,8 @@ default_value = { OWNER_WARN : False, EXPORT_NO_PRIVATE : True, EXPORT_RESTRICT : True, - DATE_BEFORE_RANGE : 9999, - DATE_AFTER_RANGE : 9999, + DATE_BEFORE_RANGE : 10, + DATE_AFTER_RANGE : 10, DATE_ABOUT_RANGE : 10, MAX_AGE_PROB_ALIVE : 110, MAX_SIB_AGE_DIFF : 20, @@ -297,4 +298,5 @@ default_value = { PRIVATE_SURNAME_TEXT : "[%s]" % _("Living"), PRIVATE_GIVEN_TEXT : "[%s]" % _("Living"), PRIVATE_RECORD_TEXT : "[%s]" % _("Private Record"), + RELATION_DISPLAY_THEME: "CLASSIC", } diff --git a/src/DataViews/RelationView.py b/src/DataViews/RelationView.py index e524ada7e..0e560cd2a 100644 --- a/src/DataViews/RelationView.py +++ b/src/DataViews/RelationView.py @@ -1,4 +1,4 @@ -# Gramps - a GTK+/GNOME based genealogy program + # # Copyright (C) 2001-2007 Donald N. Allingham # @@ -486,7 +486,7 @@ class RelationshipView(PageView.PersonNavView): self.child = gtk.Table(self.attach.max_y, cols) self.child.set_border_width(12) self.child.set_col_spacings(12) - self.child.set_row_spacings(9) + self.child.set_row_spacings(0) for d in self.attach.list: x0 = d[1] @@ -515,13 +515,14 @@ class RelationshipView(PageView.PersonNavView): table = gtk.Table(2, 3) table.set_col_spacings(12) - table.set_row_spacings(6) + table.set_row_spacings(0) # name and edit button name = name_displayer.display(person) fmt = '%s' text = fmt % cgi.escape(name) - label = GrampsWidgets.DualMarkupLabel(text, _GenderCode[person.gender]) + label = GrampsWidgets.DualMarkupLabel(text, _GenderCode[person.gender], + x_align=1, y_align=0) if Config.get(Config.RELEDITBTN): button = GrampsWidgets.IconButton(self.edit_button_press, person.handle) @@ -538,7 +539,7 @@ class RelationshipView(PageView.PersonNavView): table.attach(eventbox, 1, 2, 1, 2) subtbl = gtk.Table(3, 3) subtbl.set_col_spacings(12) - subtbl.set_row_spacings(6) + subtbl.set_row_spacings(0) eventbox.add(subtbl) # GRAMPS ID @@ -659,10 +660,10 @@ class RelationshipView(PageView.PersonNavView): def write_label(self, title, family, is_parent, person = None): msg = '%s' % cgi.escape(title) hbox = gtk.HBox() - label = GrampsWidgets.MarkupLabel(msg) + label = GrampsWidgets.MarkupLabel(msg, x_align=1) # Draw the collapse/expand button: if family != None: - if self.check_collapsed(person, family.handle): + if self.check_collapsed(person.handle, family.handle): arrow = GrampsWidgets.ExpandCollapseArrow(True, self.expand_collapse_press, (person, family.handle)) @@ -673,8 +674,7 @@ class RelationshipView(PageView.PersonNavView): else : arrow = gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_OUT) hbox.pack_start(arrow, False) - - hbox.pack_start(label, False) + hbox.pack_start(label, True) self.attach.attach(hbox, _LABEL_START, _LABEL_STOP, self.row, self.row+1, gtk.SHRINK|gtk.FILL) @@ -687,7 +687,7 @@ class RelationshipView(PageView.PersonNavView): _DATA_START, _DATA_STOP, self.row, self.row+1, gtk.SHRINK|gtk.FILL) - if family and self.check_collapsed(person, family.handle): + if family and self.check_collapsed(person.handle, family.handle): # show family names later pass else: @@ -746,7 +746,7 @@ class RelationshipView(PageView.PersonNavView): family = self.dbstate.db.get_family_from_handle(family_handle) if not family: return - if person and self.check_collapsed(person, family_handle): + if person and self.check_collapsed(person.handle, family_handle): # don't show rest self.write_label("%s:" % _('Parents'), family, True, person) self.row -= 1 # back up one row for summary names @@ -788,51 +788,90 @@ class RelationshipView(PageView.PersonNavView): if self.show_siblings: active = self.dbstate.active.handle - - child_list = [ref.ref for ref in family.get_child_ref_list()] - - label_cell = self.build_label_cell(_('Siblings')) - label_cell.set_alignment(0, 0) - self.attach.attach( - label_cell, _CLABEL_START-1, _CLABEL_STOP-1, self.row, - self.row+1, xoptions=gtk.FILL|gtk.SHRINK, - yoptions=gtk.FILL) - hbox = gtk.HBox() - addchild = GrampsWidgets.IconButton( - self.add_child_to_fam, - family.handle, - gtk.STOCK_ADD) - self.tooltips.set_tip(addchild, - _('Add new child to family')) - selchild = GrampsWidgets.IconButton( - self.sel_child_to_fam, - family.handle, - gtk.STOCK_INDEX) - self.tooltips.set_tip(selchild, - _('Add existing child to family')) - hbox.pack_start(addchild, False) - hbox.pack_start(selchild, False) - + if self.check_collapsed(person.handle, "SIBLINGS"): + arrow = GrampsWidgets.ExpandCollapseArrow(True, + self.expand_collapse_press, + (person, "SIBLINGS")) + else: + arrow = GrampsWidgets.ExpandCollapseArrow(False, + self.expand_collapse_press, + (person, "SIBLINGS")) + hbox.pack_start(arrow, False) + label_cell = self.build_label_cell(_('Siblings')) + hbox.pack_start(label_cell, True) self.attach.attach( - hbox, _CLABEL_START, _CLABEL_STOP, self.row, + hbox, _CLABEL_START-1, _CLABEL_STOP-1, self.row, self.row+1, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL) - self.row += 1 - vbox = gtk.VBox() - i = 1 - for child_handle in child_list: - child_should_be_linked = (child_handle != active) - self.write_child(vbox, child_handle, i, child_should_be_linked) - i += 1 - eventbox = gtk.EventBox() - if self.use_shade: - eventbox.modify_bg(gtk.STATE_NORMAL, self.color) - eventbox.add(vbox) - self.attach.attach( - eventbox, _CDATA_START-1, _CDATA_STOP-1, self.row, - self.row+1) + if self.check_collapsed(person.handle, "SIBLINGS"): + hbox = gtk.HBox() + child_list = [ref.ref for ref in family.get_child_ref_list() + if ref.ref != active] + if child_list: + count = len(child_list) + else: + count = 0 + if count > 1 : + childmsg = _(" (%d siblings)") % count + elif count == 1 : + gender = self.dbstate.db.get_person_from_handle(\ + child_list[0]).gender + if gender == gen.lib.Person.MALE : + childmsg = _(" (1 brother)") + elif gender == gen.lib.Person.FEMALE : + childmsg = _(" (1 sister)") + else : + childmsg = _(" (1 sibling)") + else : + childmsg = _(" (only child)") + box = self.get_people_box(post_msg=childmsg) + eventbox = gtk.EventBox() + if self.use_shade: + eventbox.modify_bg(gtk.STATE_NORMAL, self.color) + eventbox.add(box) + self.attach.attach( + eventbox, _PDATA_START, _PDATA_STOP, + self.row, self.row+1) + self.row += 1 # now advance it + else: + hbox = gtk.HBox() + addchild = GrampsWidgets.IconButton( + self.add_child_to_fam, + family.handle, + gtk.STOCK_ADD) + self.tooltips.set_tip(addchild, + _('Add new child to family')) + selchild = GrampsWidgets.IconButton( + self.sel_child_to_fam, + family.handle, + gtk.STOCK_INDEX) + self.tooltips.set_tip(selchild, + _('Add existing child to family')) + hbox.pack_start(addchild, False) + hbox.pack_start(selchild, False) + + self.attach.attach( + hbox, _CLABEL_START, _CLABEL_STOP, self.row, + self.row+1, xoptions=gtk.FILL|gtk.SHRINK, + yoptions=gtk.FILL) + + self.row += 1 + vbox = gtk.VBox() + i = 1 + child_list = [ref.ref for ref in family.get_child_ref_list()] + for child_handle in child_list: + child_should_be_linked = (child_handle != active) + self.write_child(vbox, child_handle, i, child_should_be_linked) + i += 1 + eventbox = gtk.EventBox() + if self.use_shade: + eventbox.modify_bg(gtk.STATE_NORMAL, self.color) + eventbox.add(vbox) + self.attach.attach( + eventbox, _CDATA_START-1, _CDATA_STOP-1, self.row, + self.row+1) self.row += 1 @@ -875,8 +914,8 @@ class RelationshipView(PageView.PersonNavView): else: format = "%s" - label = GrampsWidgets.MarkupLabel(format % cgi.escape(title)) - label.set_alignment(0, 0) + label = GrampsWidgets.MarkupLabel(format % cgi.escape(title), + x_align=1, y_align=0) if Config.get(Config.RELEDITBTN): label.set_padding(0, 5) self.attach.attach(label, _PLABEL_START, _PLABEL_STOP, self.row, @@ -924,22 +963,42 @@ class RelationshipView(PageView.PersonNavView): else: format = "%s" - lbl = GrampsWidgets.MarkupLabel(format % cgi.escape(title)) + lbl = GrampsWidgets.MarkupLabel(format % cgi.escape(title), + x_align=1, y_align=.5) if Config.get(Config.RELEDITBTN): lbl.set_padding(0, 5) return lbl def write_child(self, vbox, handle, index, child_should_be_linked): + if not child_should_be_linked: + original_vbox = vbox + vbox = gtk.VBox() + frame = gtk.Frame() + frame.set_shadow_type(gtk.SHADOW_ETCHED_IN) + frame.add(vbox) + original_vbox.add(frame) + parent = has_children(self.dbstate.db, self.dbstate.db.get_person_from_handle(handle)) format = '' + relation_display_theme = Config.get(Config.RELATION_DISPLAY_THEME) if child_should_be_linked and parent: - format = 'underline="single" weight="heavy" style="italic"' + if relation_display_theme == "CLASSIC": + format = 'underline="single" weight="heavy" style="italic"' + elif relation_display_theme == "WEBPAGE": + format = 'foreground="blue" weight="heavy"' + else: + raise AttributeError("invalid relation-display-theme: '%s'" % relation_display_theme) elif child_should_be_linked and not parent: - format = 'underline="single"' + if relation_display_theme == "CLASSIC": + format = 'underline="single"' + elif relation_display_theme == "WEBPAGE": + format = 'foreground="blue"' + else: + raise AttributeError("invalid relation-display-theme: '%s'" % relation_display_theme) elif parent and not child_should_be_linked: - format = 'weight="heavy" style="italic"' + format = 'weight="heavy"' if child_should_be_linked: link_func = self._button_press @@ -959,11 +1018,8 @@ class RelationshipView(PageView.PersonNavView): button = None hbox = gtk.HBox() - if child_should_be_linked: - l = GrampsWidgets.BasicLabel("%d." % index) - else: - l = GrampsWidgets.BasicLabel("> %d." % index) - l.set_width_chars(5) + l = GrampsWidgets.BasicLabel("%d." % index) + l.set_width_chars(3) l.set_alignment(1.0, 0.5) hbox.pack_start(l, False, False, 0) hbox.pack_start(GrampsWidgets.LinkBox(link_label, button), @@ -977,7 +1033,7 @@ class RelationshipView(PageView.PersonNavView): l = GrampsWidgets.MarkupLabel(value) l.set_padding(48, 0) vbox.add(l) - + def write_data(self, box, title, start_col=_SDATA_START, stop_col=_SDATA_STOP): box.add(GrampsWidgets.BasicLabel(title)) @@ -1024,9 +1080,9 @@ class RelationshipView(PageView.PersonNavView): value = "" return value - def check_collapsed(self, person, handle): + def check_collapsed(self, person_handle, handle): """ Return true if collapsed. """ - return (handle in self.collapsed_items.get(person.handle, [])) + return (handle in self.collapsed_items.get(person_handle, [])) def expand_collapse_press(self, obj, event, pair): """ Calback function for ExpandCollapseArrow, user param is pair, @@ -1151,7 +1207,7 @@ class RelationshipView(PageView.PersonNavView): handle = father_handle # collapse button - if self.check_collapsed(person, family_handle): + if self.check_collapsed(person.handle, family_handle): # show "> Family: ..." and nothing else self.write_label("%s:" % _('Family'), family, False, person) self.row -= 1 # back up @@ -1184,50 +1240,82 @@ class RelationshipView(PageView.PersonNavView): if not self.write_marriage(box, family): self.write_relationship(box, family) - child_list = family.get_child_ref_list() - - label_cell = self.build_label_cell(_('Children')) - label_cell.set_alignment(0, 0) - self.attach.attach( - label_cell, _CLABEL_START-1, _CLABEL_STOP-1, self.row, - self.row+1, xoptions=gtk.FILL|gtk.SHRINK, - yoptions=gtk.FILL) - hbox = gtk.HBox() - addchild = GrampsWidgets.IconButton( - self.add_child_to_fam, - family.handle, - gtk.STOCK_ADD) - self.tooltips.set_tip(addchild, - _('Add new child to family')) - selchild = GrampsWidgets.IconButton( - self.sel_child_to_fam, - family.handle, - gtk.STOCK_INDEX) - self.tooltips.set_tip(selchild, - _('Add existing child to family')) - hbox.pack_start(addchild, False) - hbox.pack_start(selchild, False) + if self.check_collapsed(person.handle, "CHILDREN"): + arrow = GrampsWidgets.ExpandCollapseArrow(True, + self.expand_collapse_press, + (person, "CHILDREN")) + else: + arrow = GrampsWidgets.ExpandCollapseArrow(False, + self.expand_collapse_press, + (person, "CHILDREN")) + hbox.pack_start(arrow, True) + label_cell = self.build_label_cell(_('Children')) + hbox.pack_start(label_cell, True) self.attach.attach( - hbox, _CLABEL_START, _CLABEL_STOP, self.row, + hbox, _CLABEL_START-1, _CLABEL_STOP-1, self.row, self.row+1, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL) - vbox = gtk.VBox() - i = 1 - for child_ref in child_list: - self.write_child(vbox, child_ref.ref, i, True) - i += 1 + if self.check_collapsed(person.handle, "CHILDREN"): + hbox = gtk.HBox() + child_list = family.get_child_ref_list() + if child_list: + count = len(child_list) + else: + count = 0 + if count > 1 : + childmsg = _(" (%d children)") % count + elif count == 1 : + childmsg = _(" (1 child)") + else : + childmsg = _(" (no children)") + box = self.get_people_box(post_msg=childmsg) + eventbox = gtk.EventBox() + if self.use_shade: + eventbox.modify_bg(gtk.STATE_NORMAL, self.color) + eventbox.add(box) + self.attach.attach( + eventbox, _PDATA_START, _PDATA_STOP, + self.row, self.row+1) + self.row += 1 # now advance it + else: + hbox = gtk.HBox() + addchild = GrampsWidgets.IconButton( + self.add_child_to_fam, + family.handle, + gtk.STOCK_ADD) + self.tooltips.set_tip(addchild, + _('Add new child to family')) + selchild = GrampsWidgets.IconButton( + self.sel_child_to_fam, + family.handle, + gtk.STOCK_INDEX) + self.tooltips.set_tip(selchild, + _('Add existing child to family')) + hbox.pack_start(addchild, False) + hbox.pack_start(selchild, False) + self.attach.attach( + hbox, _CLABEL_START, _CLABEL_STOP, self.row, + self.row+1, xoptions=gtk.FILL|gtk.SHRINK, + yoptions=gtk.FILL) - self.row += 1 - eventbox = gtk.EventBox() - if self.use_shade: - eventbox.modify_bg(gtk.STATE_NORMAL, self.color) - eventbox.add(vbox) - self.attach.attach( - eventbox, _CDATA_START-1, _CDATA_STOP-1, self.row, - self.row+1) - self.row += 1 + vbox = gtk.VBox() + i = 1 + child_list = family.get_child_ref_list() + for child_ref in child_list: + self.write_child(vbox, child_ref.ref, i, True) + i += 1 + + self.row += 1 + eventbox = gtk.EventBox() + if self.use_shade: + eventbox.modify_bg(gtk.STATE_NORMAL, self.color) + eventbox.add(vbox) + self.attach.attach( + eventbox, _CDATA_START-1, _CDATA_STOP-1, self.row, + self.row+1) + self.row += 1 def edit_button_press(self, obj, event, handle): if button_activated(event, _LEFT_BUTTON): @@ -1322,7 +1410,7 @@ class RelationshipView(PageView.PersonNavView): self.dbstate.db.commit_family(family, trans) self.dbstate.db.transaction_commit(trans, _("Add Child to Family")) - def sel_child_to_fam(self, obj, event, handle): + def sel_child_to_fam(self, obj, event, handle, surname=None): from Selectors import selector_factory if button_activated(event, _LEFT_BUTTON): SelectPerson = selector_factory('Person') diff --git a/src/GrampsWidgets.py b/src/GrampsWidgets.py index ac8b65af0..0bbbf5b0f 100644 --- a/src/GrampsWidgets.py +++ b/src/GrampsWidgets.py @@ -114,14 +114,22 @@ class ExpandCollapseArrow(gtk.EventBox): else: self.arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_OUT) self.tooltips.set_tip(self, _("Collapse this section")) - self.add(self.arrow) self.connect('button-press-event', onbuttonpress, pair) self.connect('realize', realize_cb) class LinkLabel(gtk.EventBox): - def __init__(self, label, func, handle, decoration='underline="single"'): + def __init__(self, label, func, handle, decoration=None): + if decoration == None: + relation_display_theme = Config.get(Config.RELATION_DISPLAY_THEME) + if relation_display_theme == "CLASSIC": + decoration = 'underline="single"' + elif relation_display_theme == "WEBPAGE": + decoration = 'foreground="blue"' + else: + raise AttributeError("invalid relation-display-theme: '%s'" % relation_display_theme) + gtk.EventBox.__init__(self) self.orig_text = cgi.escape(label[0]) self.gender = label[1] @@ -158,7 +166,13 @@ class LinkLabel(gtk.EventBox): self.label.set_padding(x, y) def enter_text(self, obj, event, handle): - text = '%s' % (self.decoration, self.orig_text) + relation_display_theme = Config.get(Config.RELATION_DISPLAY_THEME) + if relation_display_theme == "CLASSIC": + text = '%s' % (self.decoration, self.orig_text) + elif relation_display_theme == "WEBPAGE": + text = '%s' % (self.decoration, self.orig_text) + else: + raise AttributeError("invalid relation-display-theme: '%s'" % relation_display_theme) self.label.set_text(text) self.label.set_use_markup(True) @@ -253,18 +267,18 @@ class GenderLabel(gtk.Label): class MarkupLabel(gtk.Label): - def __init__(self, text): + def __init__(self, text, x_align=0, y_align=0.5): gtk.Label.__init__(self, text) - self.set_alignment(0, 0.5) + self.set_alignment(x_align, y_align) self.set_use_markup(True) self.show_all() class DualMarkupLabel(gtk.HBox): - def __init__(self, text, alt): + def __init__(self, text, alt, x_align=0, y_align=0.5): gtk.HBox.__init__(self) label = gtk.Label(text) - label.set_alignment(0, 0.5) + label.set_alignment(x_align, y_align) label.set_use_markup(True) self.pack_start(label, False, False, 0)