@@ -1451,8 +1451,8 @@ def motion_notify_event(self, _item, _target, event):
1451
1451
if self ._in_drag and (event .type == Gdk .EventType .MOTION_NOTIFY ):
1452
1452
# start drag when cursor moved more then 5
1453
1453
# to separate it from simple click
1454
- if ((abs (self ._last_x - event .x ) > 5 )
1455
- or (abs (self ._last_y - event .y ) > 5 )):
1454
+ if ((abs (self ._last_x - event .x_root ) > 5 )
1455
+ or (abs (self ._last_y - event .y_root ) > 5 )):
1456
1456
self .uistate .set_busy_cursor (False )
1457
1457
# Remove all single click events
1458
1458
for click_item in self .click_events :
@@ -1470,18 +1470,29 @@ def motion_notify_event(self, _item, _target, event):
1470
1470
1471
1471
# setup targets
1472
1472
tglist = Gtk .TargetList .new ([])
1473
- tglist .add (DdTargets .PERSON_LINK .atom_drag_type ,
1474
- DdTargets .PERSON_LINK .target_flags ,
1475
- DdTargets .PERSON_LINK .app_id )
1476
- # allow drag to a text document, info on drag_get will be 0L !
1477
- tglist .add_text_targets (0 )
1473
+ if self .drag_person is not None :
1474
+ tglist .add (DdTargets .PERSON_LINK .atom_drag_type ,
1475
+ DdTargets .PERSON_LINK .target_flags ,
1476
+ DdTargets .PERSON_LINK .app_id ,
1477
+ )
1478
+ # allow drag to a text document, info on drag_get will be 0
1479
+ tglist .add_text_targets (0 )
1480
+ if self .drag_family is not None :
1481
+ tglist .add (DdTargets .FAMILY_LINK .atom_drag_type ,
1482
+ DdTargets .FAMILY_LINK .target_flags ,
1483
+ DdTargets .FAMILY_LINK .app_id ,
1484
+ )
1485
+ # allow drag to a text document, info on drag_get will be 1
1486
+ tglist .add_text_targets (1 )
1478
1487
1479
- # start drag
1480
1488
drag_widget = self .get_widget ()
1489
+ # change event window
1490
+ event .window = drag_widget .get_window ()
1491
+ # start drag
1481
1492
drag_widget .drag_begin_with_coordinates (
1482
1493
tglist ,
1483
1494
Gdk .DragAction .COPY ,
1484
- Gdk .ModifierType . BUTTON1_MASK ,
1495
+ Gdk .KEY_Pointer_Button1 ,
1485
1496
event ,
1486
1497
x , y )
1487
1498
return True
@@ -1526,9 +1537,22 @@ def select_node(self, item, target, event):
1526
1537
if event .type != getattr (Gdk .EventType , "BUTTON_PRESS" ):
1527
1538
return False
1528
1539
1540
+ if button == 1 and node_class : # left mouse
1541
+ # set drag mode, it will be applyed on motion event
1542
+ self .drag_person = None
1543
+ self .drag_family = None
1544
+ if node_class == 'node' :
1545
+ self .drag_person = self .dbstate .db .get_person_from_handle (
1546
+ handle )
1547
+ if node_class == 'familynode' :
1548
+ self .drag_family = self .dbstate .db .get_family_from_handle (
1549
+ handle )
1550
+ self ._in_drag = True
1551
+ self ._last_x = event .x_root
1552
+ self ._last_y = event .y_root
1553
+
1529
1554
if button == 1 and node_class == 'node' : # left mouse
1530
1555
self .uistate .set_busy_cursor (True )
1531
- self .drag_person = self .dbstate .db .get_person_from_handle (handle )
1532
1556
if handle == self .active_person_handle :
1533
1557
# Find a parent of the active person so that they can become
1534
1558
# the active person, if no parents then leave as the current
@@ -1548,11 +1572,6 @@ def select_node(self, item, target, event):
1548
1572
context = GLib .main_context_default ()
1549
1573
self .click_events .append (context .find_source_by_id (click_event_id ))
1550
1574
1551
- # go to drag mode, applyed on motion event
1552
- self ._in_drag = True
1553
- self ._last_x = event .x
1554
- self ._last_y = event .y
1555
-
1556
1575
elif button == 3 and node_class : # right mouse
1557
1576
if node_class == 'node' :
1558
1577
self .menu = PopupMenu (self , 'person' , handle )
@@ -1572,8 +1591,12 @@ def cb_drag_begin(self, widget, context):
1572
1591
"""
1573
1592
Called on start drag.
1574
1593
"""
1575
- # set icon for person drag
1576
- Gtk .drag_set_icon_name (context , 'gramps-person' , 0 , 0 )
1594
+ tgs = [x .name () for x in context .list_targets ()]
1595
+ # set icon depending on person or family drag
1596
+ if DdTargets .PERSON_LINK .drag_type in tgs :
1597
+ Gtk .drag_set_icon_name (context , 'gramps-person' , 0 , 0 )
1598
+ if DdTargets .FAMILY_LINK .drag_type in tgs :
1599
+ Gtk .drag_set_icon_name (context , 'gramps-family' , 0 , 0 )
1577
1600
1578
1601
def cb_drag_end (self , widget , context ):
1579
1602
"""
@@ -1584,17 +1607,39 @@ def cb_drag_end(self, widget, context):
1584
1607
def cb_drag_data_get (self , widget , context , sel_data , info , time ):
1585
1608
"""
1586
1609
Returned parameters after drag.
1587
- Specified for 'person-link', for others return text info about person.
1610
+ Specified for 'person-link' and 'family-link',
1611
+ also to return text info about person or family.
1588
1612
"""
1589
1613
tgs = [x .name () for x in context .list_targets ()]
1614
+
1590
1615
if info == DdTargets .PERSON_LINK .app_id :
1591
1616
data = (DdTargets .PERSON_LINK .drag_type ,
1592
1617
id (widget ), self .drag_person .handle , 0 )
1593
1618
sel_data .set (sel_data .get_target (), 8 , pickle .dumps (data ))
1594
- elif ('TEXT' in tgs or 'text/plain' in tgs ) and info == 0 :
1595
- format_helper = FormattingHelper (self .dbstate )
1596
- sel_data .set_text (
1597
- format_helper .format_person (self .drag_person , 11 ),- 1 )
1619
+ elif info == DdTargets .FAMILY_LINK .app_id :
1620
+ data = (DdTargets .FAMILY_LINK .drag_type ,
1621
+ id (widget ), self .drag_family .handle , 0 )
1622
+ sel_data .set (sel_data .get_target (), 8 , pickle .dumps (data ))
1623
+ elif ('TEXT' in tgs or 'text/plain' in tgs ):
1624
+ if info == 0 :
1625
+ format_helper = FormattingHelper (self .dbstate )
1626
+ sel_data .set_text (
1627
+ format_helper .format_person (self .drag_person , 11 ),- 1 )
1628
+ if info == 1 :
1629
+ f_handle = self .drag_family .get_father_handle ()
1630
+ m_handle = self .drag_family .get_mother_handle ()
1631
+ if f_handle :
1632
+ father = self .dbstate .db .get_person_from_handle (f_handle )
1633
+ father = displayer .display (father )
1634
+ else :
1635
+ father = '...'
1636
+ if m_handle :
1637
+ mother = self .dbstate .db .get_person_from_handle (m_handle )
1638
+ mother = displayer .display (mother )
1639
+ else :
1640
+ mother = '...'
1641
+ sel_data .set_text (
1642
+ _ ('Family of %s and %s' ) % (father , mother ), - 1 )
1598
1643
1599
1644
def find_a_parent (self , handle ):
1600
1645
"""
0 commit comments