En GTK, al usar arrastrar y soltar en una vista de árbol, ¿cómo evito dejar caer entre filas?

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

Pregunta

Estoy probando una ventana que se parece a esto:

alt text

Arrastrar una etiqueta a una tarjeta vincula la etiqueta a la tarjeta. También lo hace arrastrar una tarjeta a una etiqueta.

No tiene sentido soltar una etiqueta entre dos cartas, o una tarjeta entre dos etiquetas. Puedo ignorar estos resultados en el Handle...DataReceived función de esta manera:

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

Sin embargo, al arrastrar, el usuario todavía ve la opción de insertar:

alt text

¿Cómo evito que esto suceda?

¿Fue útil?

Solución

Necesitas conectarte al drag-motion señal y cambie el comportamiento predeterminado para que nunca indique 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

Otros consejos

Puede definir diferentes objetivos para etiquetas y tarjetas, y en el widget izquierdo acepta solo el objetivo que representa las etiquetas. Usar Gtk.Drag.DestSet método. Quizás algo como:

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

Traté de hacer que el destino emita 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 lo entiendo correctamente, debería funcionar. Pero no pude hacer que Fire Motion Events :(

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top