Wie verhindere ich in Gtk, dass ich bei der Verwendung von Drag & Drop in einer TreeView nicht zwischen Zeilen springe?
-
18-09-2019 - |
Frage
Ich teste ein Fenster, das ungefähr so aussieht:
Durch Ziehen eines Tags auf eine Karte wird das Tag mit der Karte verknüpft.Dies gilt auch für das Ziehen einer Karte auf ein Tag.
Es macht keinen Sinn, einen Tag zwischen zwei Karten oder eine Karte zwischen zwei Tags fallen zu lassen.Ich kann diese Ergebnisse ignorieren Handle...DataReceived
funktionieren so:
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
Beim Ziehen sieht der Benutzer jedoch immer noch die Option zum Einfügen:
Wie kann ich verhindern, dass das passiert?
Lösung
Sie müssen eine Verbindung zum herstellen drag-motion
signalisieren und das Standardverhalten ändern, sodass es niemals auf einen Vorher-/Nachher-Abbruch hinweist:
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
Andere Tipps
Sie können verschiedene Ziele für Tags und Karten definieren und im linken Widget nur das Ziel akzeptieren, das die Tags darstellt.Verwenden Gtk.Drag.DestSet
Methode.Vielleicht so etwas wie:
Gtk.Drag.DestSet (widget, DestDefaults.All,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
Ich habe versucht, das Ziel dazu zu bringen, Bewegungsereignisse auszusenden mit:
Gtk.Drag.DestSet (widget, DestDefaults.Motion,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
Theoretisch sollte es funktionieren, wenn ich es richtig verstehe.Aber ich konnte es nicht dazu bringen, Bewegungsereignisse auszulösen :(