[Résolu] Toolbar+bouton "double effet"+ analyse de code Shiira-j'ysuis.

LeChatNoirLeChatNoir Membre, Modérateur
février 2006 modifié dans API AppKit #1
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  B)

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?:

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    09:55 modifié #2
    ben ca inspire pas gd monde mon histoire...
    Mais heureusement, leChatNoir s'agrippe et yeeepeeee, j'ai trouvé  <3 <3 <3 <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 !
  • LeChatNoirLeChatNoir Membre, Modérateur
    09:55 modifié #3
    Slt,
    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 :

    <br />/*<br />NSToolbarItemViewerEx.h<br /><br />Author: Makoto Kinoshita<br /><br />Copyright 2004 The Shiira Project. All rights reserved.<br /><br />Redistribution and use in source and binary forms, with or without modification, are permitted <br />provided that the following conditions are met:<br /><br />&nbsp; 1. Redistributions of source code must retain the above copyright notice, this list of conditions <br />&nbsp; and the following disclaimer.<br /><br />&nbsp; 2. Redistributions in binary form must reproduce the above copyright notice, this list of <br />&nbsp; conditions and the following disclaimer in the documentation and/or other materials provided <br />&nbsp; with the distribution.<br /><br />THIS SOFTWARE IS PROVIDED BY THE SHIIRA PROJECT ``AS IS&#39;&#39; AND ANY EXPRESS OR IMPLIED WARRANTIES, <br />INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR <br />PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE SHIIRA PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, <br />INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, <br />PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) <br />HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING <br />NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE <br />POSSIBILITY OF SUCH DAMAGE.<br /><br />*/<br />#import &lt;Cocoa/Cocoa.h&gt;<br />//#import &quot;Shiira.h&quot;<br /><br />@interface NSToolbarItemViewer : NSView<br />{<br />&nbsp; &nbsp; NSToolbarItem *_item;<br />&nbsp; &nbsp; id _toolbarView;<br />&nbsp; &nbsp; id _labelCell;<br />&nbsp; &nbsp; struct _NSRect _labelRect;<br />&nbsp; &nbsp; float _labelHeight;<br />&nbsp; &nbsp; struct _NSSize _maxViewerSize;<br />&nbsp; &nbsp; struct _NSSize _minViewerSize;<br />&nbsp; &nbsp; struct _NSRect _minIconFrame;<br />&nbsp; &nbsp; struct _NSRect _minLabelFrame;<br />&nbsp; &nbsp; double _motionStartTime;<br />&nbsp; &nbsp; double _motionDuration;<br />&nbsp; &nbsp; struct _NSPoint _motionStartLocation;<br />&nbsp; &nbsp; struct _NSPoint _motionDestLocation;<br />&nbsp; &nbsp; struct {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int drawsIconPart:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int drawsLabelPart:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int iconAreaIncludesLabelArea:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int transparentBackground:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int labelOnlyShowsAsPopupMenu:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int inMotion:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int inRecursiveDisplay:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int insertionAnimationOptimizationOn:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int needsViewerLayout:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int needsModeConfiguration:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int inPaletteView:1;<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned int UNUSED:21;<br />&nbsp; &nbsp; } _tbivFlags;<br />}<br /><br />- (id)item;<br />- (void)_setHighlighted:(BOOL)highlighted displayNow:(BOOL)display;<br />@end<br /><br />@interface NSToolbarItemViewerEx : NSToolbarItemViewer<br />@end<br />
    



    Implémentation :

    <br />/*<br />NSToolbarItemViewerEx.h<br /><br />Author: Makoto Kinoshita<br /><br />Copyright 2004 The Shiira Project. All rights reserved.<br /><br />Redistribution and use in source and binary forms, with or without modification, are permitted <br />provided that the following conditions are met:<br /><br />&nbsp; 1. Redistributions of source code must retain the above copyright notice, this list of conditions <br />&nbsp; and the following disclaimer.<br /><br />&nbsp; 2. Redistributions in binary form must reproduce the above copyright notice, this list of <br />&nbsp; conditions and the following disclaimer in the documentation and/or other materials provided <br />&nbsp; with the distribution.<br /><br />THIS SOFTWARE IS PROVIDED BY THE SHIIRA PROJECT ``AS IS&#39;&#39; AND ANY EXPRESS OR IMPLIED WARRANTIES, <br />INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR <br />PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE SHIIRA PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, <br />INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, <br />PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) <br />HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING <br />NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE <br />POSSIBILITY OF SUCH DAMAGE.<br />*/<br /><br />#import &quot;NSToolbarItemViewerEx.h&quot;<br /><br />@implementation NSToolbarItemViewerEx<br /><br />+ (void)load<br />{<br />&nbsp; &nbsp; [self poseAsClass:[NSToolbarItemViewer class]];<br />}<br /><br />- (BOOL)_hasMenu<br />{<br />&nbsp; &nbsp; // Create array of identifier which have menu<br />&nbsp; &nbsp; static NSArray* _menuItemIdentifiers = nil;<br />&nbsp; &nbsp; if (!_menuItemIdentifiers) {<br />&nbsp; &nbsp; &nbsp; &nbsp; _menuItemIdentifiers = [[NSArray arrayWithObjects:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @&quot;siteItem&quot;, nil] retain];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Check identifier<br />&nbsp; &nbsp; id&nbsp; item = nil;<br />&nbsp; &nbsp; id&nbsp; itemIdentifier = nil;<br />&nbsp; &nbsp; if ([self respondsToSelector:@selector(item)]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; item = [self item];<br />&nbsp; &nbsp; &nbsp; &nbsp; if ([item respondsToSelector:@selector(itemIdentifier)]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemIdentifier = [item itemIdentifier];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; if (![_menuItemIdentifiers containsObject:itemIdentifier]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return NO;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Check is enabled<br />&nbsp; &nbsp; if (![item isEnabled]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return NO;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return YES;<br />}<br /><br />- (NSMenu*)_menu<br />{<br />&nbsp; &nbsp; // Get identifier<br />&nbsp; &nbsp; id&nbsp; itemIdentifier = nil;<br />&nbsp; &nbsp; if ([self respondsToSelector:@selector(item)]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; id&nbsp; item;<br />&nbsp; &nbsp; &nbsp; &nbsp; item = [self item];<br />&nbsp; &nbsp; &nbsp; &nbsp; if ([item respondsToSelector:@selector(itemIdentifier)]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemIdentifier = [item itemIdentifier];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; if (!itemIdentifier) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return nil;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Create menu<br />&nbsp; &nbsp; NSMenu* menu = nil;<br />	NSLog(@&quot;totototoo&quot;);<br />&nbsp; &nbsp; // For back menu<br />&nbsp; &nbsp; if ([itemIdentifier isEqualToString:@&quot;siteItem&quot;]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Get back list<br />//&nbsp; &nbsp; &nbsp; &nbsp; NSArray*&nbsp; &nbsp; list;<br />		menu=[[NSMenu alloc] init];<br />		<br />		<br />		[menu insertItemWithTitle:@&quot;Test Site 1&quot;<br />							&nbsp;  action: @selector(test2:)<br />						keyEquivalent: @&quot;&quot;<br />							&nbsp; atIndex: 0 ];<br />		<br />&nbsp; &nbsp; &nbsp; &nbsp; // Make back menu<br />	}<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return menu;<br />}<br /><br />- (NSMenu*)menuForEvent:(NSEvent*)event<br />{<br />&nbsp; &nbsp; if (![self _hasMenu]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return nil;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return [self _menu];<br />}<br /><br />- (void)mouseDown:(NSEvent*)event<br />{<br />&nbsp; &nbsp; // Check has menu<br />&nbsp; &nbsp; if (![self _hasMenu]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [super mouseDown:event];<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Highlight itself<br />&nbsp; &nbsp; if ([self respondsToSelector:@selector(_setHighlighted:displayNow:)]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [self _setHighlighted:YES displayNow:YES];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Wait next event a moment<br />&nbsp; &nbsp; NSEvent*&nbsp; &nbsp; waitingEvent;<br />&nbsp; &nbsp; waitingEvent = [NSApp nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; untilDate:[NSDate dateWithTimeIntervalSinceNow:0.5] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inMode:NSEventTrackingRunLoopMode <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dequeue:NO];<br />&nbsp; &nbsp; if (waitingEvent) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [super mouseDown:event];<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //<br />&nbsp; &nbsp; // Show poup menu<br />&nbsp; &nbsp; //<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Get menu<br />&nbsp; &nbsp; NSMenu* menu;<br />&nbsp; &nbsp; menu = [self _menu];<br />&nbsp; &nbsp; if (!menu) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [super mouseDown:event];<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Move event location<br />&nbsp; &nbsp; NSPoint&nbsp; &nbsp;  popupPoint;<br />&nbsp; &nbsp; NSEvent*&nbsp; &nbsp; popupEvent;<br />&nbsp; &nbsp; popupPoint = [self convertPoint:NSMakePoint(0, 0) toView:nil];<br />&nbsp; &nbsp; popupEvent = [NSEvent mouseEventWithType:[event type] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location:popupPoint <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modifierFlags:[event modifierFlags] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timestamp:[event timestamp] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; windowNumber:[event windowNumber] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context:[event context] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventNumber:[event eventNumber] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clickCount:[event clickCount] <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pressure:[event pressure]];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Register notification for menu<br />&nbsp; &nbsp; NSNotificationCenter*&nbsp;  center;<br />&nbsp; &nbsp; center = [NSNotificationCenter defaultCenter];<br />&nbsp; &nbsp; [center addObserver:self <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selector:@selector(_menuDidEndTracking:) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name:NSMenuDidEndTrackingNotification <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object:menu];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Popup context menu<br />&nbsp; &nbsp; [NSMenu popUpContextMenu:menu withEvent:popupEvent forView:self];<br />}<br /><br />- (void)_menuDidEndTracking:(NSNotification*)notification<br />{<br />&nbsp; &nbsp; NSNotificationCenter*&nbsp;  center;<br />&nbsp; &nbsp; center = [NSNotificationCenter defaultCenter];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Remove notification<br />&nbsp; &nbsp; [center removeObserver:self <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name:NSMenuDidEndTrackingNotification <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object:[notification object]];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Make highlight off<br />&nbsp; &nbsp; if ([self respondsToSelector:@selector(_setHighlighted:displayNow:)]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [self _setHighlighted:NO displayNow:YES];<br />&nbsp; &nbsp; }<br />}<br /><br />@end<br />
    
  • 09:55 modifié #4
    Heu y'a bcp plus simple à  mon goût...
    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
  • Eddy58Eddy58 Membre
    09:55 modifié #5
    dans 1139649573:

    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 ?

    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.
  • LeChatNoirLeChatNoir Membre, Modérateur
    09:55 modifié #6
    dans 1139780729:

    Heu y'a bcp plus simple à  mon goût...
    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

    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+
  • 09:55 modifié #7
    Je crois que c'est en attribuant un NSMenu via IB. Puis en utiliser -(NSMenu*)menuForEvent:(NSEvent*)theEvent.
    Rha ça m'énerve ! Renaud que fais-tu ! aide moi c'est pour iFreete  :p   :P
  • février 2006 modifié #8
    Il me semblait bien que ce que je t'avais dit n'avait rien à  voir avec ça (à  part le fait d'afficher un menu) ...donc j'attendais que tu dises ce que j'avais dit.

    -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.
  • LeChatNoirLeChatNoir Membre, Modérateur
    09:55 modifié #9
    Oui, l'idée ici est d'avoir un bouton qui fait une action sur un simple clique et déroule un menu contextuel sur un clique prolongé.

    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+

  • elfelf Membre
    09:55 modifié #10
    Pas mal le code a shiira!

    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)
  • LeChatNoirLeChatNoir Membre, Modérateur
    09:55 modifié #11
    euh non, de mémoire je crois pas.
    Ca le fait que pour les items choisis.
Connectez-vous ou Inscrivez-vous pour répondre.