В Gtk, при использовании Перетаскивания в TreeView, как я удерживаюсь от отбрасывания между строками?

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

alt text

Перетаскивание Тега к Карте связывает Тег с Картой. Делает перетаскивание Карты к Тегу.

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

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

Однако при перетаскивании, пользователь все еще видит опцию вставить:

alt text

Как я предотвращаю это?

6
задан gpoo 23 January 2013 в 19:15
поделиться

2 ответа

Вам необходимо подключиться к сигналу 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
3
ответ дан 17 December 2019 в 07:04
поделиться

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

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

1
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: