NSMenu sur NSButton

08:04 modifié dans API AppKit #1
Bonsoir,

J'étais sûr que le topic existait déjà  car j'ai déjà  eu le code que je souhaite en main.
Je cherche à  afficher un NSMenu lorsque qu'on clique sur un bouton.
Je pense même que c'était Renaud qui m'avait donné la solution  :p

Merci,
Louka.

Réponses

  • Eddy58Eddy58 Membre
    08:04 modifié #2
    Oui, j'avais gardé le code en question, il est de Fouf. :fouf):

    [Fichier joint supprimé par l'administrateur]
  • 08:04 modifié #4
    Je me demandais si je ne pouvais pas plutôt utiliser :
    <br />- (NSMenu *)menuForEvent:(NSEvent *)anEvent inRect:(NSRect)cellFrame ofView:(NSView *)aView
    

    de NSCell.
    En plus ça répondrait à  l'event click gauche de la souris.
    :o
  • fouffouf Membre
    08:04 modifié #5
    Tout dépend de ce que tu veux faire. Pour faire un truc du genre pop-up mais avec un délai, OBButton est très bien. La méthode que tu cites ne fait que retourner le nsmenu associé avec anEvent, mais ne l'affiche pas. Si tu veux ensuite afficher le menu, tu peux utiliser popUpContextMenu:withEvent:forView: ou popUpContextMenu:withEvent:forView:withFont:.

    Mais si tu as des questions sur le code, n'hésite pas ...
  • LeChatNoirLeChatNoir Membre, Modérateur
    08:04 modifié #6
    Salut à  tous,
    ben j'ai réussi à  intégrer ce fameux bouton dans une NSToolbar.

    Dans la méthode où on renvoit les objets à  la toolbar, voilà  comment je procède :
    * j'alloue/init le bouton OBButton,
    * je lui affecte un menu fraichement créé,
    * je fais un toolbarItem setViews:monOBBouton.

    Et ça fonctionne. J'ai modifié un peu OBButton pour qu'au lieu des highlight, il modifie l'image (ca remplace le alternateImage).

    Mais j'ai 2 pb :
    * OBButton est de type NSButton et non de type NSPopUpButton donc la flèche qui indique que c'est un "bevel" button n'apparait pas. Je peux en faire une directe dans l'icone mais je me demandais s'il était possible de le faire autrement ? J'ai tenté de mettre le BezierStyle à  "DisclosureMachinChose" + le type  à  On/Off mais ca marche pas.
    * quand je personnalise la barre d'outil, il y a un choix "Petite taille" pour réduire la taille des icones. Les icones standards se redimensionne mais pas mon bouton...
    Comme c'est une vue, il est indiqué qu'il faut paramétré la MaxSize et MinSize, ce que je fais (sinon, rien ne s'affiche) mais ca n'influe aucunement sur ce truc de "petite taille" dans le panel de personnalisation de la toolbar...

    D'après la doc, c'est à  la vue de tout faire mais je vois pas trop comment....

    Please, could you help a poor Black Cat like me ? :why?:





  • fouffouf Membre
    08:04 modifié #7
    Pour le premièrement, moi aussi, j'ai fait une version perso de OBButton qui surcharge drawRect:
    <br />- (void)drawRect:(NSRect)rect<br />{<br />	[super drawRect:rect];<br />	<br />	if([self menu]){<br />		NSImage *i = [NSImage imageNamed:@&quot;Arrow&quot;];<br />		[i drawAtPoint:NSMakePoint([self bounds].size.width-7,[self bounds].size.height/2-2.5) <br />			&nbsp; fromRect:NSZeroRect <br />			 operation:NSCompositeSourceOver <br />			&nbsp; fraction:1]; // draw the arrow<br />	}<br />}<br />
    

    Ca permet donc de dessiner la fléche (le fichier image "Arrow") à  l'endroit voulu (ici à  droite, au milieu). A toi de trouver la bonne position et la bonne fléche ;).

    Ensuite, je trouve ca bizarre ton histoire de "Petite taille" car chez moi, ca marche très bien avec ou sans image. Faut dire aussi que ca dépend des boutons : il y en a qui changent peu entre Small Size et pas Small Size ;)
  • LeChatNoirLeChatNoir Membre, Modérateur
    08:04 modifié #8
    Cool merci pour le premier point !

    Pour le second, quand tu dis que ca marche, tu veux dire que quand tu fais "petite taille" lorsque tu personnalises, ton bouton se réduit ?
    Ton bouton a bien une image et est Bordered:NO ?

    Moi l'image, je l'affecte dans l'initWithFrame en faisant un setImage:[NSImage imagNamed:@.....];
    C'est peut être pas la bonne solution ?

  • fouffouf Membre
    08:04 modifié #9
    En ce qui me concerne, je n'ai pas essayé avec le code directement, mais plutôt avec IB, et je met l'image grâce à  l'inspecteur. Faut voir ;)
  • LeChatNoirLeChatNoir Membre, Modérateur
    08:04 modifié #10
    ah bon ?

    Donc j'imagine que tu as fait une Custom NSView et que t'as mis un bouton dessus avec Custom Class "OBButton" ?

    Et dans ton code de Toolbar, tu fais un setView:LaCustomView d'IB ?

    Autrement, je vois pas trop comment tu peux faire....

  • fouffouf Membre
    08:04 modifié #11
    Voila ce que j'ai fait :
    - Ca c'est pour mettre les items dans la toolbar (progressIndicator est un NSProgressIndicator, les autres sont des OBButton).
    <br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag<br />{<br />	NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];<br />	<br />	if ([itemIdentifier isEqualToString:BACK_IDENTIFIER]) {<br />		[item setLabel:@&quot;Previous Article&quot;];<br />		[item setPaletteLabel:[item label]];<br />		[item setView:_backButton];<br />		[item setMinSize:[_backButton bounds].size];<br />	} else if ([itemIdentifier isEqualToString:FORWARD_IDENTIFIER]) {<br />		[item setLabel:@&quot;Next Article&quot;];<br />		[item setPaletteLabel:[item label]];<br />		[item setView:_forwardButton];<br />		[item setMinSize:[_forwardButton bounds].size];<br />	} else if([itemIdentifier isEqualToString:PROGRESS_IDENTIFIER]) {<br />		[item setLabel:@&quot;Progress Indicator&quot;];<br />		[item setPaletteLabel:[item label]];<br />		[item setView:_progressIndicator];<br />		[item setMinSize:[_progressIndicator bounds].size];<br />	}<br />	<br />	return [item autorelease];<br />}<br />
    


    - Dans IB, j'ai glissé un NSButton, que j'ai mis en forme comme n'importe lequel des NSButton, puis j'ai fait un Custom Class-> OBButton. C'est tout ;)
  • LeChatNoirLeChatNoir Membre, Modérateur
    février 2006 modifié #12
    ouais je comprend. Je  vais tenter ça ce soir.
    Mais quand tu dis : "Dans IB j'ai glissé un bouton...", tu l'as glissé où ?

    Tu l'as bien glissé dans une custom NSView non ?

    Et ton _backButton est une outlet vers cette custom view non ?

    Dernière question : ton à®cone, tu le met dans le bouton direct sous IB ? Si oui, a t il plusieurs tailles (genre fait avec Icon Composer ou autre => image en 128*128, 48*48, 32*32...) ?

    Merci !
  • LeChatNoirLeChatNoir Membre, Modérateur
    08:04 modifié #13
    bon bah j'ai essayé avec le bouton fait direct sous IB et c'est pas mieux...  :-\\

    Je vais essayé de gérer ca dans le drawrect.
    J'arrive a récup le statut de la barre (si c'est en petit ou pas) ; il doit y avoir moyen d'en faire qqchose...

    a+
  • 08:04 modifié #14
    Moi aussi c'est à  integré ds une toolbar
    Je vais faire une vue pour qui regroupe mes boutons (vu que la fenêtre ne pourra pas être redimensionnée) et puis hop j'intègre le menu vite faire point :p
Connectez-vous ou Inscrivez-vous pour répondre.