feature: allow edit of family from fanchart descendant when family is defined
svn: r20407
This commit is contained in:
parent
f9ff67fde1
commit
c2560a2af8
@ -53,6 +53,7 @@ from cgi import escape
|
|||||||
# GRAMPS modules
|
# GRAMPS modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.db import DbTxn
|
||||||
from gen.display.name import displayer as name_displayer
|
from gen.display.name import displayer as name_displayer
|
||||||
from gen.errors import WindowActiveError
|
from gen.errors import WindowActiveError
|
||||||
from gui.editors import EditPerson, EditFamily
|
from gui.editors import EditPerson, EditFamily
|
||||||
@ -62,7 +63,7 @@ from gui.ddtargets import DdTargets
|
|||||||
from gen.utils.alive import probably_alive
|
from gen.utils.alive import probably_alive
|
||||||
from gen.utils.libformatting import FormattingHelper
|
from gen.utils.libformatting import FormattingHelper
|
||||||
from gen.utils.db import (find_children, find_parents, find_witnessed_people,
|
from gen.utils.db import (find_children, find_parents, find_witnessed_people,
|
||||||
get_age, get_timeperiod)
|
get_age, get_timeperiod, preset_name)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -756,6 +757,12 @@ class FanChartBaseWidget(Gtk.DrawingArea):
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def family_at(self, generation, pos, btype):
|
||||||
|
"""
|
||||||
|
returns the family at generation, pos, btype
|
||||||
|
"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def _have_children(self, person):
|
def _have_children(self, person):
|
||||||
"""
|
"""
|
||||||
Returns True if a person has children.
|
Returns True if a person has children.
|
||||||
@ -798,8 +805,12 @@ class FanChartBaseWidget(Gtk.DrawingArea):
|
|||||||
# Do things based on state, event.get_state(), or button, event.button
|
# Do things based on state, event.get_state(), or button, event.button
|
||||||
if gui.utils.is_right_click(event):
|
if gui.utils.is_right_click(event):
|
||||||
person = self.person_at(generation, selected, btype)
|
person = self.person_at(generation, selected, btype)
|
||||||
|
family = self.family_at(generation, selected, btype)
|
||||||
|
fhandle = None
|
||||||
|
if family:
|
||||||
|
fhandle = family.handle
|
||||||
if person and self.on_popup:
|
if person and self.on_popup:
|
||||||
self.on_popup(widget, event, person.handle)
|
self.on_popup(widget, event, person.handle, fhandle)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
@ -1358,7 +1369,7 @@ class FanChartWidget(FanChartBaseWidget):
|
|||||||
stop = gstop + (gstop - gstart)
|
stop = gstop + (gstop - gstart)
|
||||||
self.angle[generation][selected] = [gstart, stop, EXPANDED]
|
self.angle[generation][selected] = [gstart, stop, EXPANDED]
|
||||||
self.expand_parents(generation + 1, selected, gstart)
|
self.expand_parents(generation + 1, selected, gstart)
|
||||||
start,stop,male,state = self.angle[generation][selected+1]
|
start, stop, state = self.angle[generation][selected+1]
|
||||||
self.angle[generation][selected+1] = [stop, stop, COLLAPSED]
|
self.angle[generation][selected+1] = [stop, stop, COLLAPSED]
|
||||||
self.hide_parents(generation+1, selected+1, stop)
|
self.hide_parents(generation+1, selected+1, stop)
|
||||||
else:
|
else:
|
||||||
@ -1420,6 +1431,14 @@ class FanChartWidget(FanChartBaseWidget):
|
|||||||
person = self.data[generation][pos][1]
|
person = self.data[generation][pos][1]
|
||||||
return person
|
return person
|
||||||
|
|
||||||
|
def family_at(self, generation, pos, btype):
|
||||||
|
"""
|
||||||
|
returns the family at generation, pos, btype
|
||||||
|
Difficult here, we would need to go to child, and then obtain the first
|
||||||
|
parent family, as that is the family that is shown.
|
||||||
|
"""
|
||||||
|
return None
|
||||||
|
|
||||||
def do_mouse_click(self):
|
def do_mouse_click(self):
|
||||||
# no drag occured, expand or collapse the section
|
# no drag occured, expand or collapse the section
|
||||||
self.change_slice(self._mouse_click_gen, self._mouse_click_sel)
|
self.change_slice(self._mouse_click_gen, self._mouse_click_sel)
|
||||||
@ -1460,10 +1479,10 @@ class FanChartGrampsGUI(object):
|
|||||||
self.fan.reset()
|
self.fan.reset()
|
||||||
self.fan.queue_draw()
|
self.fan.queue_draw()
|
||||||
|
|
||||||
def on_popup(self, obj, event, person_handle):
|
def on_popup(self, obj, event, person_handle, family_handle=None):
|
||||||
"""
|
"""
|
||||||
Builds the full menu (including Siblings, Spouses, Children,
|
Builds the full menu (including Siblings, Spouses, Children,
|
||||||
and Parents) with navigation. Copied from PedigreeView.
|
and Parents) with navigation.
|
||||||
"""
|
"""
|
||||||
#store menu for GTK3 to avoid it being destroyed before showing
|
#store menu for GTK3 to avoid it being destroyed before showing
|
||||||
self.menu = Gtk.Menu()
|
self.menu = Gtk.Menu()
|
||||||
@ -1482,10 +1501,18 @@ class FanChartGrampsGUI(object):
|
|||||||
go_item.show()
|
go_item.show()
|
||||||
menu.append(go_item)
|
menu.append(go_item)
|
||||||
|
|
||||||
edit_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_EDIT, accel_group=None)
|
edit_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_EDIT,
|
||||||
|
accel_group=None)
|
||||||
edit_item.connect("activate", self.edit_person_cb, person_handle)
|
edit_item.connect("activate", self.edit_person_cb, person_handle)
|
||||||
edit_item.show()
|
edit_item.show()
|
||||||
menu.append(edit_item)
|
menu.append(edit_item)
|
||||||
|
if family_handle:
|
||||||
|
edit_fam_item = Gtk.ImageMenuItem.new_from_stock(
|
||||||
|
stock_id=Gtk.STOCK_EDIT, accel_group=None)
|
||||||
|
edit_fam_item.set_label(_("Edit family"))
|
||||||
|
edit_fam_item.connect("activate", self.edit_fam_cb, family_handle)
|
||||||
|
edit_fam_item.show()
|
||||||
|
menu.append(edit_fam_item)
|
||||||
|
|
||||||
clipboard_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_COPY, accel_group=None)
|
clipboard_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_COPY, accel_group=None)
|
||||||
clipboard_item.connect("activate", self.copy_person_to_clipboard_cb,
|
clipboard_item.connect("activate", self.copy_person_to_clipboard_cb,
|
||||||
@ -1686,6 +1713,30 @@ class FanChartGrampsGUI(object):
|
|||||||
item.set_sensitive(0)
|
item.set_sensitive(0)
|
||||||
item.show()
|
item.show()
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
|
#we now construct an add menu
|
||||||
|
item = Gtk.MenuItem(label=_("Add"))
|
||||||
|
item.set_submenu(Gtk.Menu())
|
||||||
|
add_menu = item.get_submenu()
|
||||||
|
if family_handle:
|
||||||
|
# allow to add a child to this family
|
||||||
|
add_child_item = Gtk.ImageMenuItem.new_from_stock(
|
||||||
|
stock_id=Gtk.STOCK_ADD, accel_group=None)
|
||||||
|
add_child_item.set_label(_("Add child to family"))
|
||||||
|
add_child_item.connect("activate", self.add_child_to_fam_cb,
|
||||||
|
family_handle)
|
||||||
|
add_child_item.show()
|
||||||
|
add_menu.append(add_child_item)
|
||||||
|
|
||||||
|
add_pers_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_ADD,
|
||||||
|
accel_group=None)
|
||||||
|
add_pers_item.set_label(_("Add a person"))
|
||||||
|
add_pers_item.connect("activate", self.add_person_cb)
|
||||||
|
add_pers_item.show()
|
||||||
|
add_menu.append(add_pers_item)
|
||||||
|
item.show()
|
||||||
|
menu.append(item)
|
||||||
|
|
||||||
menu.popup(None, None, None, None, event.button, event.time)
|
menu.popup(None, None, None, None, event.button, event.time)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@ -1699,6 +1750,62 @@ class FanChartGrampsGUI(object):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def edit_fam_cb(self, obj, family_handle):
|
||||||
|
fam = self.dbstate.db.get_family_from_handle(family_handle)
|
||||||
|
if fam:
|
||||||
|
try:
|
||||||
|
EditFamily(self.dbstate, self.uistate, [], fam)
|
||||||
|
except WindowActiveError:
|
||||||
|
pass
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def add_person_cb(self, obj):
|
||||||
|
"""
|
||||||
|
Add a person
|
||||||
|
"""
|
||||||
|
person = gen.lib.Person()
|
||||||
|
#the editor requires a surname
|
||||||
|
person.primary_name.add_surname(gen.lib.Surname())
|
||||||
|
person.primary_name.set_primary_surname(0)
|
||||||
|
try:
|
||||||
|
EditPerson(self.dbstate, self.uistate, [], person)
|
||||||
|
except WindowActiveError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def add_child_to_fam_cb(self, obj, family_handle):
|
||||||
|
callback = lambda x: self.callback_add_child(x, family_handle)
|
||||||
|
person = gen.lib.Person()
|
||||||
|
name = gen.lib.Name()
|
||||||
|
#the editor requires a surname
|
||||||
|
name.add_surname(gen.lib.Surname())
|
||||||
|
name.set_primary_surname(0)
|
||||||
|
family = self.dbstate.db.get_family_from_handle(family_handle)
|
||||||
|
father = self.dbstate.db.get_person_from_handle(
|
||||||
|
family.get_father_handle())
|
||||||
|
if father:
|
||||||
|
preset_name(father, name)
|
||||||
|
person.set_primary_name(name)
|
||||||
|
try:
|
||||||
|
EditPerson(self.dbstate, self.uistate, [], person,
|
||||||
|
callback=callback)
|
||||||
|
except WindowActiveError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def callback_add_child(self, person, family_handle):
|
||||||
|
ref = gen.lib.ChildRef()
|
||||||
|
ref.ref = person.get_handle()
|
||||||
|
family = self.dbstate.db.get_family_from_handle(family_handle)
|
||||||
|
family.add_child_ref(ref)
|
||||||
|
|
||||||
|
with DbTxn(_("Add Child to Family"), self.dbstate.db) as trans:
|
||||||
|
#add parentref to child
|
||||||
|
person.add_parent_family_handle(family_handle)
|
||||||
|
#default relationship is used
|
||||||
|
self.dbstate.db.commit_person(person, trans)
|
||||||
|
#add child to family
|
||||||
|
self.dbstate.db.commit_family(family, trans)
|
||||||
|
|
||||||
def on_add_parents(self, obj, person_handle):
|
def on_add_parents(self, obj, person_handle):
|
||||||
family = gen.lib.Family()
|
family = gen.lib.Family()
|
||||||
childref = gen.lib.ChildRef()
|
childref = gen.lib.ChildRef()
|
||||||
|
@ -643,6 +643,14 @@ class FanChartDescWidget(FanChartBaseWidget):
|
|||||||
person = self.gen2fam[generation][pos][8]
|
person = self.gen2fam[generation][pos][8]
|
||||||
return person
|
return person
|
||||||
|
|
||||||
|
def family_at(self, generation, pos, btype):
|
||||||
|
"""
|
||||||
|
returns the family at generation, pos, btype
|
||||||
|
"""
|
||||||
|
if pos is None or btype == TYPE_BOX_NORMAL or generation < 0:
|
||||||
|
return None
|
||||||
|
return self.gen2fam[generation][pos][0]
|
||||||
|
|
||||||
def do_mouse_click(self):
|
def do_mouse_click(self):
|
||||||
# no drag occured, expand or collapse the section
|
# no drag occured, expand or collapse the section
|
||||||
self.change_slice(self._mouse_click_gen, self._mouse_click_sel,
|
self.change_slice(self._mouse_click_gen, self._mouse_click_sel,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user