В Gtk, при использовании перетаскивания в TreeView, как мне избежать падения между строками? - PullRequest
6 голосов
/ 05 февраля 2010

Я тестирую окно, которое выглядит примерно так:

alt text

Перетаскивание метки на карточку связывает метку с карточкой. Так же как и перетаскивание карты в тег.

Бессмысленно бросать метку между двумя карточками или карточку между двумя метками. Я могу игнорировать эти результаты в функции Handle...DataReceived следующим образом:

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

Однако при перетаскивании пользователь по-прежнему видит возможность вставить:

alt text

Как мне предотвратить это?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

Вам необходимо подключиться к сигналу 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
1 голос
/ 06 февраля 2010

Вы можете определить различные цели для тегов и карточек, и на левом виджете принимайте только цель, которая представляет теги. Используйте метод 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);

теоретически, если я правильно понимаю, это должно работать. Но я не мог заставить его запускать события движения: (

...