В GTK при использовании перетаскивания в дерево, как мне не допустить падения между рядами?

StackOverflow https://stackoverflow.com/questions/2209650

Вопрос

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

alt text

Перетащите тег на карту ссылка на тег на карту. Так же перетягивает карту в тег.

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

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

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

alt text

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

Это было полезно?

Решение

Вам нужно подключиться к 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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top