In Gtk, quando si utilizza Drag and Drop in un TreeView, come faccio io continuo di cadere tra le righe?
-
18-09-2019 - |
Domanda
sto testando una finestra che sembra qualcosa di simile:
Il trascinamento di un tag a un link di carte il tag alla scheda. Così fa il trascinamento di una card a un tag.
E 'privo di senso far cadere un tag tra due schede, o una carta tra i due tag. Posso ignorare questi risultati nella funzione Handle...DataReceived
in questo modo:
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
Tuttavia, quando si trascina, l'utente vede ancora la possibilità di inserire:
Come faccio a evitare che ciò accada?
Soluzione
È necessario collegare al segnale drag-motion
e modificare il comportamento predefinito in modo che non indica una prima / dopo goccia:
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
Altri suggerimenti
È possibile definire obiettivi diversi per i tag e le carte, e sul widget sinistra accettare solo la destinazione che rappresenta i tag. Utilizzare il metodo Gtk.Drag.DestSet
. Forse qualcosa di simile:
Gtk.Drag.DestSet (widget, DestDefaults.All,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
Ho cercato di rendere la destinazione emettere Eventi movimento con:
Gtk.Drag.DestSet (widget, DestDefaults.Motion,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
in teoria, se ho capito bene, dovrebbe funzionare. Ma non potevo farlo fuoco eventi di movimento: (