2010-02-05 8 views
6

sto testando una finestra che sembra qualcosa di simile:In Gtk, quando si utilizza il trascinamento della selezione in un TreeView, come faccio a evitare di passare da una riga all'altra?

alt text

trascinamento di un tag a un link di carte il tag alla scheda. Così trascina una carta in un tag.

Non ha senso rilasciare un tag tra due carte o una carta tra due tag. Posso ignorare questi risultati nella funzione Handle...DataReceived in questo modo:

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

Tuttavia, durante il trascinamento, l'utente vede ancora la possibilità di inserire:

alt text

Come faccio a evitare che ciò accada?

risposta

3

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

Grazie - Ho effettuato il porting della maggior parte di questo, ma ho difficoltà a trovare un Gtk # equivalente a DragContext.drag_status di pygtk. Ecco la documentazione: http://www.go-mono.org/docs/index .aspx? link = T: Gdk.DragContext/* –

+0

Questo link è bro ken - il * dovrebbe essere parte di esso. –

+1

Mi ci è voluto un po 'per trovarlo, apparentemente è Gdk.Drag.Status in Gtk # (gdk_drag_status in C). –

1

È possibile definire diversi target per tag e schede e sul widget di sinistra accettare solo il target 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 emettono Eventi movimento con:

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

teoricamente, se ho capito bene, dovrebbe funzionare. Ma non potevo farlo sparare eventi di movimento :(

+0

Grazie - potrei non è stato chiaro: il mio problema non è che non voglio che il lato sinistro accetti sia le carte che i tag (utilizzo già obiettivi diversi). È che voglio solo essere in grado di rilasciare direttamente i tag, piuttosto che nel mezzo –