В GTK при использовании перетаскивания в дерево, как мне не допустить падения между рядами?
-
18-09-2019 - |
Вопрос
Я проверяю окно, которое выглядит примерно так:
Перетащите тег на карту ссылка на тег на карту. Так же перетягивает карту в тег.
Бессмысленно бросить метку между двумя картами или картой между двумя тегами. Я могу игнорировать эти результаты в Handle...DataReceived
функционируйте так:
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
Однако при перетаскивании пользователь по -прежнему видит возможность вставить:
Как предотвратить это?
Решение
Вам нужно подключиться к 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);
Теоретически, если я понимаю это правильно, это должно работать. Но я не мог сделать это событиями огня :(