@@ -1664,8 +1664,8 @@ def motion_notify_event(self, _item, _target, event):
1664
1664
if self ._in_drag and (event .type == Gdk .EventType .MOTION_NOTIFY ):
1665
1665
# start drag when cursor moved more then 5
1666
1666
# 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 )):
1669
1669
self .uistate .set_busy_cursor (False )
1670
1670
# Remove all single click events
1671
1671
for click_item in self .click_events :
@@ -1683,18 +1683,29 @@ def motion_notify_event(self, _item, _target, event):
1683
1683
1684
1684
# setup targets
1685
1685
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 )
1691
1700
1692
- # start drag
1693
1701
drag_widget = self .get_widget ()
1702
+ # change event window
1703
+ event .window = drag_widget .get_window ()
1704
+ # start drag
1694
1705
drag_widget .drag_begin_with_coordinates (
1695
1706
tglist ,
1696
1707
Gdk .DragAction .COPY ,
1697
- Gdk .ModifierType . BUTTON1_MASK ,
1708
+ Gdk .KEY_Pointer_Button1 ,
1698
1709
event ,
1699
1710
x , y )
1700
1711
return True
@@ -1739,6 +1750,20 @@ def select_node(self, item, target, event):
1739
1750
if event .type != getattr (Gdk .EventType , "BUTTON_PRESS" ):
1740
1751
return False
1741
1752
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
+
1742
1767
if button == 1 and node_class == 'node' : # left mouse
1743
1768
if handle == self .active_person_handle :
1744
1769
# Find a parent of the active person so that they can become
@@ -1758,11 +1783,6 @@ def select_node(self, item, target, event):
1758
1783
context = GLib .main_context_default ()
1759
1784
self .click_events .append (context .find_source_by_id (click_event_id ))
1760
1785
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
-
1766
1786
elif button == 3 and node_class : # right mouse
1767
1787
if node_class == 'node' :
1768
1788
self .menu = PopupMenu (self , 'person' , handle )
@@ -1782,8 +1802,12 @@ def cb_drag_begin(self, widget, context):
1782
1802
"""
1783
1803
Called on start drag.
1784
1804
"""
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 )
1787
1811
1788
1812
def cb_drag_end (self , widget , context ):
1789
1813
"""
@@ -1794,17 +1818,39 @@ def cb_drag_end(self, widget, context):
1794
1818
def cb_drag_data_get (self , widget , context , sel_data , info , time ):
1795
1819
"""
1796
1820
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.
1798
1823
"""
1799
1824
tgs = [x .name () for x in context .list_targets ()]
1825
+
1800
1826
if info == DdTargets .PERSON_LINK .app_id :
1801
1827
data = (DdTargets .PERSON_LINK .drag_type ,
1802
1828
id (widget ), self .drag_person .handle , 0 )
1803
1829
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 )
1808
1854
1809
1855
def find_a_parent (self , handle ):
1810
1856
"""
0 commit comments