Wie verhindere ich in Gtk, dass ich bei der Verwendung von Drag & Drop in einer TreeView nicht zwischen Zeilen springe?

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

Frage

Ich teste ein Fenster, das ungefähr so ​​aussieht:

alt text

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:

alt text

Wie kann ich verhindern, dass das passiert?

War es hilfreich?

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 :(

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top