NSButton et appui long

08:13 modifié dans API AppKit #1
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.

Réponses

  • wiskywisky Membre
    08:13 modifié #2
    Mettre un timer qui met un flag à  true au bout d'un moment si le bouton est toujours appuyé.
  • CéroceCéroce Membre, Modérateur
    08:13 modifié #3
    Comment sais-tu qu'il est toujours appuyé ? L'action n'est envoyée que lorsque l'on relâche le bouton. C'est bien tout le problème.
  • wiskywisky Membre
    08:13 modifié #4
    Grâce au NS Event recu pour le down et up de la souris sur ce bouton.
    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.
  • 08:13 modifié #5
    Ouaip donc réécrire les évents de NSButtonCell quoi...
    Merciiii Apple :D
  • AliGatorAliGator Membre, Modérateur
    08:13 modifié #6
    Je sais que c'est pour iOS, mais tu peux regarder cette page de la doc et en particulier le Listing 2-2 où le principe est un peu expliqué.

    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.
  • 08:13 modifié #7
    dans 1288888512:

    Je sais que c'est pour iOS, mais tu peux regarder cette page de la doc et en particulier le Listing 2-2 où le principe est un peu expliqué.

    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 ;)
Connectez-vous ou Inscrivez-vous pour répondre.