[Résolu] Toolbar+bouton "double effet"+ analyse de code Shiira-j'ysuis.
LeChatNoir
Membre, Modérateur
Salut les planteurs de fèves,
Bon pour ceux qui n'ont pas suivi, je reviens un peu sur ce sujet :
http://www.objective-cocoa.org/forum/index.php?topic=1578.0
Voilà mon problème :
J'ai bien réussi à implémenter le bouton "double effet Kiss Cocoa" :
* un click = action
* un click prolongé = pop up menu.
Dans une fenêtre ou une vue classique, no problemo.
J'arrive même à le mettre dans une NSToolBar.
J'ai mon bouton "double effet", et je fais un [toolbarItem setView:monBouton];
Et ca marche Mesdames et Messieurs :adios!:
Seulement voilà : quand je fais une personnalisation de la toolbar, et que je coche "Use small size", Bbbbbbbbeeeeuuuuuup, ca resize pasÂ
Bon j'ai essayé plein de trucs genre sous-classer NSToolbar pour trapper le "setSizeMode", etc, etc...
J'arrive bon an, mal an, à faire en sorte que ca marche mais quand les icones sont petits, ils apparaissent en petit dans la palette de personalisationÂ
Bref, dans un moment de lucidité, je me suis dit : dans Shiira, ca marche comment ?
Et ô miracle, tout fonctionne comme je veux :
* bouton "double effet" dans barre d'outil,
* personnalisation de la toolbar possible,
* le bouton se resize comme il faut,
* quand il est en petit, il apparaà®t normal dans la palette de perso.
Je me lance donc dans l'analyse du code et devinez quoi ? Je sèche.
Voilà mon analyse :
* ils n'utilisent pas le setView pour le NSToolbarItem. Ils utilisent le setImage et setAction classique. Dans ce cas là (je l'ai testé dans mon appli), tout fonctionne au niveau des resize.
Par contre, pour le "double effet", comment font ils ?
J'ai repéré où ca se faisait.
C'est dans une sous classe d'une sous classe de NSView.
Mais nul part je trouve l'endroit où ils disent que la NSToolbar dépend de cette NSView ?!!!!
En gros, je pense qu'à un moment, cette vue trappe les évènement qui se déroulent sur la NSToolbar et agit en fonction... Mais il me manque ce petit lien... Où est il fait ?
Est ce que quelqu'un peut m'aider ?
:why?:
Bon pour ceux qui n'ont pas suivi, je reviens un peu sur ce sujet :
http://www.objective-cocoa.org/forum/index.php?topic=1578.0
Voilà mon problème :
J'ai bien réussi à implémenter le bouton "double effet Kiss Cocoa" :
* un click = action
* un click prolongé = pop up menu.
Dans une fenêtre ou une vue classique, no problemo.
J'arrive même à le mettre dans une NSToolBar.
J'ai mon bouton "double effet", et je fais un [toolbarItem setView:monBouton];
Et ca marche Mesdames et Messieurs :adios!:
Seulement voilà : quand je fais une personnalisation de la toolbar, et que je coche "Use small size", Bbbbbbbbeeeeuuuuuup, ca resize pasÂ
Bon j'ai essayé plein de trucs genre sous-classer NSToolbar pour trapper le "setSizeMode", etc, etc...
J'arrive bon an, mal an, à faire en sorte que ca marche mais quand les icones sont petits, ils apparaissent en petit dans la palette de personalisationÂ
Bref, dans un moment de lucidité, je me suis dit : dans Shiira, ca marche comment ?
Et ô miracle, tout fonctionne comme je veux :
* bouton "double effet" dans barre d'outil,
* personnalisation de la toolbar possible,
* le bouton se resize comme il faut,
* quand il est en petit, il apparaà®t normal dans la palette de perso.
Je me lance donc dans l'analyse du code et devinez quoi ? Je sèche.
Voilà mon analyse :
* ils n'utilisent pas le setView pour le NSToolbarItem. Ils utilisent le setImage et setAction classique. Dans ce cas là (je l'ai testé dans mon appli), tout fonctionne au niveau des resize.
Par contre, pour le "double effet", comment font ils ?
J'ai repéré où ca se faisait.
C'est dans une sous classe d'une sous classe de NSView.
Mais nul part je trouve l'endroit où ils disent que la NSToolbar dépend de cette NSView ?!!!!
En gros, je pense qu'à un moment, cette vue trappe les évènement qui se déroulent sur la NSToolbar et agit en fonction... Mais il me manque ce petit lien... Où est il fait ?
Est ce que quelqu'un peut m'aider ?
:why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais heureusement, leChatNoir s'agrippe et yeeepeeee, j'ai trouvé <br />Mais va falloir qu'on m'explique,y a des trucs que je ne connais pas...
Je poste ça ASAP, pour l'heure j'vais m'coucher .
Bonne nuit !
Alors voilà mes conclusions.
Le bouton de fouf (oula, ça commence bien...) marche nickel dans une vue ou fenêtre classique.
Il fonctionne également bien dans une NSToolbar en utilisant le setView d'un NSToolbarItem.
Mais si on veut rendre la toolbar customizable, ca pose problème dans le sens ou la palette de customisation offre la possibilité de cocher "petite taille".
Dans ce cas, le bouton ne se redimensionne pas.
J'ai essayé tout un tas de truc et en sous classant NSToolbar et en surchargeant setSizeMode, j'arriverai peut être à m'en sortir mais les essais que j'ai fait n'étaient pas satisfaisant. En gros, quand j'arrive à faire se redimensionné le bouton, il se redimensionne également dans la palette de customisation...
Mais j'ai découvert un autre moyen de le faire grâce à Shiira. Il suffit d'ajouter cette classe magique à son projet et c'est tout ! Pas d'include à faire, pas d'instanciation. Juste ajouter le .h et le .m et magie de Cocoa, ca marche !
En résumé, dans les méthodes delegate de la toolbar, on fait un setimage, setlabel et setAction classique (pas de setView et on laisse tomber les sous classes de boutons). De cette manière, tous les aspects de redimensionnement sont réglés.
On ajoute les 2 fichiers magiques et hop, on a le pop up qui apparait si on laisse cliqué longtemps...
Dans ces fichiers, il y a 2 classes. Une sous classe de NSView et une sous classe de la précédente.
La première sous classe se nomme NSToolbarItemViewer et je crois que c'est là qu'est la magie. Car dans le header de NSToolbar, on voit un @class NSToolbarItemViewer.
Donc j'ai l'impression qu'ils remplacent la classe standard de l'appKit par la leur.
Et ça, ils le font dans la 2eme sous classe en faisant une methode +load dans laquelle ils se mettent en superclasse de la précédente (poseAsClass).
Bref, je crois qu'il faut interpréter ça comme ça mais j'aimerai bien que les cadors de CocoaCulteurs que vous êtes approfondissent l'explication. Notament, comment se fait il qu'il n'y ait pas besoin d'instancier nul part ?
Merci !
Je poste le code bien sûr (avec la licence qui me l'autorise). Faites pas gaffe à la fonction du menu, j'ai mis des conneries dedans pour mes tests.
Header :
Implémentation :
Je suis Sà›R d'avoir eu un code bcp plus simple de la part de Renaud. Sauf que c'était juste pour afficher directement un popup lorsqu'on clique sur un bouton. Mais après, intégré un bouton ds une toolbar c'est pas sorcier
La méthode poseAsClass va intercaler dans la hiérarchie objet la classe concernée et les méthodes réécrites seront appelées à la place des méthode d'origines. Le code d'origine peut encore être appelé en adressant super. L'avantage, c'est que si tu as plusieurs fenêtres avec des toolbars, elles adopteront toutes le nouveau comportement sans avoir à intervenir dans le fichier nib en sous-classant.
Ok, si tu remets la patte dessus, fais nous signe
Sinon, comme je le disais, avec un pop up immédiat, effectivement, c'est ultra simple.
Avec un bouton, aussi mais la personnalisation ne fonctionne pas au niveau de la taille (petit ou normal) si ton bouton comporte un icone.
Merci Eddy pour tes explications !
a+
Rha ça m'énerve ! Renaud que fais-tu ! aide moi c'est pour iFreete :P
-menuForEvent = pour un événement qui a lieu n'importe où pour afficher le menu au niveau du curseur (et appelé par le système quand il faut afficher un menu = le click droit)
-méthode ici: afficher le menu à un endroit déterminé, non influencé par le curseur.
Si tu veux juste avoir un pop up sur un clique sur ton item de ta toolbar, il suffit de faire :
* tes setImage, label et action dans le delegate de ta toolbar,
* de faire apparaà®tre ton menu dans la méthode cible de "action" avec la méthode que tu cites.
a+
Sauf que si on clique longtemps sur n'importe quel bouton de la toolbar ca fera ca??? N'y a t'il pas moyen de faire un menu par toolbar item???
PS: le meme systeme est utilise dans XCode (item build)
Ca le fait que pour les items choisis.