2010-02-05 66 views
6

我测试,看起来像这样的窗口:在Gtk中,当在TreeView中使用拖放操作时,如何避免在行间拖放?

alt text

拖动标签的卡链接标签的卡。因此,将卡片拖放到标签。

在两张卡之间放置一个标签或在两个标签之间放置一张卡是没有意义的。我可以在这样的Handle...DataReceived函数忽略这些成果:

if (dropPos != TreeViewDropPosition.IntoOrAfter && 
    dropPos != TreeViewDropPosition.IntoOrBefore) 
    return; 

然而,在拖曳时,用户仍然可以看到插入选项:

alt text

如何防止这种情况的发生?

回答

3

您需要连接到drag-motion信号,并更改默认行为运动事件,以便它从未指示前/下降后:

def _drag_motion(self, widget, context, x, y, etime): 
    drag_info = widget.get_dest_row_at_pos(x, y) 
    if not drag_info: 
     return False 
    path, pos = drag_info 
    if pos == gtk.TREE_VIEW_DROP_BEFORE: 
     widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE) 
    elif pos == gtk.TREE_VIEW_DROP_AFTER: 
     widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_AFTER) 
    context.drag_status(context.suggested_action, etime) 
    return True 
+0

谢谢 - 我已经移植了大部分,但是我在找到一个相当于pygtk的DragContext.drag_status的Gtk#时遇到了困难。以下是文档:http://www.go-mono.org/docs/index .aspx?link = T:Gdk.DragContext/* – 2010-02-06 20:09:12

+0

该链接是bro肯 - *应该是它的一部分。 – 2010-02-06 20:17:04

+1

花了我一段时间找到它:显然它是Gtk#中的Gdk.Drag.Status(C中的gdk_drag_status)。 – 2010-02-06 22:14:14

1

您可以为标签和卡片定义不同的目标,在左侧的小部件上只接受表示标签的目标。使用Gtk.Drag.DestSet方法。也许是这样的:

 Gtk.Drag.DestSet (widget, DestDefaults.All, 
         new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) }, 
         DragAction.Default); 

我试图使目标发射与运动事件:

 Gtk.Drag.DestSet (widget, DestDefaults.Motion, 
         new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) }, 
         DragAction.Default); 

从理论上说,如果我理解正确的话,它应该工作。但我不能让它火:(

+0

谢谢 - 我可能会不是很清楚:我的问题不是我不希望左侧接受卡片和标签(我已经使用不同的目标),而是我只想直接放在标签上,而不是在两者之间 – 2010-02-06 00:57:35