Clic sur un bouton : savoir si une touche est pressée

ObiObi Membre
18:24 modifié dans API AppKit #1
Encore moi et mes problème de boutons !  ;D

Y a t'il un moyen connaà®tre le event, et plus précisément savoir sur la touche shift ou alt est pressée, quand on reçoit le clic d'un bouton via une IBAction ?
J'aimerais déclencher une action différente dans ce cas, et le top serait d'avoir un bouton comme celui de iTunes (pour créer des playlists) qui change d'icône à  la volée.

J'ai essayé de sous-classer NSButton mais les mouseDown et mouseUp ne correspondent pas toujours à  l'envoi effectif de l'action (ou c'est moi qui bug). J'ai aussi pensé à  la méthode sendAction:to: mais l'event est plus connu à  ce moment là .

Merci  o:)

Réponses

  • Eddy58Eddy58 Membre
    mai 2005 modifié #2
    Et bien il faut surcharger la méthode flagsChanged de NSResponder, ensuite tu regardes le modifier flag. Selon la touche enfoncée, tu peux agir sur des flags controlés par tes soins (isShiftKeyPressed, isAlternateKeyPressed), et dans ton IBAction tu regardes l'état de ces flags pour faire en fonction : :)

    [tt]
    -(void)flagsChanged:(NSEvent *)event
    {
         if ([event modifierFlags] & NSShiftKeyMask)
         {
               NSLog(@Shift enfoncée);
         }
         else if ([event modifierFlags] & NSAlternateKeyMask)
         {
               NSLog(@Alt enfoncée);
         }
    }
    [/tt]
  • mai 2005 modifié #3
    Je doute que ce code ne fonctionne. Cela implique que ce soit le bouton qui ait le firstResponder, ce qui n'est que rarement le cas (et ça dépend de certaines préférences utilisateur).

    Bon, la réponse à  ta question ne se trouve pas dans Cocoa, mais dans Carbon. Donc tu as à  ajouter le framework Carbon à  ton projet (plus un #import <Carbon/Carbon.h> dans le main.m). Une fois que c'est fait, une petite fonction est intéressante, et s'appelle GetCurrentKeyModifiers. Ce qui en code donne (pour option):

    BOOL optKeyDown = (GetCurrentKeyModifiers() &amp; (optionKey | rightOptionKey)) ? YES : NO;<br />    if (optKeyDown) {<br />        NSLog(@&quot;alt&quot;); //ou qqch de plus intelligent<br />    } else {<br />        NSLog(@&quot;pas alt&quot;); //meme remarque<br />    }
    


    Tu mets ça où tu veux dans ton code.


    Alors pour les autres modificateurs, la liste est :
    cmdKey<br />   shiftKey<br />   alphaLock <br />   optionKey <br />   controlKey <br />   rightShiftKey <br />   rightOptionKey<br />   rightControlKey
    
  • ObiObi Membre
    18:24 modifié #4
    Merci pour vos réponses qui ont orienté mes recherches  o:)
    Effectivement flagsChanged ne marchait pas dans mon cas, j'avais testé avant de poster ici.
    Renaud, ta solution m'as fait trouvé sur le net l'équivalent Cocoa :
    <br />[[NSApp currentEvent] modifierFlags]<br />
    

    donne l'event en cours. Je ne sais pas si ca marche dans tous les cas mais pour moi, ca marche nickel ! En plus ca m'evite de faire une sous-classe de NSButton et ca marche avec toutes les IBActions, quelque soit le bouton utilisé. Pile ce qu'il me fallait.
    Merci ! :p
  • 18:24 modifié #5
    Tiens, je l'avais oublié celui-là . Il y a à  ma connaissance un cas dans lequel ça ne marche pas: si tu veux au démarrage de l'appli qu'une touche modificatrice soit enfoncée ou non.
  • ObiObi Membre
    mai 2005 modifié #6
    dans 1115541691:

    Tiens, je l'avais oublié celui-là . Il y a à  ma connaissance un cas dans lequel ça ne marche pas: si tu veux au démarrage de l'appli qu'une touche modificatrice soit enfoncée ou non.

    Ah okay, c'est noté. Je ne devrais pas avoir ce cas là , à  priori, mais c'est toujours bon à  savoir.
    En ce qui concerne le bouton pour créer des playlists dans iTunes, vous avez une idée du fonctionnement ? Il réagit juste à  la pression de la touche Alt, sans même cliquer.
    J'ai pensé qu'il pouvait utiliser un tracking rect mais je n'y connais pas grand chose :(

    Edit :
    La méthode flagsChanged est appelée dans ma sous-classe de NSWindow (j'avais testé qu'avec NSButton) dans le mode de fonctionnement qui m'intéresse.
    Je vais voir si je peux bidouiller à  partir de ça,  je pense dispatcher le message aux instances d'une sous-classe de NSButton qui se seront déclarées auprès de la fenêtre.
  • Eddy58Eddy58 Membre
    18:24 modifié #7
    dans 1115488810:

    Je doute que ce code ne fonctionne. Cela implique que ce soit le bouton qui ait le firstResponder, ce qui n'est que rarement le cas (et ça dépend de certaines préférences utilisateur).

    Oui, je n'avais pas dans l'idée de recouvrir la méthode flagsChanged du bouton, effectivement étant un peu pressé j'avais oublié de préciser qu'il fallait la recouvrir dans une sous-classe de NSWindow (d'où, comme je disais, des flags résultants a gérer soi-même pour exploiter dans d'autres classes), mais apparemment Obi vient d'expérimenter la chose. :o
Connectez-vous ou Inscrivez-vous pour répondre.