NSButton et appui long
Bonjour à tous,
Je suis entrain d'étudier la possibilité d'effectuer 2 actions différentes selon qu'un bouton est en appui long ou en simple clique.
Malheureusement, je ne trouve rien d'intéressant. Il y a bien getPeriodicDelay:interval: mais cela ne renseigne pas si l'action liée au bouton a été appelée via un appui long ou un simple clique...
Je ne vois pas d'autre solution que de réécrire les événements de clique sur NSButtonCell et gérer 2 actions différentes pour la même target.
Si quelqu'un a une idée, je suis preneur. L'idée étant de pouvoir effectuer une avance rapide comme dans iTunes ou QuickTime en cas d'appui long.
Je suis entrain d'étudier la possibilité d'effectuer 2 actions différentes selon qu'un bouton est en appui long ou en simple clique.
Malheureusement, je ne trouve rien d'intéressant. Il y a bien getPeriodicDelay:interval: mais cela ne renseigne pas si l'action liée au bouton a été appelée via un appui long ou un simple clique...
Je ne vois pas d'autre solution que de réécrire les événements de clique sur NSButtonCell et gérer 2 actions différentes pour la même target.
Si quelqu'un a une idée, je suis preneur. L'idée étant de pouvoir effectuer une avance rapide comme dans iTunes ou QuickTime en cas d'appui long.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Quand t'as un Down tu met un flag qui indique que le bouton est appuyer à true et quand t'as le up tu le met à false. En même temps dans le down tu lance le timer et lorsqu'il se déclanche il vérifie si le flag qui indique que le bouton est appuyer est toujour vrais.
Si c'est le cas il met un autre flag à vrais et lors de l'execution du target tu vérifie si le flag appuye long est à vrai (tu peux même faire executer deux methode différentes grâce à l'NSEvent up de la souris).
Je sais pas si t'as tout compris. C'est toujours comme ça que je fait et ça marche bien. Attention aussi à la sortie du bouton alors que la souris est toujours down.
Merciiii Apple
En gros lors du touchBegan (mouseDown donc pour OSX) tu lances un timer (ou tu utilises performSelector:withObject:afterDelay: comme eux, c'est encore plus simple) et au moment du touchEnded (mouseUp pour OSX) tu annules ce timer (cancelPreviousPerformSelector...).
Du coup si le timer a eu le temps de se déclencher, ça veut dire que tu as fait un mouseDown qui est resté assez longtemps pour être considéré comme un appui long. Si le timer est annulé par le mouseUp avant d'avoir eu le temps de se déclencher, c'est que c'était un appui court.
Oui je comptais faire exactement ça, mais en un peu plus complexe directement sur NSButtonCell... Ceci-dit je pense que là ça sera 10x plus simple sur une sous-classe de NSButton.
Au moins le getPeriodicDelay:timeInterval: me servira grandement