@@ -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