Skip to content

Commit 272158c

Browse files
committed
add family DnD
1 parent edcf805 commit 272158c

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
@@ -1664,8 +1664,8 @@ def motion_notify_event(self, _item, _target, event):
16641664
if self._in_drag and (event.type == Gdk.EventType.MOTION_NOTIFY):
16651665
# start drag when cursor moved more then 5
16661666
# to separate it from simple click
1667-
if ((abs(self._last_x - event.x) > 5)
1668-
or (abs(self._last_y - event.y) > 5)):
1667+
if ((abs(self._last_x - event.x_root) > 5)
1668+
or (abs(self._last_y - event.y_root) > 5)):
16691669
self.uistate.set_busy_cursor(False)
16701670
# Remove all single click events
16711671
for click_item in self.click_events:
@@ -1683,18 +1683,29 @@ def motion_notify_event(self, _item, _target, event):
16831683

16841684
# setup targets
16851685
tglist = Gtk.TargetList.new([])
1686-
tglist.add(DdTargets.PERSON_LINK.atom_drag_type,
1687-
DdTargets.PERSON_LINK.target_flags,
1688-
DdTargets.PERSON_LINK.app_id)
1689-
# allow drag to a text document, info on drag_get will be 0L !
1690-
tglist.add_text_targets(0)
1686+
if self.drag_person is not None:
1687+
tglist.add(DdTargets.PERSON_LINK.atom_drag_type,
1688+
DdTargets.PERSON_LINK.target_flags,
1689+
DdTargets.PERSON_LINK.app_id,
1690+
)
1691+
# allow drag to a text document, info on drag_get will be 0
1692+
tglist.add_text_targets(0)
1693+
if self.drag_family is not None:
1694+
tglist.add(DdTargets.FAMILY_LINK.atom_drag_type,
1695+
DdTargets.FAMILY_LINK.target_flags,
1696+
DdTargets.FAMILY_LINK.app_id,
1697+
)
1698+
# allow drag to a text document, info on drag_get will be 1
1699+
tglist.add_text_targets(1)
16911700

1692-
# start drag
16931701
drag_widget = self.get_widget()
1702+
# change event window
1703+
event.window = drag_widget.get_window()
1704+
# start drag
16941705
drag_widget.drag_begin_with_coordinates(
16951706
tglist,
16961707
Gdk.DragAction.COPY,
1697-
Gdk.ModifierType.BUTTON1_MASK,
1708+
Gdk.KEY_Pointer_Button1,
16981709
event,
16991710
x, y)
17001711
return True
@@ -1739,6 +1750,20 @@ def select_node(self, item, target, event):
17391750
if event.type != getattr(Gdk.EventType, "BUTTON_PRESS"):
17401751
return False
17411752

1753+
if button == 1 and node_class: # left mouse
1754+
# set drag mode, it will be applyed on motion event
1755+
self.drag_person = None
1756+
self.drag_family = None
1757+
if node_class == 'node':
1758+
self.drag_person = self.dbstate.db.get_person_from_handle(
1759+
handle)
1760+
if node_class == 'familynode':
1761+
self.drag_family = self.dbstate.db.get_family_from_handle(
1762+
handle)
1763+
self._in_drag = True
1764+
self._last_x = event.x_root
1765+
self._last_y = event.y_root
1766+
17421767
if button == 1 and node_class == 'node': # left mouse
17431768
if handle == self.active_person_handle:
17441769
# Find a parent of the active person so that they can become
@@ -1758,11 +1783,6 @@ def select_node(self, item, target, event):
17581783
context = GLib.main_context_default()
17591784
self.click_events.append(context.find_source_by_id(click_event_id))
17601785

1761-
# go to drag mode, applyed on motion event
1762-
self._in_drag = True
1763-
self._last_x = event.x
1764-
self._last_y = event.y
1765-
17661786
elif button == 3 and node_class: # right mouse
17671787
if node_class == 'node':
17681788
self.menu = PopupMenu(self, 'person', handle)
@@ -1782,8 +1802,12 @@ def cb_drag_begin(self, widget, context):
17821802
"""
17831803
Called on start drag.
17841804
"""
1785-
# set icon for person drag
1786-
Gtk.drag_set_icon_name(context, 'gramps-person', 0, 0)
1805+
tgs = [x.name() for x in context.list_targets()]
1806+
# set icon depending on person or family drag
1807+
if DdTargets.PERSON_LINK.drag_type in tgs:
1808+
Gtk.drag_set_icon_name(context, 'gramps-person', 0, 0)
1809+
if DdTargets.FAMILY_LINK.drag_type in tgs:
1810+
Gtk.drag_set_icon_name(context, 'gramps-family', 0, 0)
17871811

17881812
def cb_drag_end(self, widget, context):
17891813
"""
@@ -1794,17 +1818,39 @@ def cb_drag_end(self, widget, context):
17941818
def cb_drag_data_get(self, widget, context, sel_data, info, time):
17951819
"""
17961820
Returned parameters after drag.
1797-
Specified for 'person-link', for others return text info about person.
1821+
Specified for 'person-link' and 'family-link',
1822+
also to return text info about person or family.
17981823
"""
17991824
tgs = [x.name() for x in context.list_targets()]
1825+
18001826
if info == DdTargets.PERSON_LINK.app_id:
18011827
data = (DdTargets.PERSON_LINK.drag_type,
18021828
id(widget), self.drag_person.handle, 0)
18031829
sel_data.set(sel_data.get_target(), 8, pickle.dumps(data))
1804-
elif ('TEXT' in tgs or 'text/plain' in tgs) and info == 0:
1805-
format_helper = FormattingHelper(self.dbstate)
1806-
sel_data.set_text(
1807-
format_helper.format_person(self.drag_person, 11),-1)
1830+
elif info == DdTargets.FAMILY_LINK.app_id:
1831+
data = (DdTargets.FAMILY_LINK.drag_type,
1832+
id(widget), self.drag_family.handle, 0)
1833+
sel_data.set(sel_data.get_target(), 8, pickle.dumps(data))
1834+
elif ('TEXT' in tgs or 'text/plain' in tgs):
1835+
if info == 0:
1836+
format_helper = FormattingHelper(self.dbstate)
1837+
sel_data.set_text(
1838+
format_helper.format_person(self.drag_person, 11),-1)
1839+
if info == 1:
1840+
f_handle = self.drag_family.get_father_handle()
1841+
m_handle = self.drag_family.get_mother_handle()
1842+
if f_handle:
1843+
father = self.dbstate.db.get_person_from_handle(f_handle)
1844+
father = displayer.display(father)
1845+
else:
1846+
father = '...'
1847+
if m_handle:
1848+
mother = self.dbstate.db.get_person_from_handle(m_handle)
1849+
mother = displayer.display(mother)
1850+
else:
1851+
mother = '...'
1852+
sel_data.set_text(
1853+
_('Family of %s and %s') % (father, mother), -1)
18081854

18091855
def find_a_parent(self, handle):
18101856
"""

0 commit comments

Comments
 (0)