2010-02-05 10 views
6

Ich teste ein Fenster, das ungefähr so ​​aussieht:In Gtk, wenn ich Drag-and-Drop in einer TreeView verwende, wie kann ich nicht zwischen den Zeilen ablegen?

alt text

einen Tag auf eine Karte Links, um den Tag auf die Karte Ziehen. So zieht eine Karte zu einem Tag.

Es ist bedeutungslos, ein Tag zwischen zwei Karten oder eine Karte zwischen zwei Tags fallen zu lassen. Ich kann diese Ergebnisse in der Handle...DataReceived Funktion wie diese ignoriert:

if (dropPos != TreeViewDropPosition.IntoOrAfter && 
    dropPos != TreeViewDropPosition.IntoOrBefore) 
    return; 

jedoch beim Ziehen, sieht der Benutzer noch die Möglichkeit zum Einfügen:

alt text

Wie verhindere ich, dass dies geschieht?

Antwort

3

Sie müssen mit dem drag-motion Signal verbinden und das Standardverhalten ändern, so dass es nie eine vor/nach Abfall zeigt:

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 
+0

Danke - Ich habe das meiste portiert, aber ich habe Probleme, eine Gtk # Entsprechung zu pygtk's DragContext.drag_status zu finden. Hier ist die Dokumentation: http://www.go-mono.org/docs/index .aspx? link = T: Gdk.DragContext/* –

+0

Dieser Link ist bro ken - das * soll ein Teil davon sein. –

+1

Hat mich auch eine Weile gebraucht, um es zu finden: anscheinend ist es Gdk.Drag.Status in Gtk # (gdk_drag_status in C). –

1

Sie können verschiedene Ziele für Tags und Karten definieren und auf dem linken Widget nur das Ziel akzeptieren, das die Tags darstellt. Verwenden Sie die Methode Gtk.Drag.DestSet. 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 Ereignisse emittieren Bewegung mit zu machen:

 Gtk.Drag.DestSet (widget, DestDefaults.Motion, 
         new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) }, 
         DragAction.Default); 

theoretisch, wenn ich es richtig verstehen, sollte es funktionieren. Aber ich konnte es nicht Bewegung Ereignisse machen Feuer :(

+0

Danke - ich könnte Es war nicht klar: Mein Problem ist nicht, dass ich nicht möchte, dass die linke Seite sowohl Karten als auch Tags akzeptiert (ich benutze bereits andere Ziele.) Ich möchte nur direkt auf Tags verzichten können, anstatt dazwischen –