Les fleches comme raccourcis clavier

Philippe49Philippe49 Membre
20:21 modifié dans API AppKit #1
Bonjour à  tous

The problem :  >:(

  • Je fais actuellement une application de diaporama, les flèches décalent les vues une à  une.
  • Mais j'utilise également un panel via beginSheet: modalForWindow: ... dans lequel se trouve des NSTextField où l'utilisateur doit écrire ce qu'il veut

et là , patratas, les flèches de déplacement dans le texte sont court-circuitées par les flèches du menu du diaporama, ce qui est désagréable.

Comment faire pour que lors de l'existence du panel les NSTextField soient prioritaires sur les options du menu ?


Réponses

  • 20:21 modifié #2
    peut-être qu'il faut te servir de firstResponder ? Tu fais un sorte que si ta vue n'est pas au premier plan, tu n'accepte pas le raccourci clavier pour faire défiler les images
  • Philippe49Philippe49 Membre
    20:21 modifié #3
    dans 1181501010:

    peut-être qu'il faut te servir de firstResponder ? Tu fais un sorte que si ta vue n'est pas au premier plan, tu n'accepte pas le raccourci clavier pour faire défiler les images


    Essayés:
    1. [NSApp makeFirstResponder:myPanel];
    2.  [NSApp runModalForWindow:myPanel]

    Le premier ne fait rien
    Le deuxième bloque les options du menu, mais également les réactions du textfield avec les flèches
  • BruBru Membre
    20:21 modifié #4
    dans 1181496862:

    Bonjour à  tous
    The problem :  >:(
    • Je fais actuellement une application de diaporama, les flèches décalent les vues une à  une.
    • Mais j'utilise également un panel via beginSheet: modalForWindow: ... dans lequel se trouve des NSTextField où l'utilisateur doit écrire ce qu'il veut

    et là , patratas, les flèches de déplacement dans le texte sont court-circuitées par les flèches du menu du diaporama, ce qui est désagréable.
    Comment faire pour que lors de l'existence du panel les NSTextField soient prioritaires sur les options du menu ?


    Comment captures-tu les touches fléchées ?

    .
  • Philippe49Philippe49 Membre
    juin 2007 modifié #5
    dans 1181544915:

    Comment captures-tu les touches fléchées ?


    Ils sont en raccourcis clavier du menu principal.
    Je pourrais intervenir dans la méthode qui ouvre le panel en désactivant ces raccourcis, mais cela me semble de la bidouille. 

    Et pour le textfield je voudrais conserver le comportement standard de déplacement par les flèches
  • BruBru Membre
    20:21 modifié #6
    Dans ce cas, c'est logique.

    Les raccourcis clavier du main menu sont gérés par NSApp : donc les événements sont capturés au tout début de la chaine d'événement (et ne sont pas transmis au fenêtres ou panels ouverts).

    Le problème est que l'utilisation de touches multi-usage (comme les touches fléchées) an tant que raccourci clavier, c'est un peu jouer avec le feu.
    Tu peux effectivement "bidouiller" pour suspendre ces raccourcis lorsque ta fenêtre "diaporama" n'est pas la key-window (ça se gère bien avec le NSNotification qui va bien).
    Tu peux aussi gérer ces touches autrement : ne pas les mettre en raccourci clavier, mais les capturer en tant qu'événement reçu par ta fenêtre "diaporama" (ce qui n'interfèrera pas avec les autres fenêtres de ton appli).

    Bref, tu as plusieurs solutions : à  toi de voir laquelle te botte le mieux.

    .
  • Philippe49Philippe49 Membre
    20:21 modifié #7
    Une solution pas trop lourde

    Elle consiste à  rajouter un modificateur dans une fonction qu'on appelle à  l'ouverture et à  la fermeture du panel

    <br />-(void) setModifierMask:(BOOL) yesOrNo 	<br />...<br />&nbsp; &nbsp;  int i;<br />	for(i=0;i&lt;[submenu numberOfItems];i++){<br />		id menuItem=[submenu itemAtIndex:i];<br />		if(yesOrNo==NO) <br />			[menuItem setKeyEquivalentModifierMask:NSAlternateKeyMask];<br />		else <br />			[menuItem setKeyEquivalentModifierMask:NSFunctionKeyMask];<br />	}<br />
    



    Une nouvelle question
    Ici je rétablis le modifierFlag par NSFunctionKeyMask, qui est validée par les flèches.

    Le plus simple aurait été de mettre une constante "inactive" du modifierFlag mais NSEvent.h ne définit pas cette constante ( la valeur 0 marche cependant )



    Modifier Flags
    The following constants (except for NSDeviceIndependentModifierFlagsMask) represent device-independent bits found in event modifier flags:

    enum {
      NSAlphaShiftKeyMask = 1 << 16,
      NSShiftKeyMask      = 1 << 17,
      NSControlKeyMask    = 1 << 18,
      NSAlternateKeyMask  = 1 << 19,
      NSCommandKeyMask    = 1 << 20,
      NSNumericPadKeyMask = 1 << 21,
      NSHelpKeyMask      = 1 << 22,
      NSFunctionKeyMask  = 1 << 23,
      NSDeviceIndependentModifierFlagsMask = 0xffff0000U
    };

  • BruBru Membre
    20:21 modifié #8
    Ah, c'est tout l'art de savoir lire / interpréter une doc (surtout les docs d'Apple).
    Dans ton cas, il faut retenir 2 choses essentiels (qu'un "vieux" du C comprendra immédiatement) :
    The following constants (except for NSDeviceIndependentModifierFlagsMask) represent device-independent [size=12pt]bits[/size] found in event modifier flags:

    et
    enum {
       NSAlphaShiftKeyMask = 1 [size=12pt]<<[/size] 16,
       NSShiftKeyMask      = 1 [size=12pt]<<[/size] 17,
       ...
       NSFunctionKeyMask   = 1 [size=12pt]<<[/size]23,
       NSDeviceIndependentModifierFlagsMask = 0xffff0000U
    };


    Cela signifie que modifierFlag est un champ de bits (chaque bit correspond à  une fonction précise, indépendamment des autres). L'opérateur << (décalage) nous précise même quel bit est affecter à  quelle fonction.
    On peut donc déduire tout logiquement que tous les bits à  0 (donc la valeur 0 pour modifierFlag) signifie "aucune des valeurs".

    Ceci est par ailleurs confirmé par la description de la méthode modifierFlags plus haut dans la doc :
    Discussion
    You can examine individual flag settings using the C bitwise AND operator with the predefined key masks described in “Constants”. The lower 16 bits of the modifier flags are reserved for device-dependent bits.


    Les mots "individual flag settings" ou "C bitwise AND operator" sont sans ambiguà¯té.

    .
  • Philippe49Philippe49 Membre
    juin 2007 modifié #9
    dans 1181600121:

    Un "vieux" du C comprendra immédiatement

    Le C je pense connaà®tre un peu après avoir écrit ce bouquin ... ;)
    http://web.mac.com/philippe.robinet/iWeb/Le Langage C/Le livre.html
    (un peu seulement, ce n'est pas ma formation)
    Quant à  être vieux, cela me fait de la peine ...  ;) ;D ;D

    dans 1181600121:

    On peut donc déduire tout logiquement que tous les bits à  0 (donc la valeur 0 pour modifierFlag) signifie "aucune des valeurs".

    C'est pour cela que j'ai essayé 0.
    "The lower 16 bits of the modifier flags are reserved for device-dependent bits".
    Si on traduit, cela signifie que les bits de 1<<0 à  1<<15 sont utilisés par Apple à  des fins d'adaptations matérielles.

    On peut imaginer que le  modifierFlag devrait être quelque chose comme standardFlag | userFlag , où
    • standardFlag est "device-dependent" (combinaison de bits de 0 à  15)
    • userFlag est celui que l'on passe via la méthode setKeyEquivalentModifierMask (bits au-delà  de 16)


    Maintenant, peut-on en être sur ?
  • AliGatorAliGator Membre, Modérateur
    20:21 modifié #10
    Ils se seraient pas gourrés dans la doc ? Avec des masques du genre, j'aurais plutôt tendance à  faire un "bitwise OR" pour les combiner, pas un "bitwise AND" qui, puisque les masques sont indépendants bit à  bit, donnerait de toute façon un résultat nul avec l'opérateur "&" !
  • Philippe49Philippe49 Membre
    juin 2007 modifié #11
    dans 1181637179:

    Ils se seraient pas gourrés dans la doc ? Avec des masques du genre, j'aurais plutôt tendance à  faire un "bitwise OR" pour les combiner, pas un "bitwise AND" qui, puisque les masques sont indépendants bit à  bit, donnerait de toute façon un résultat nul avec l'opérateur "&" !



    (A l'essai c'est bien "ou")

    Une erreur classique : le langage courant dit "et" là  où la logique dit  "ou" ...
  • BruBru Membre
    20:21 modifié #12
    dans 1181637179:

    Ils se seraient pas gourrés dans la doc ? Avec des masques du genre, j'aurais plutôt tendance à  faire un "bitwise OR" pour les combiner, pas un "bitwise AND" qui, puisque les masques sont indépendants bit à  bit, donnerait de toute façon un résultat nul avec l'opérateur "&" !


    Hum, non ils ne se sont pas trompés.
    Dans mon message, je cite la méthode modifierFlags qui renvoie un int de flags.
    C'est donc bien le AND qu'il faut utiliser pour "masquer" (forcer à  0) les bits qu'on ne teste pas, afin de ne laisser  "visible" que le bit à  tester.

    D'autre part, le OR est utilisé pour mettre à  1 un bit dans le int (chaque bit à  1 dans le masque force à  1 le bit correspondant du résultat).
    Par contre, on utilise AND pour forcer à  0 le bit (chaque bit à  0 dans le masque force à  0 le bit correspondant du résultat).

    .
  • AliGatorAliGator Membre, Modérateur
    20:21 modifié #13
    Ah oui,, exact, j'avais mal lu que c'était pour récupérer les bits qui nous intéressaient (donc appliquer un masque sur le int résultat) et non pour appliquer un masque combinaison de plusieurs masques élémentaires ;)

    Au temps pour moi.
  • Philippe49Philippe49 Membre
    juin 2007 modifié #14
    dans 1181646882:


    C'est donc bien le AND qu'il faut utiliser pour "masquer" (forcer à  0) les bits qu'on ne teste pas, afin de ne laisser  "visible" que le bit à  tester.


    Je ne crois pas : quand on met
    [menuItem setKeyEquivalentModifierMask:NSAlternateKeyMask | NSCommandKeyMask | NSControlKeyMask];
    cela donne la première image les trois modificateurs (Image 1.png)

    sinon pour
    [menuItem setKeyEquivalentModifierMask:NSAlternateKeyMask & NSCommandKeyMask & NSControlKeyMask];
    on obtient aucun modificateur (Image 2.jpg)


    Je viens de comprendre ce que tu veux dire. C'est lorsque l'on veut tester si un modificateur est présent (méthode modifierFlag) on utilise le &

    [Fichier joint supprimé par l'administrateur]
  • BruBru Membre
    20:21 modifié #15
    dans 1181650324:

    Je viens de comprendre ce que tu veux dire. C'est lorsque l'on veut tester si un modificateur est présent (méthode modifierFlag) on utilise le &


    Tout à  fait... Philippe !

    .
Connectez-vous ou Inscrivez-vous pour répondre.