Forum Programmation.autre GTK. Distinguer simple et double clic sur drawing area.

Posté par .
Tags : aucun
1
24
oct.
2010
Bonjour.

J'ai une drawingarea et je souhaite distinguer entre le simple clic gauche et le double clic gauche, afin d'avoir deux callbacks distincts ; les évènements ayant donc lieu lorsque le pointeur est dessus cette première. Problème, le double clic comporte une séquence de deux premiers "events" commun aux deux, c'est à dire :

Simple clic :

1. GDK_BUTTON_PRESS
2. GDK_BUTTON_RELEASE

Double clic :

1. GDK_BUTTON_PRESS
2. GDK_BUTTON_RELEASE
3. GDK_BUTTON_PRESS
4. GDK_2BUTTON_PRESS
5. GDK_BUTTON_RELEASE

Je dois donc écrire quelque chose qui intègre le facteur temps pour que le double clic n'appelle pas le gestionnaire du simple clic. Ça me surprend beaucoup, comment se fait-il qu'il n'y ait que les signaux suivant, si je lis bien la documentation ? :

"button-press-event"
"button-release-event"

Pourquoi ne pas avoir directement ajouté en plus des signaux qui seraient, disons, "simple-click-event" et "double-click-event", et qui géreraient d'emblée le "problème" ?

*) Doc : http://www.gtk.org/api/2.6/gdk/gdk-Event-Structures.html

Merci.
  • # C'est parce que tu ne cherches pas au bon endroit !

    Posté par . Évalué à 2.

  • # Le problème est dans la question

    Posté par . Évalué à 8.

    En préliminaire, je voulais dire que je n'ai jamais utilisé les évènements GDK "bas niveau" donc c'est juste une réflexion sans expérience concrète.

    Je dirais que tu te poses la mauvaises question. Déjà, si tu choisis une DrawingArea, sache que tu te place assez "bas-niveau", et qu'en conséquence tu as des évènements bas-niveau. Une chose importante à ce niveau-là est d'avoir les évènements dès qu'ils ont lieu. Et dans ce cas-là, quand ton widget reçoit un premier clic, GDK ne peut pas deviner s'il va "devenir" un double-clic ou si ça va rester un simple clic. Alors il te dit "simple clic". Si un deuxième apparaît dans les temps pour un double clic (temps dont tu ne dois pas avoir à te soucier, car c'est dépendant de plein de paramètres dont tu n'es pas maître) alors il te dit "double clic", en plus du premier. C'est déjà pas mal.

    Mais qu'est-ce que tu dois faire, toi ? Et bien, réagir au simple clic par un callback "simple clic" et au double clic avec callback "double clic", même si celui-ci sera appelé en sus du premier. Comment font les autres applications d'après toi ? Par exemple, Nautilus, le navigateur de fichier, au simple clic, il sélectionne le fichier. Si c'est un double clic, il aura sélectionné le fichier, puis l'ouvrira. Le premier clic (et le callback associé) n'a donc pas d'influence sur l'action du double-clic.

    Réfléchis à ce que tu devrais faire si tu voulais appeler un des deux callback (simple ou double) de manière exclusive : tu devrais, à chaque clic, attendre le temps du double clic (configuré très long chez certains utilisateurs lents) avant de te décider de faire un simple ou double clic, à chaque fois ! Ca serait intenable niveau réactivité.

    Bref, réfléchis à l'ergonomie de ton application, de manière à ce qu'un simple clic n'entrave pas l'action d'un double-clic.

    PS: en général, quand on ne trouve pas de réponse à un problème pas récent et "évident", c'est qu'on a mal posé la question ;-)
  • # Un feedback....

    Posté par . Évalué à 2.

    Bon, j'ai cogité un peu. En fait mon problème n'a rien d'artificiel, même si il n'est pas très fréquent. Désolé de fournir un lien Microsoft ( ;) ) mais c'est très bien expliqué ici :

    http://msdn.microsoft.com/en-us/library/ms171543(v=VS.100).a(...)

    Il y a bien des situations dans lesquelles on peut souhaiter aiguiller de manière exclusive entre le simple clic et le double clic, sans que le l'action du double clic soit un prolongement de celle du simple clic. Et on a besoin du facteur temps pour discriminer.
    • [^] # Re: Un feedback....

      Posté par . Évalué à 2.

      Merci pour le retour. C'est triste de voir qu'on en revient au traditionnel "débrouille toi tout seul et code ton [gestionnaire d'évènements]" :(

      Ah et sinon, pour ne pas frustrer une minorité de visiteurs qui pensent que ce site est un repaire de gens aigris : "MSçapue y'a même pas d'exemple en F#" !
    • [^] # Re: Un feedback....

      Posté par . Évalué à 3.

      j'aurais tendance à penser que c'est au gestionnaire de fenetre d'envoyer le signal
      simple/double clique

      en fonction des vitesses que la personne aura reglé en preference generale

      perso j'ai le double click rapide
      le grand pere à un double clique plutot lent

      et pourtant on va surement utiliser le meme logiciel

      ce n'est pas au logiciel final (ta GTK-DrawingArea) d'interpreter ca en fonction d'un timer
    • [^] # Re: Un feedback....

      Posté par . Évalué à 2.

      Merci pour le lien, et pas de problème que ça vienne de Microsoft. Ce sont effectivement deux solutions envisageables, même si je ne sais pas comment on récupère les paramètres de double clic pour GTK.

      Mais bon, je pense qu'il y a quand même un problème dans ce que tu veux faire (ça c'est la deuxième réponse à un problème insoluble : « Dis moi ce dont tu as besoin, et je t'expliquerai comment t'en passer » ;-)).

      D'abord, pour faire une action vraiment différente, je pense que les associer au même bouton mais avec juste un timing différent (simple clic versus double clic) n'est pas très logique. Dans le temps (ça devient plus rare aujourd'hui) les applications Unix utilisaient vraiment tous les boutons de la souris (enfin, dans un X standard c'est trois boutons) pour maximiser le nombre d'actions possibles, et dépendaient beaucoup moins du double clic. Je pense à xfig par exemple.

      Ensuite, le double clic est vu comme une action assez inergonomique par les débutants. Apple par exemple a toujours essayé de limiter les double clic (sans parler de la limitation de nombre de boutons) et préfère passer par d'autres moyens quand c'est possible. Ma mère, qui ne doit pas être la seule, ne comprend pas la différence entre un simple et double clic. Intuitivement, quand tu n'es pas habitué à l'informatique, ce n'est pas logique que l'action d'un bouton dépende du temps que tu appuies dessus. Réfléchis-y.

      Enfin, comme je n'aime pas jouer aux devinettes, tu pourrais nous en dire plus sur ton « cas spécial » qui nécessite absolument ce genre de callback ? Ça nous éviterait de trop nous perdre en conjectures.

      Dans le cas (simple supposition) où tu programmes une sorte de framework, je te conseillerais de garder la même philosophie que GDK : signaler le simple _et_ le double clic, même si le second est en sus du premier. Et de laisser à « l'utilisateur final » le soin de gérer comme il veut. Car essayer de répondre à un problème sans connaître clairement sa destination, c'est à coup sûr se tromper dans une bonne partie des cas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.