/ / interception d'événements de souris sur FileBrowserComponent dans la bibliothèque Juce - c ++, juce

interceptant des événements de souris sur FileBrowserComponent dans la bibliothèque Juce - c ++, juce

J'ai récemment commencé à utiliser Bibliothèque Juce. Je poste habituellement une question liée à Juce sur sonforum, mais "je suis aux prises avec un problème de nombreux jours et je n’ai toujours pas reçu de réponse. Donc stackoveflow vaut la peine d’essayer même s’il semble qu’il n’ya pas beaucoup d’utilisateurs de Juce ici."

Voici la question:

Je fais quelques expériences avec les composants de Juce. J'ai la classe suivante:

class MyComponent : public Component{

public :
MyComponent(Component * comp){
this->child = comp;
comp->setInterceptsMouseClicks(false, false);

}
void mouseDown (const MouseEvent &e){

//do stuff
Component *target = getTopChild(this->child, e.x, e.y);   //return top most component of child that would have intercept the mouse event if that wasn"t intercepted by MyComponent class
if (target != NULL && doIWantToForwardEventToTarget()){
MouseEvent newEvent = e.getEventRelativeTo(target);
target->mouseDown(newEvent);
}
}
void mouseMove (const MouseEvent &e);
void mouseEnter (const MouseEvent &e);
void mouseExit (const MouseEvent &e);
void mouseDrag (const MouseEvent &e);
void mouseUp (const MouseEvent &e);
void mouseDoubleClick (const MouseEvent &e);
void mouseWheelMove (const MouseEvent &e, float wheelIncrementX, float wheelIncrementY);

private:

Component *child;
}

Les objectifs de cette classe sont:

  1. stocker un seul composant d'un hiérarchie des composants (enfant)

  2. intercepter tous les événements liés à la souris à l'enfant ou à l'un de ses descendants

  3. faire quelque chose
  4. transmettre éventuellement le MouseEvent à la composante à laquelle elle était destinée à

J'ai essayé cette classe avec des composants de curseurs commeles enfants, même imbriqués dans d'autres composants .. tout fonctionne bien. Maintenant, je faisais quelques expériences avec FileBrowserComponent et cela ne semble pas fonctionner correctement. Par exemple, lorsque je clique sur le bouton pour accéder au répertoire supérieur, il ne le fait pas (le bouton reçoit l’événement de la souris et il est cliqué mais il ne se passe rien dans l’arborescence). La sélection d’éléments dans la liste ne fonctionne pas non plus.

Quel pourrait être le problème? (J'ai fait quelques expériences et il semble que la méthode buttonClicked dans le FileBrowserComponent ne s'appelle pas, mais je ne sais pas pourquoi.) Toute suggestion?

J'ai aussi essayé de modifier le code de cette façon:

void mouseDown (const MouseEvent &e){

//do stuff
Component *target = getTopChild(this->child, e.x, e.y);   //return top most component of child that would have intercept the mouse event if that wasn"t intercepted by MyComponent class
if (target != NULL && doIWantToForwardEventToTarget()){
target->setInterceptsMouseClicks(true, true);
MouseEvent newEvent = e.getEventRelativeTo(target);
target->mouseDown(newEvent);
target->setInterceptsMouseClicks(false, false);
}
}

Cela ne fonctionne toujours pas. Quoi qu’il en soit, j’ai découvert que si je commentais le deuxième appel à setInterceptMouseClicks (où je désactive le clic de la souris après), les choses fonctionnent (même si ce n’est pas le résultat que je voudrais obtenir car j’ai besoin de redimensionner les événements de souris composant).

Ces faits peuvent m'amener à 2 considérations:

  1. Un composant doit intercepter la souris clique même si les événements de souris sont passé manuellement à son mouseDown méthode (est-ce vrai? Je ne suis pas si sûr de ça)
  2. Après la gestion des événements de sourisdans FileBrowserComponent il y a d'autres les classes qui utilisent les informations de son statut de clic de souris interceptant, sinon cela fonctionnerait si après la target-> mouseDown (newEvent), je vais désactiver à nouveau les clics de souris. Tout idée?

Merci d'avance

Réponses:

0 pour la réponse № 1

Vous devriez mieux créer des classes dérivées à partir deComponent et dans ces classes dérivées implémentent les événements de souris requis. Lorsque ces événements sont déclenchés, vous pouvez envoyer un message à la classe parent afin qu'elle puisse effectuer d'autres tâches.


0 pour la réponse № 2

Il semble que tu cliques sur un enfantcomposant de FileBrowserComponent. et l'événement de souris de l'enfant n'est pas retransmis au parent (FileBrowserComponent). c’est pourquoi, lorsque vous cliquez à l’intérieur, le parent ne recevra pas l’événement.

donc au lieu d'aller en haut -> en bas, vous devriez aller en bas -> en haut. Pour ce faire, vous devez ajouter un écouteur de souris à l'enfant par cette méthode:

addMouseListener (MouseListener *newListener,
bool wantsEventsForAllNestedChildComponents)

Donc, pour l’exemple que vous montrez:

child->addMouseListener(this, true);

Et la méthode mouseDown () devrait ressembler à ceci:

void mouseDown (const MouseEvent &e){

if(this->child == e.eventComponent){
// this mouse event is coming from
// the child component or child"s children
// as wantsEventsForAllNestedChildComponents = true

// do something
}
}

J'espère que cette aide