En Gtk, lors de l'utilisation de glisser-déposer dans un TreeView, comment puis-je éviter de tomber entre les lignes?

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

Question

Je teste une fenêtre qui ressemble à ceci:

text alt

Faire glisser une étiquette à une carte de liens la balise à la carte. Il en va de glisser une carte à une balise.

Il est inutile de déposer une étiquette entre deux cartes, ou une carte entre deux balises. Je peux ignorer ces résultats dans la fonction Handle...DataReceived comme ceci:

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

Cependant, lors du déplacement, l'utilisateur voit toujours la possibilité d'insérer:

text alt

Comment puis-je éviter que cela se produise?

Était-ce utile?

La solution

Vous devez vous connecter au signal drag-motion et changer le comportement par défaut de sorte qu'il indique jamais avant / après la chute:

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

Autres conseils

Vous pouvez définir des cibles pour les balises et les cartes, et sur le widget gauche accepte que la cible qui représente les balises. Utiliser la méthode Gtk.Drag.DestSet. Peut-être quelque chose comme:

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

J'ai essayé de rendre la destination émettre des événements de mouvement avec:

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

théoriquement, si je comprends bien, il devrait fonctionner. Mais je ne pouvais pas faire déclencher des événements de mouvement: (

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top