NSMenuItem tout le temps actif

JE729JE729 Membre
octobre 2012 modifié dans API AppKit #1
Bonjour,



Dans une application "based document", je viens de créer une classe (MyMovieView) permettant de lire des vidéos. Cette classe a des actions (play, pause, etc) et des items dans la barre de menu correspondant à  ses actions. J'ai donc aussi implémenté validateUserInterfaceItem: pour les définir "enable" ou non.

Or quand par exemple je clique sur un NSTextField puis que ensuite je vais dans la barre de menu, les items sont désactivés (changement de first responder si j'ai bien compris ??)

Je voulais donc savoir comment garder mes items activés ou non que selon validateUserInterfaceItem:de ma MyMovieView et pas selon qui est le first responder.



PS: un bon copier-coller dans actions et des tests de validateUserInterfaceItem:dans mon Document marche mais ça fait vraiment pas terrible ^^



J'espère aussi avoir été aussi un peu explicite image/smile.png' class='bbc_emoticon' alt=':)' />

Réponses

  • Bonjour,



    Pour faire ce que tu souhaite, j'utilise menuNeedsUpdate.

    Cette fonction du délégate du menu est appelée quand l'utilisateur clique sur menu. Dans cette méthode, tu peux activer ou désactiver chacun des éléments du menu.



    De plus, le target ces menu item doit êtres connecté à  une fonction que tu as écrite dans ta sous-classe de NSDocument. Si, tu est sur le first responder, il plantera si le focus n'est pas sur la vidéo.

    Avec des fonctions à  toi, c'est elle qui se charge d'appeler les fonctions par défaut de la NSMovieView.





    Bon courage.
  • CéroceCéroce Membre, Modérateur
    octobre 2012 modifié #3
    Le problème est que -validateMenuItem (et non -validateUserInterfaceItem) est appelée sur le first responder courant, qui est donc le text field, et non ta NSView.



    Si le first responder ne peut pas répondre à  une action, la chaà®ne des répondeurs est remontée. Je ne vais pas aller dans les détails (qui sont dans la doc), mais en gros c'est Vue parente > View Controller > Window Controller > App Delegate.



    Il faut donc que tu écrives la méthode -validateMenuItem plus haut dans la hiérarchie que je te donne ci-dessus (par ex., dans l'app delegate).
  • Mais du coup faut que j'écrive[font="helvetica, arial, sans-serif"] les actions de MyMovieView dans mon Document :S ?[/font]
  • A mon sens, c'est le plus simple.

    Dans ta classe qui surcharge NSDocument, tu ajoute les actions, lecture, pause, précédent, suivant.

    Ces fonctions se charge de traiter vérifier la possibilité de faire l'action avant de la réaliser. Tes menuitems sont connectée à  ces actions.
  • Ok ba merci bien.

    J'aurais pensé qu'il y aurait une meilleur méthode mais on va faire comme ca image/smile.png' class='bbc_emoticon' alt=':)' />
  • CéroceCéroce Membre, Modérateur
    Un article de menu s'applique à  la sélection courante. C'est le principe même de l'IHM du Macintosh.

    Typiquement, la commande copy: (article de menu à‰dition > Copier) va copier le texte si un text field a le focus mais va copier une image si c'est une image view qui a le focus.

    De la même manière, on peut tout à  fait imaginer que la fenêtre comporte deux movie view. Si on sélectionne la commande play:, laquelle doit être lue ?



    En fait, il y a deux types d'actions de menu item:

    - soit elles ont une target, ce devra donc un objet contenu dans le nib, ou le File's Owner

    - soit elles n'en n'ont pas (null-targeted action), et la chaà®ne des répondeurs est remontée. Effectivement, la chaà®ne remontera probablement jusqu'au NSDocument.
  • Dans l'une de mes app j'ai des menu item du genre "ajouter ...". Ils ne sont actifs que si un document est ouvert, s'applique au document au 1er plan et sont désactivés si aucun document n'est ouvert !

    J'ai pas l'impression que cela vas à  l'encontre de l'IHM du Mac. Je me trompe ?



    Pour en revenir à  la vidéo, si j'ai plusieurs vidéo dans un même document elles seront nommé "gauche" et "droite" par exemple et à  ce moment là  les menus changent en fonction du focus :

    Aucune vidéo sélectionnée => s'applique au deux

    Une vidéo sélectionnée => s'applique à  la selection

    Dans tous les cas, les labels des menu items serait modifiée grâce au délégate.



    Enfin, c'est comme ça que je ferais car cela me semble le plus logique et le plus simple pour l'utilisateur. L'autre solution est d'ajouter des menu item pour chaque vidéo plus des commandes globales... Ce qui donne un beau menu non évolutif...
  • CéroceCéroce Membre, Modérateur
    Bien sûr, ta solution est valable, il n'y a pas de règle absolue. J'ai souhaité le rappeler pour expliquer pourquoi l'implémentation de NeXT (maintenant Apple) avait du sens.
  • Oui, c'est même ce qu'il y a de plus logique comme fonctionnement. Mais dans le cas présent, comment gérer les menu item pour avoir un fonctionnement cohérent ? (surtout quand le first responder n'est pas la vidéo)
Connectez-vous ou Inscrivez-vous pour répondre.