Skip to content

Commit f6b1651

Browse files
committed
add family DnD
1 parent cd22c3a commit f6b1651

File tree

1 file changed

+67
-21
lines changed

1 file changed

+67
-21
lines changed

GraphView/graphview.py

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,8 +1598,8 @@ def motion_notify_event(self, _item, _target, event):
15981598
if self._in_drag and (event.type == Gdk.EventType.MOTION_NOTIFY):
15991599
# start drag when cursor moved more then 5
16001600
# to separate it from simple click
1601-
if ((abs(self._last_x - event.x) > 5)
1602-
or (abs(self._last_y - event.y) > 5)):
1601+
if ((abs(self._last_x - event.x_root) > 5)
1602+
or (abs(self._last_y - event.y_root) > 5)):
16031603
self.uistate.set_busy_cursor(False)
16041604
# Remove all single click events
16051605
for click_item in self.click_events:
@@ -1617,18 +1617,29 @@ def motion_notify_event(self, _item, _target, event):
16171617

16181618
# setup targets
16191619
tglist = Gtk.TargetList.new([])
1620-
tglist.add(DdTargets.PERSON_LINK.atom_drag_type,
1621-
DdTargets.PERSON_LINK.target_flags,
1622-
DdTargets.PERSON_LINK.app_id)
1623-
# allow drag to a text document, info on drag_get will be 0L !
1624-
tglist.add_text_targets(0)
1620+
if self.drag_person is not None:
1621+
tglist.add(DdTargets.PERSON_LINK.atom_drag_type,
1622+
DdTargets.PERSON_LINK.target_flags,
1623+
DdTargets.PERSON_LINK.app_id,
1624+
)
1625+
# allow drag to a text document, info on drag_get will be 0
1626+
tglist.add_text_targets(0)
1627+
if self.drag_family is not None:
1628+
tglist.add(DdTargets.FAMILY_LINK.atom_drag_type,
1629+
DdTargets.FAMILY_LINK.target_flags,
1630+
DdTargets.FAMILY_LINK.app_id,
1631+
)
1632+
# allow drag to a text document, info on drag_get will be 1
1633+
tglist.add_text_targets(1)
16251634

1626-
# start drag
16271635
drag_widget = self.get_widget()
1636+
# change event window
1637+
event.window = drag_widget.get_window()
1638+
# start drag
16281639
drag_widget.drag_begin_with_coordinates(
16291640
tglist,
16301641
Gdk.DragAction.COPY,
1631-
Gdk.ModifierType.BUTTON1_MASK,
1642+
Gdk.KEY_Pointer_Button1,
16321643
event,
16331644
x, y)
16341645
return True
@@ -1672,6 +1683,20 @@ def select_node(self, item, target, event):
16721683
if event.type != getattr(Gdk.EventType, "BUTTON_PRESS"):
16731684
return False
16741685

1686+
if button == 1 and node_class: # left mouse
1687+
# set drag mode, it will be applyed on motion event
1688+
self.drag_person = None
1689+
self.drag_family = None
1690+
if node_class == 'node':
1691+
self.drag_person = self.dbstate.db.get_person_from_handle(
1692+
handle)
1693+
if node_class == 'familynode':
1694+
self.drag_family = self.dbstate.db.get_family_from_handle(
1695+
handle)
1696+
self._in_drag = True
1697+
self._last_x = event.x_root
1698+
self._last_y = event.y_root
1699+
16751700
if button == 1 and node_class == 'node': # left mouse
16761701
if handle == self.active_person_handle:
16771702
# Find a parent of the active person so that they can become
@@ -1691,11 +1716,6 @@ def select_node(self, item, target, event):
16911716
context = GLib.main_context_default()
16921717
self.click_events.append(context.find_source_by_id(click_event_id))
16931718

1694-
# go to drag mode, applyed on motion event
1695-
self._in_drag = True
1696-
self._last_x = event.x
1697-
self._last_y = event.y
1698-
16991719
elif button == 3 and node_class: # right mouse
17001720
if node_class == 'node':
17011721
self.menu = PopupMenu(self, 'person', handle)
@@ -1715,8 +1735,12 @@ def cb_drag_begin(self, widget, context):
17151735
"""
17161736
Called on start drag.
17171737
"""
1718-
# set icon for person drag
1719-
Gtk.drag_set_icon_name(context, 'gramps-person', 0, 0)
1738+
tgs = [x.name() for x in context.list_targets()]
1739+
# set icon depending on person or family drag
1740+
if DdTargets.PERSON_LINK.drag_type in tgs:
1741+
Gtk.drag_set_icon_name(context, 'gramps-person', 0, 0)
1742+
if DdTargets.FAMILY_LINK.drag_type in tgs:
1743+
Gtk.drag_set_icon_name(context, 'gramps-family', 0, 0)
17201744

17211745
def cb_drag_end(self, widget, context):
17221746
"""
@@ -1727,17 +1751,39 @@ def cb_drag_end(self, widget, context):
17271751
def cb_drag_data_get(self, widget, context, sel_data, info, time):
17281752
"""
17291753
Returned parameters after drag.
1730-
Specified for 'person-link', for others return text info about person.
1754+
Specified for 'person-link' and 'family-link',
1755+
also to return text info about person or family.
17311756
"""
17321757
tgs = [x.name() for x in context.list_targets()]
1758+
17331759
if info == DdTargets.PERSON_LINK.app_id:
17341760
data = (DdTargets.PERSON_LINK.drag_type,
17351761
id(widget), self.drag_person.handle, 0)
17361762
sel_data.set(sel_data.get_target(), 8, pickle.dumps(data))
1737-
elif ('TEXT' in tgs or 'text/plain' in tgs) and info == 0:
1738-
format_helper = FormattingHelper(self.dbstate)
1739-
sel_data.set_text(
1740-
format_helper.format_person(self.drag_person, 11),-1)
1763+
elif info == DdTargets.FAMILY_LINK.app_id:
1764+
data = (DdTargets.FAMILY_LINK.drag_type,
1765+
id(widget), self.drag_family.handle, 0)
1766+
sel_data.set(sel_data.get_target(), 8, pickle.dumps(data))
1767+
elif ('TEXT' in tgs or 'text/plain' in tgs):
1768+
if info == 0:
1769+
format_helper = FormattingHelper(self.dbstate)
1770+
sel_data.set_text(
1771+
format_helper.format_person(self.drag_person, 11),-1)
1772+
if info == 1:
1773+
f_handle = self.drag_family.get_father_handle()
1774+
m_handle = self.drag_family.get_mother_handle()
1775+
if f_handle:
1776+
father = self.dbstate.db.get_person_from_handle(f_handle)
1777+
father = displayer.display(father)
1778+
else:
1779+
father = '...'
1780+
if m_handle:
1781+
mother = self.dbstate.db.get_person_from_handle(m_handle)
1782+
mother = displayer.display(mother)
1783+
else:
1784+
mother = '...'
1785+
sel_data.set_text(
1786+
_('Family of %s and %s') % (father, mother), -1)
17411787

17421788
def find_a_parent(self, handle):
17431789
"""

0 commit comments

Comments
 (0)