Skip to content

Commit a2bd5a1

Browse files
authored
Graphview search+id+events (#583)
* Add the Gramps ID for people * Add Event edition in the menu. * Use regexp when searching. adding parents, spouses, children for better search. adding corresponding dates and places when they exists.
1 parent 3d3ef68 commit a2bd5a1

File tree

2 files changed

+236
-13
lines changed

2 files changed

+236
-13
lines changed

GraphView/graphview.py

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
from gramps.gen.display.place import displayer as place_displayer
6161
from gramps.gen.errors import WindowActiveError
6262
from gramps.gen.lib import (Person, Family, ChildRef, Name, Surname,
63-
ChildRefType, EventType, EventRoleType)
63+
ChildRefType, Event, EventRef, EventType, EventRoleType)
6464
from gramps.gen.utils.alive import probably_alive
6565
from gramps.gen.utils.callback import Callback
6666
from gramps.gen.utils.db import (get_birth_or_fallback, get_death_or_fallback,
@@ -73,7 +73,7 @@
7373
from gramps.gui.dialog import (OptionDialog, ErrorDialog, QuestionDialog2,
7474
WarningDialog)
7575
from gramps.gui.display import display_url
76-
from gramps.gui.editors import EditPerson, EditFamily, EditTagList
76+
from gramps.gui.editors import EditPerson, EditFamily, EditTagList, EditEventRef
7777
from gramps.gui.utils import (color_graph_box, color_graph_family,
7878
rgb_to_hex, hex_to_rgb_float,
7979
process_pending_events)
@@ -152,6 +152,7 @@ class GraphView(NavigationView):
152152
# default settings in the config file
153153
CONFIGSETTINGS = (
154154
('interface.graphview-show-images', True),
155+
('interface.graphview-show-ID', True),
155156
('interface.graphview-show-avatars', True),
156157
('interface.graphview-avatars-style', 1),
157158
('interface.graphview-avatars-male', ''), # custom avatar
@@ -186,6 +187,7 @@ def __init__(self, pdata, dbstate, uistate, nav_group=0):
186187
PersonBookmarks, nav_group)
187188

188189
self.show_images = self._config.get('interface.graphview-show-images')
190+
self.show_ID = self._config.get('interface.graphview-show-ID')
189191
self.show_full_dates = self._config.get(
190192
'interface.graphview-show-full-dates')
191193
self.show_places = self._config.get('interface.graphview-show-places')
@@ -421,6 +423,13 @@ def cb_update_show_images(self, _client, _cnxn_id, entry, _data):
421423
self.show_images = entry == 'True'
422424
self.graph_widget.populate(self.get_active())
423425

426+
def cb_update_show_ID(self, _client, _cnxn_id, entry, _data):
427+
"""
428+
Called when the configuration menu changes the ID setting.
429+
"""
430+
self.show_ID = entry == 'True'
431+
self.graph_widget.populate(self.get_active())
432+
424433
def cb_update_show_avatars(self, _client, _cnxn_id, entry, _data):
425434
"""
426435
Called when the configuration menu changes the avatars setting.
@@ -637,6 +646,8 @@ def config_connect(self):
637646
"""
638647
self._config.connect('interface.graphview-show-images',
639648
self.cb_update_show_images)
649+
self._config.connect('interface.graphview-show-ID',
650+
self.cb_update_show_ID)
640651
self._config.connect('interface.graphview-show-avatars',
641652
self.cb_update_show_avatars)
642653
self._config.connect('interface.graphview-avatars-style',
@@ -712,6 +723,9 @@ def layout_config_panel(self, configdialog):
712723
configdialog.add_checkbox(
713724
grid, _('Show images'), row, 'interface.graphview-show-images')
714725
row += 1
726+
configdialog.add_checkbox(
727+
grid, _('Show IDs'), row, 'interface.graphview-show-ID')
728+
row += 1
715729
configdialog.add_checkbox(
716730
grid, _('Show avatars'), row, 'interface.graphview-show-avatars')
717731
row += 1
@@ -2308,6 +2322,8 @@ def init_dot(self):
23082322

23092323
self.show_images = self.view._config.get(
23102324
'interface.graphview-show-images')
2325+
self.show_ID = self.view._config.get(
2326+
'interface.graphview-show-ID')
23112327
self.show_avatars = self.view._config.get(
23122328
'interface.graphview-show-avatars')
23132329
self.show_full_dates = self.view._config.get(
@@ -3057,6 +3073,8 @@ def get_person_label(self, person):
30573073
name = displayer.display_name(person.get_primary_name())
30583074
# name string should not be empty
30593075
name = escape(name) if name else ' '
3076+
if self.show_ID:
3077+
name += " (%s)" % person.get_gramps_id()
30603078

30613079
# birth, death is a lists [date, place]
30623080
birth, death = self.get_date_strings(person)
@@ -3783,6 +3801,28 @@ def person_menu(self, handle):
37833801

37843802
self.add_separator()
37853803

3804+
# build events submenu
3805+
if len(person.get_event_ref_list()) != 0:
3806+
iteme, evt_menu = self.add_submenu(label=_("Events"))
3807+
else:
3808+
iteme = self.add_menuitem(self, _("No Events for this person"), self.menu_no_action)
3809+
3810+
nbe = 0
3811+
for event_ref in person.get_event_ref_list():
3812+
if not event_ref:
3813+
continue
3814+
nbe += 1
3815+
event = self.dbstate.db.get_event_from_handle(event_ref.ref)
3816+
role = _(event_ref.get_role().xml_str())
3817+
etype = _(event.get_type().xml_str())
3818+
3819+
# text = displayer.display(person)
3820+
if event_ref.get_role() != EventRoleType.PRIMARY:
3821+
etype += " (" + role + ") "
3822+
self.add_menuitem(evt_menu, etype,
3823+
self.actions.edit_person_event,
3824+
person.get_gramps_id(), event, event_ref)
3825+
37863826
# build tag submenu
37873827
item, tag_menu = self.add_submenu(label=_("Tags"))
37883828

@@ -4047,6 +4087,28 @@ def family_menu(self, handle):
40474087

40484088
self.add_separator()
40494089

4090+
# build events submenu
4091+
if len(family.get_event_ref_list()) != 0:
4092+
iteme, evt_menu = self.add_submenu(label=_("Events"))
4093+
else:
4094+
iteme = self.add_menuitem(self, _("No Events for this family"), self.menu_no_action)
4095+
4096+
nbe = 0
4097+
for event_ref in family.get_event_ref_list():
4098+
if not event_ref:
4099+
continue
4100+
nbe += 1
4101+
event = self.dbstate.db.get_event_from_handle(event_ref.ref)
4102+
role = _(event_ref.get_role().xml_str())
4103+
etype = _(event.get_type().xml_str())
4104+
4105+
# text = displayer.display(person)
4106+
if event_ref.get_role() != EventRoleType.FAMILY:
4107+
etype += " (" + role + ") "
4108+
self.add_menuitem(evt_menu, etype,
4109+
self.actions.edit_family_event,
4110+
family.get_gramps_id(), event, event_ref)
4111+
40504112
# build tag submenu
40514113
_item, tag_menu = self.add_submenu(label=_("Tags"))
40524114

@@ -4161,6 +4223,12 @@ def add_submenu(self, label):
41614223
submenu.set_reserve_toggle_size(False)
41624224
return item, submenu
41634225

4226+
def menu_no_action(self, *args):
4227+
"""
4228+
Do nothing
4229+
"""
4230+
return True
4231+
41644232
def add_separator(self, menu=None):
41654233
"""
41664234
Adds separator to menu.
@@ -4313,6 +4381,27 @@ def edit_family(self, obj, family_handle=None):
43134381
if m_handle:
43144382
self.emit('focus-person-changed', (m_handle, ))
43154383

4384+
def edit_family_event(self, obj, family_id, event, evt_ref):
4385+
"""
4386+
Edit the events for this family
4387+
"""
4388+
try:
4389+
EditEventRef(self.dbstate, self.uistate, [], event, evt_ref, self.obj_added)
4390+
except WindowActiveError:
4391+
pass
4392+
4393+
def edit_person_event(self, obj, person_id, event, evt_ref):
4394+
"""
4395+
Edit the events for this person
4396+
"""
4397+
try:
4398+
EditEventRef(self.dbstate, self.uistate, [], event, evt_ref, self.obj_added)
4399+
except WindowActiveError:
4400+
pass
4401+
4402+
def obj_added(self, reference, primary):
4403+
reference.ref = primary.handle
4404+
43164405
def copy_person_to_clipboard(self, obj):
43174406
"""
43184407
Renders the person data into some lines of text

0 commit comments

Comments
 (0)