2010-02-05 13 views
6

Estoy probando una ventana que se ve algo como esto:En Gtk, al usar Arrastrar y soltar en un TreeView, ¿cómo evito que caiga entre filas?

alt text

Arrastrando una etiqueta a una tarjeta de la etiqueta de enlaces a la tarjeta. Lo mismo ocurre con arrastrar una carta a una etiqueta.

No tiene sentido colocar una etiqueta entre dos tarjetas, o una tarjeta entre dos etiquetas. Puedo ignorar estos resultados en la función Handle...DataReceived así:

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

Sin embargo, cuando se arrastra, el usuario ve la opción de insertar:

alt text

¿cómo puedo evitar que esto suceda?

Respuesta

3

que necesita para conectarse a la señal de drag-motion y cambiar el comportamiento por defecto por lo que nunca indica un antes/después de la caída:

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

Gracias - He portado la mayor parte de esto, pero estoy teniendo problemas para encontrar un Gtk # equivalente a DragContext.drag_status de pygtk. Aquí está la documentación: http://www.go-mono.org/docs/index .aspx? link = T: Gdk.DragContext/* –

+0

Ese enlace es hermano Ken: se supone que el * es parte de eso. –

+1

Me tomó un tiempo encontrarlo también: aparentemente es Gdk.Drag.Status en Gtk # (gdk_drag_status en C). –

1

Puede definir objetivos diferentes para etiquetas y tarjetas, y en el widget izquierdo solo aceptar el destino que representa las etiquetas. Use el método Gtk.Drag.DestSet. Tal vez algo como:

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

he intentado hacer el destino emite Eventos de movimiento con:

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

teóricamente, si he entendido bien, debería funcionar. Pero no podía hacerlo disparar eventos de movimiento :(

+0

Gracias - Me podría No lo tengo claro: mi problema no es que no desee que el lado izquierdo acepte tanto tarjetas como etiquetas (ya utilizo objetivos diferentes). Es que solo quiero poder colocar directamente etiquetas, en lugar de hacerlo entre ellas. ellos. –