@@ -1598,8 +1598,8 @@ def motion_notify_event(self, _item, _target, event):
1598
1598
if self ._in_drag and (event .type == Gdk .EventType .MOTION_NOTIFY ):
1599
1599
# start drag when cursor moved more then 5
1600
1600
# 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 )):
1603
1603
self .uistate .set_busy_cursor (False )
1604
1604
# Remove all single click events
1605
1605
for click_item in self .click_events :
@@ -1617,18 +1617,29 @@ def motion_notify_event(self, _item, _target, event):
1617
1617
1618
1618
# setup targets
1619
1619
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 )
1625
1634
1626
- # start drag
1627
1635
drag_widget = self .get_widget ()
1636
+ # change event window
1637
+ event .window = drag_widget .get_window ()
1638
+ # start drag
1628
1639
drag_widget .drag_begin_with_coordinates (
1629
1640
tglist ,
1630
1641
Gdk .DragAction .COPY ,
1631
- Gdk .ModifierType . BUTTON1_MASK ,
1642
+ Gdk .KEY_Pointer_Button1 ,
1632
1643
event ,
1633
1644
x , y )
1634
1645
return True
@@ -1672,6 +1683,20 @@ def select_node(self, item, target, event):
1672
1683
if event .type != getattr (Gdk .EventType , "BUTTON_PRESS" ):
1673
1684
return False
1674
1685
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
+
1675
1700
if button == 1 and node_class == 'node' : # left mouse
1676
1701
if handle == self .active_person_handle :
1677
1702
# Find a parent of the active person so that they can become
@@ -1691,11 +1716,6 @@ def select_node(self, item, target, event):
1691
1716
context = GLib .main_context_default ()
1692
1717
self .click_events .append (context .find_source_by_id (click_event_id ))
1693
1718
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
-
1699
1719
elif button == 3 and node_class : # right mouse
1700
1720
if node_class == 'node' :
1701
1721
self .menu = PopupMenu (self , 'person' , handle )
@@ -1715,8 +1735,12 @@ def cb_drag_begin(self, widget, context):
1715
1735
"""
1716
1736
Called on start drag.
1717
1737
"""
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 )
1720
1744
1721
1745
def cb_drag_end (self , widget , context ):
1722
1746
"""
@@ -1727,17 +1751,39 @@ def cb_drag_end(self, widget, context):
1727
1751
def cb_drag_data_get (self , widget , context , sel_data , info , time ):
1728
1752
"""
1729
1753
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.
1731
1756
"""
1732
1757
tgs = [x .name () for x in context .list_targets ()]
1758
+
1733
1759
if info == DdTargets .PERSON_LINK .app_id :
1734
1760
data = (DdTargets .PERSON_LINK .drag_type ,
1735
1761
id (widget ), self .drag_person .handle , 0 )
1736
1762
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 )
1741
1787
1742
1788
def find_a_parent (self , handle ):
1743
1789
"""
0 commit comments