2010-03-05 5 views
0

Excuses s'il s'agit d'une question vague sans réponse appropriée. Veuillez le déplacer/le fermer s'il n'est pas au bon endroit.Conception: Gestion des événements de souris dépendants des modificateurs

J'ai écrit quelques interfaces graphiques relativement insignifiants dans wxWidgets et Qt, et je suis constamment incertain comment gérer architecturalement les situations suivantes:

  • Vous attrapez un événement de la souris pour faire quelque chose à un objet graphique dans votre interface graphique
  • Ce que vous faites avec l'objet dépend de touches de modification de l'utilisateur est en maintenant

au début, je fais quelque chose comme ce qui suit:

void MyClass::mouseMoveEvent(QGraphicsSceneMouseEvent* event) 
{ 
    if (event->modifiers() & Qt::AltModifier) { 
     // do something 
    } else if (event->modifiers() & Qt::ControlModifier) { 
     // do something else 
    } else { 
     // do yet another thing 
    } 
} 

// Repreat ad-nausium for other mouse click/move events... 

(Ceci est une question générale, je pourrais coller un code similaire pour boîtes à outils autres que Qt.)

Finalement, avec la même if/else/code de commutation dans beaucoup de mousePressEvent, les gestionnaires de mouseReleaseEvent, cela semble un peu C'est difficile à manier, alors j'essaye d'encapsuler une partie de la répétition en mettant l'objet dans différents «modes» selon les modificateurs qui sont en panne. Néanmoins, je sens toujours qu'il me manque une belle solution élégante. J'ai essayé de regarder le code de divers outils open-source mais je n'ai rien trouvé de tangible (erm, simple) assez pour me diriger dans une direction différente.

Certains outils (par exemple, le GIMP) semblent avoir autant de comportements riches et variés dépendants de l'outil et du modificateur que je pense qu'il doit y avoir une belle façon d'architecturer ce modèle. Toutes les suggestions seraient les bienvenues.

Répondre

1

À mon humble avis, la gestion des événements dans un tel toolkit GUI décide quoi faire en fonction d'un événement et d'un gestionnaire d'événements que vous fournissez. Ce dont vous avez besoin est un moyen de décider quoi faire en fonction d'un événement, d'un modificateur et d'un gestionnaire d'événements. Vous pouvez donc vous baser sur vos événements et votre modificateur pour appeler l'objet de traitement d'événement spécial dans tous vos gestionnaires d'événements standard pour les événements fournis par l'outil. Ce que vous devez implémenter est cet objet de traitement d'événement, qui selon un appel pair et modificateur aura le bon comportement (gestionnaire d'événement + modificateur). C'est ce que j'appellerais le modèle de conception de la chaîne de responsabilité.

+0

@Gabriel: Merci pour vos commentaires, ça m'a donné quelques idées. Comme vous le suggérez, définir un ensemble de gestionnaires en cascade de type chaîne de responsabilité semble être un bon moyen de gérer les différentes permutations ici. Je ferai plus de lecture et j'essaierai de trouver une bonne façon de l'appliquer dans mon contexte imaginaire. – Mikesname