In Gtk, quando si utilizza Drag and Drop in un TreeView, come faccio io continuo di cadere tra le righe?

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

Domanda

sto testando una finestra che sembra qualcosa di simile:

alt text

Il trascinamento di un tag a un link di carte il tag alla scheda. Così fa il trascinamento di una card a un tag.

E 'privo di senso far cadere un tag tra due schede, o una carta tra i due tag. Posso ignorare questi risultati nella funzione Handle...DataReceived in questo modo:

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

Tuttavia, quando si trascina, l'utente vede ancora la possibilità di inserire:

alt text

Come faccio a evitare che ciò accada?

È stato utile?

Soluzione

È 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

Altri suggerimenti

È possibile definire obiettivi diversi per i tag e le carte, e sul widget sinistra accettare solo la destinazione 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 emettere Eventi movimento con:

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

in teoria, se ho capito bene, dovrebbe funzionare. Ma non potevo farlo fuoco eventi di movimento: (

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top