拖放时防止树视图选择丢失

时间:2010-10-29 08:49:25

标签: drag-and-drop pygtk gtktreeview

我有一个gtk.Treeview设置作为拖动源:

self.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY)

并且TreeSelection设置为SELECT_MULTIPLE

但每次我尝试拖动多行选择时,光标会跳转到当前鼠标位置,将选择重置为当前行。即使鼠标位于所选行之一上方。它仅在我按住 Shift Ctrl 按钮时才有效。

发生了什么事?

修改1:

我已经设置了一个简单的树视图来排除我的代码中的任何错误,它也做同样的事情。

编辑2:

我找到了一个可以实现我想要的代码片段。它来自quod libet来源,名为MultiDragTreeView

2 个答案:

答案 0 :(得分:1)

我找到了一个可以实现我想要的代码片段。它来自quod libet来源,称为'MultiDragTreeView'。引用文档字符串:

"""TreeView with multirow drag support:
* Selections don't change until button-release-event...
* Unless they're a Shift/Ctrl modification, then they happen immediately
* Drag icons include 3 rows/2 plus a "and more" count"""

答案 1 :(得分:0)

我找到了解决方法,如果选择了项目,请从选择中删除该项目,然后向事件添加控制掩码。

def on_iconview_button_press_event(widget, event):
    if event.type != Gdk.EventType.BUTTON_PRESS or event.button != 1:
        return
    if (event.state & Gdk.ModifierType.CONTROL_MASK):#do no changes if ctrl is pressed
        return
    path = widget.get_path_at_pos(event.x, event.y)
    if not path:
        return
    if widget.path_is_selected(path):
        widget.unselect_path(path)
        event.state |= Gdk.ModifierType.CONTROL_MASK
        return
iconview.connect('button-press-event', on_iconview_button_press_event)