NSMenuItem tout le temps actif
JE729
Membre
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 /smile.png' class='bbc_emoticon' alt=':)' />
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 /smile.png' class='bbc_emoticon' alt=':)' />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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).
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.
J'aurais pensé qu'il y aurait une meilleur méthode mais on va faire comme ca /smile.png' class='bbc_emoticon' alt=':)' />
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.
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...