代码之家  ›  专栏  ›  技术社区  ›  Matthew

在Gtk中,在树状视图中使用拖放时,如何防止在行之间拖放?

  •  6
  • Matthew  · 技术社区  · 16 年前

    我正在测试一个如下所示的窗口:

    alt text

    在两张牌之间或者两张牌之间放一张牌是没有意义的。我可以在未来忽略这些结果 Handle...DataReceived

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

    但是,拖动时,用户仍会看到要插入的选项:

    alt text

    2 回复  |  直到 13 年前
        1
  •  3
  •   Johannes Sasongko    16 年前

    您需要连接到 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
    
        2
  •  1
  •   silk    16 年前

    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);
    

    理论上,如果我理解正确,它应该会起作用。但我不能让它成为射击动作事件:(