En Gtk, lors de l'utilisation de glisser-déposer dans un TreeView, comment puis-je éviter de tomber entre les lignes?
-
18-09-2019 - |
Question
Je teste une fenêtre qui ressemble à ceci:
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:
Comment puis-je éviter que cela se produise?
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: (