|
56 | 56 | from gramps.gen.db import DbTxn
|
57 | 57 | from navigationview import NavigationView
|
58 | 58 | from taglist import TagList
|
| 59 | +from timeline import Timeline |
59 | 60 | from gramps.gui.uimanager import ActionGroup
|
60 | 61 | from gramps.gui.editors import EditPerson, EditFamily, EditEvent
|
61 | 62 | from gramps.gui.editors import FilterEditor
|
@@ -559,6 +560,7 @@ def _change_person(self, handle):
|
559 | 560 | self.write_families(person)
|
560 | 561 | self.write_events(person)
|
561 | 562 | self.write_album(person)
|
| 563 | + self.write_timeline(person) |
562 | 564 |
|
563 | 565 | #self.stack.set_visible_child_name(self.person_tab)
|
564 | 566 |
|
@@ -1010,6 +1012,130 @@ def write_event_ref(self, vbox, ename, event):
|
1010 | 1012 | def write_data(self, box, title):
|
1011 | 1013 | box.add(widgets.BasicLabel(title))
|
1012 | 1014 |
|
| 1015 | +############################################################################## |
| 1016 | +# |
| 1017 | +# Timeline |
| 1018 | +# |
| 1019 | +############################################################################## |
| 1020 | + |
| 1021 | + def write_timeline(self, person): |
| 1022 | + |
| 1023 | + grid = Gtk.Grid(orientation=Gtk.Orientation.VERTICAL) |
| 1024 | + |
| 1025 | + scroll = Gtk.ScrolledWindow() |
| 1026 | + scroll.add(grid) |
| 1027 | + scroll.show_all() |
| 1028 | + self.stack.add_titled(scroll, 'timeline', _('Timeline')) |
| 1029 | + |
| 1030 | + events = [] |
| 1031 | + start_date = None |
| 1032 | + # Personal events |
| 1033 | + for index, event_ref in enumerate(person.get_event_ref_list()): |
| 1034 | + event = self.dbstate.db.get_event_from_handle(event_ref.ref) |
| 1035 | + date = event.get_date_object() |
| 1036 | + if (start_date is None and event_ref.role.is_primary() and |
| 1037 | + (event.type.is_birth_fallback() or |
| 1038 | + event.type == EventType.BIRTH)): |
| 1039 | + start_date = date |
| 1040 | + sortval = date.get_sort_value() |
| 1041 | + events.append(((sortval, index), event_ref, None)) |
| 1042 | + |
| 1043 | + # Family events |
| 1044 | + for family_handle in person.get_family_handle_list(): |
| 1045 | + family = self.dbstate.db.get_family_from_handle(family_handle) |
| 1046 | + father_handle = family.get_father_handle() |
| 1047 | + mother_handle = family.get_mother_handle() |
| 1048 | + spouse = None |
| 1049 | + if father_handle == person.handle: |
| 1050 | + if mother_handle: |
| 1051 | + spouse = self.dbstate.db.get_person_from_handle(mother_handle) |
| 1052 | + else: |
| 1053 | + if father_handle: |
| 1054 | + spouse = self.dbstate.db.get_person_from_handle(father_handle) |
| 1055 | + for event_ref in family.get_event_ref_list(): |
| 1056 | + event = self.dbstate.db.get_event_from_handle(event_ref.ref) |
| 1057 | + sortval = event.get_date_object().get_sort_value() |
| 1058 | + events.append(((sortval, 0), event_ref, spouse)) |
| 1059 | + |
| 1060 | + # Write all events sorted by date |
| 1061 | + for index, event in enumerate(sorted(events, key=itemgetter(0))): |
| 1062 | + self.write_node(grid, event[1], event[2], index+1, start_date) |
| 1063 | + |
| 1064 | + grid.show_all() |
| 1065 | + |
| 1066 | + def write_node(self, grid, event_ref, spouse, index, start_date): |
| 1067 | + handle = event_ref.ref |
| 1068 | + event = self.dbstate.db.get_event_from_handle(handle) |
| 1069 | + etype = str(event.get_type()) |
| 1070 | + desc = event.get_description() |
| 1071 | + who = get_participant_from_event(self.dbstate.db, handle) |
| 1072 | + |
| 1073 | + title = etype |
| 1074 | + if desc: |
| 1075 | + title = '%s (%s)' % (title, desc) |
| 1076 | + if spouse: |
| 1077 | + spouse_name = name_displayer.display(spouse) |
| 1078 | + title = '%s - %s' % (title, spouse_name) |
| 1079 | + |
| 1080 | + role = event_ref.get_role() |
| 1081 | + if role in (EventRoleType.PRIMARY, EventRoleType.FAMILY): |
| 1082 | + emph = True |
| 1083 | + else: |
| 1084 | + emph = False |
| 1085 | + title = '%s of %s' % (title, who) |
| 1086 | + |
| 1087 | + vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) |
| 1088 | + |
| 1089 | + link_func = self._event_link |
| 1090 | + name = (title, None) |
| 1091 | + handle = event_ref.ref |
| 1092 | + link_label = widgets.LinkLabel(name, link_func, handle, emph, |
| 1093 | + theme=self.theme) |
| 1094 | + link_label.set_padding(3, 0) |
| 1095 | + link_label.set_tooltip_text(_('Click to make this event active')) |
| 1096 | + if self._config.get('preferences.releditbtn'): |
| 1097 | + button = widgets.IconButton(self.edit_event, handle) |
| 1098 | + button.set_tooltip_text(_('Edit %s') % name[0]) |
| 1099 | + else: |
| 1100 | + button = None |
| 1101 | + |
| 1102 | + hbox = widgets.LinkBox(link_label, button) |
| 1103 | + if self.show_tags: |
| 1104 | + tag_list = TagList(self.get_tag_list(event)) |
| 1105 | + hbox.pack_start(tag_list, False, False, 0) |
| 1106 | + vbox1.pack_start(hbox, False, False, 0) |
| 1107 | + |
| 1108 | + pname = place_displayer.display_event(self.dbstate.db, event) |
| 1109 | + vbox1.pack_start(widgets.BasicLabel(pname), False, False, 0) |
| 1110 | + vbox1.set_vexpand(False) |
| 1111 | + vbox1.set_valign(Gtk.Align.CENTER) |
| 1112 | + vbox1.show_all() |
| 1113 | + |
| 1114 | + eventbox = self.make_dragbox(vbox1, 'Event', handle) |
| 1115 | + eventbox.set_hexpand(True) |
| 1116 | + eventbox.set_vexpand(False) |
| 1117 | + eventbox.set_valign(Gtk.Align.CENTER) |
| 1118 | + eventbox.set_margin_top(1) |
| 1119 | + eventbox.set_margin_bottom(1) |
| 1120 | + eventbox.show_all() |
| 1121 | + |
| 1122 | + vbox2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) |
| 1123 | + dobj = event.get_date_object() |
| 1124 | + date = widgets.BasicLabel(displayer.display(dobj)) |
| 1125 | + vbox2.pack_start(date, False, False, 0) |
| 1126 | + if start_date is not None: |
| 1127 | + age_precision = config.get('preferences.age-display-precision') |
| 1128 | + diff = (dobj - start_date).format(precision=age_precision) |
| 1129 | + age = widgets.BasicLabel(diff) |
| 1130 | + vbox2.pack_start(age, False, False, 0) |
| 1131 | + vbox2.set_valign(Gtk.Align.CENTER) |
| 1132 | + grid.add(vbox2) |
| 1133 | + |
| 1134 | + tl = Timeline() |
| 1135 | + grid.attach_next_to(tl, vbox2, Gtk.PositionType.RIGHT, 1, 1) |
| 1136 | + |
| 1137 | + grid.attach_next_to(eventbox, tl, Gtk.PositionType.RIGHT, 1, 1) |
| 1138 | + |
1013 | 1139 | ##############################################################################
|
1014 | 1140 | #
|
1015 | 1141 | # Events list
|
|
0 commit comments