No GTK, ao usar arrastar e soltar em uma View Tree, como não deixar de cair entre as linhas?
-
18-09-2019 - |
Pergunta
Estou testando uma janela que se parece mais disso:
Arrastar uma tag para um cartão vincula a tag ao cartão. O mesmo acontece com o arrastar um cartão para uma tag.
Não faz sentido soltar uma etiqueta entre dois cartões ou um cartão entre duas tags. Eu posso ignorar esses resultados no Handle...DataReceived
função assim:
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
No entanto, ao arrastar, o usuário ainda vê a opção de inserir:
Como faço para impedir que isso aconteça?
Solução
Você precisa se conectar ao drag-motion
sinalize e altere o comportamento padrão para que nunca indique uma queda antes/depois:
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
Outras dicas
Você pode definir alvos diferentes para tags e cartões e, à esquerda, o widget aceita apenas o alvo que representa as tags. Usar Gtk.Drag.DestSet
método. Talvez algo como:
Gtk.Drag.DestSet (widget, DestDefaults.All,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
Eu tentei fazer o destino emitir eventos de movimento com:
Gtk.Drag.DestSet (widget, DestDefaults.Motion,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
Teoricamente, se eu entender corretamente, deve funcionar. Mas eu não consegui fazer eventos de movimento de fogo :(