2010-09-27 14 views
2

J'essaie d'implémenter glisser-déposer sur un wx.TreeCtrl et je dois gérer à la fois "copier" et "déplacer" des opérations (si l'utilisateur maintient CTRL enfoncé) . Tout d'abord, j'ai cherché le wiki pour un exemple et je suis confus comme à quelle méthode à utiliser .. Devrais-je utiliser DropSource/DropTarget ou juste gérer EVT_TREE_BEGIN_DRAG et EVT_TREE_END_DRAG?
Si ce dernier, comment puis-je savoir si l'utilisateur demande une opération "move" ?wx.TreeCtrl glisser-déposer, copier et déplacer

(wxPython 2.8.9.1 sur Ubuntu Jaunty)

Répondre

3

lecture du paragraphe pertinent de Cross-Platform GUI Programming with wxWidgets m'a donné la perspicacité nécessaire pour résoudre le problème :)
En fin de compte, je suis allé pour la première solution (DropSource/DropTarget) , donc:

tree.SetDropTarget(MyDropTarget()) 
tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.on_drag) 
tree.GetMainWindow().Bind(wx.EVT_MOUSE_CAPTURE_LOST, lambda x: None) 

(la seconde liaison évite une "fenêtre qui a capturé la souris n'a pas traité wxEVT_MOUSE_CAPTURE_LOST" mystérieux glisser)

def on_drag(self, evt): 
    # No evt.Allow() here, I won't use TreeCtrl's internal DND support 
    item = evt.GetItem() 
    if item == self.tree.GetRootItem(): 
     return 
    dropsrc = wx.DropSource(self) 
    # Populate dropsource 
    # ... 
    dropsrc.DoDragDrop(wx.Drag_AllowMove)