Déplacement de lignes dans une NSOutlineView
Chacha
Membre
Salut,
j'ai une NSOutlineView (donc une NSTableView) qui affiche des choses. En l'occurence, je n'ai qu'une seule colonne et chaque case affiche une image et un texte, j'ai donc mis des NSButtonCell qui vont très bien, même si un clic dessus n'a rien à déclencher. Si vous avez mieux que NSButtonCell à me proposer, je suis preneur, mais ce n'est pas la question ici.
Maintenant, j'aimerais, (comme dans l'explorateur de fichier de XCode), déplacer des items au sein ma NSOutlineView. Pour cela, j'ai donc besoin de détecter un mouseDown sur un item, puis un mouseDragged pour le déplacer.
Sauf que... Une fois le mouseDown fait, un trackMouse:... est envoyé à la cellule, et plus aucun NSEvent de souris n'est capturé dans la NSOutlineView. J'ai bidouillé des tas de choses dans la gestion des événements et des firstResponder mais rien n'y a fait. Je n'ai pas réussi à capturer un "déplacement d'item".
Du coup, je me dis que je suis peut-être en train de m'y prendre comme un manche. Sauriez vous comment faire, donc, pour déplacer des items dans une NSOutlineView, comme dans l'explorateur de fichiers de XCode ?
+
Chacha
j'ai une NSOutlineView (donc une NSTableView) qui affiche des choses. En l'occurence, je n'ai qu'une seule colonne et chaque case affiche une image et un texte, j'ai donc mis des NSButtonCell qui vont très bien, même si un clic dessus n'a rien à déclencher. Si vous avez mieux que NSButtonCell à me proposer, je suis preneur, mais ce n'est pas la question ici.
Maintenant, j'aimerais, (comme dans l'explorateur de fichier de XCode), déplacer des items au sein ma NSOutlineView. Pour cela, j'ai donc besoin de détecter un mouseDown sur un item, puis un mouseDragged pour le déplacer.
Sauf que... Une fois le mouseDown fait, un trackMouse:... est envoyé à la cellule, et plus aucun NSEvent de souris n'est capturé dans la NSOutlineView. J'ai bidouillé des tas de choses dans la gestion des événements et des firstResponder mais rien n'y a fait. Je n'ai pas réussi à capturer un "déplacement d'item".
Du coup, je me dis que je suis peut-être en train de m'y prendre comme un manche. Sauriez vous comment faire, donc, pour déplacer des items dans une NSOutlineView, comme dans l'explorateur de fichiers de XCode ?
+
Chacha
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il existe une méthode "outlineview:writeitems:topasteboard" qui fait quasiment tout le boulot du drag à ma place !
Li bonheur, quoi.
+
Chacha
Si ton but est juste d'afficher une image et un texte dans la même cellule, je te conseille ImageAndTextCell (ou qqch dans le genre), qui se trouve dans l'exemple ...DragNDropOutlineView (/Developer/Examples/AppKit).
A+
Renaud
Merci ((unsigned int) -1) fois ! C'est exactement ce dont je rêvais. Exactement ce que je voulais faire !
Allez, je me lâche pour l'occasion : <br />Non vraiment, cet exemple est formidable.
+
Un Chacha tout guilleret
Vous buvez des pots ensembles en maudissant les smileys c'est ça ? :P
Vouais, moi je n'aime pas les smileys. Souvent, on exprime par un smiley ce qu'on aurait pu exprimer avec des mots en se cassant un peu la tête. Pour moi les smileys sont un appauvrissement du pouvoir d'expression.
Et en plus ça fait ramer mon iBook.
Gna gna gna
+
Chacha ronchon
Grâce à Renaud, j'ai pu faire la NSOutlineView de mes rêves (en matant DragNDropOutlineView (/Developer/Examples/AppKit))
Cependant, il y quelque chose que je n'arrive décidément pas à faire, même avec cet exemple : drag'n dropper une ligne vers le Finder pour y créer un fichier correspondant à ce que j'ai drag'n droppé.
Il semblerait que par défaut, il existe un mécanisme qui crée un fichier, mais je ne sais pas via quelle méthode. Je sais qu'il faut utiliser le NSPromiseFilesPboardType, je l'ai déjà utilisé par le passé, mais dans le contexte d'une NSOutlineView (ou NSTableView), je ne comprends pas, ce ne sont pas les méthodes habituelles performDragOperation, concludeDragOperation, nameofPromisedFileTypes... qui sont appelées.
Quelqu'un saurait comment faire ?
+
Chacha
Il me semble, mais ça remonte à loin, que les promiseFiles sont plutôt à utiliser si tu glisserais un fichier qui n'existe pas encore (comme par exemple un document qui a été créé, mais pas encore enregistré ou fichier se trouvant sur un serveur auquel l'utilisateur n'a pas accès). C'est à mon avis une mauvaise piste.
++
Renaud
Mais oui, c'est exactement ça : ma NSOutlineView contient des items, que moi je veux transformer en fichiers si l'utilisateur les glisse sur le Finder.
Sinon, au niveau du datasource de ton outlineview, tu as implémenté la méthode suivante (il y en a sûrement d'autres)?
[tt]- (NSArray *)outlineView:(NSOutlineView *)outlineView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination forDraggedItems:(NSArray *)items[/tt]
Ben... elle existe pas cette méthode ! En tous cas elle est pas dans ma doc. C'est une nouveauté Tiger ?
J'ai trouvé ceci: http://www.cocoabuilder.com/archive/message/cocoa/2005/4/11/132875. Et si c'est encore une boulette, je vais dormir.
Ben merci. Apparemment, je suis pas le seul à m'être posé la question; et si Tiger rajoute des méthodes, c'est bien qu'il y avait là un gros manque.
J'étudie ça
+
Chacha