7

我正在测试一个看起来像这样的窗口:

替代文字

将标签拖到卡片上会将标签链接到卡片。将卡片拖到标签上也是如此。

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

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

但是,在拖动时,用户仍然可以看到插入选项:

替代文字

我该如何防止这种情况发生?

4

2 回答 2

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
于 2010-02-06T05:38:46.397 回答
1

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

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

我试图让目的地发出 Motion 事件:

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

从理论上讲,如果我理解正确,它应该可以工作。但我不能让它触发运动事件:(

于 2010-02-05T23:36:45.613 回答