Перехват событий мыши в FileBrowserComponent в библиотеке Juce
Я недавно начал использовать библиотеку Juce. Я обычно выкладываю вопросы, связанные с Жюсом, на его форуме, но я борюсь с проблемами в течение многих дней, и я до сих пор не получил ответов. Таким образом, stackoveflow стоит попробовать, даже если кажется, что пользователей Juce здесь не так много.
Вот вопрос:
Я провожу некоторые эксперименты с компонентами Juce. У меня есть следующий класс:
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;
}
Цели этого класса:
хранить один компонент иерархии компонентов (дочерний)
перехватывать все события мыши, связанные с потомком или его потомком
- сделай что-нибудь
- в конечном итоге перенаправить MouseEvent к компоненту, на который он был направлен
Я пробовал этот класс с компонентами ползунков, как дети, даже вложенные в другие компоненты.. все работает нормально. Сейчас я проводил некоторые эксперименты с FileBrowserComponent, и он, кажется, не работает должным образом. Например, когда я нажимаю на кнопку, чтобы перейти в верхний каталог, она этого не делает (кнопка получает событие мыши и нажимается, но в древовидном представлении ничего не происходит). Также выбор элементов из списка не работает.
В чем может быть проблема? (Я провел несколько экспериментов, и кажется, что метод buttonClicked в FileBrowserComponent не вызывается, но я не знаю почему) Есть предложения?
Я также попытался изменить код следующим образом:
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);
}
}
Это все еще не работает. В любом случае, я обнаружил, что, если я прокомментирую второй вызов setInterceptMouseClicks (где я отключаю щелчок мышью после), все заработает (даже если это не тот результат, который я хотел бы получить, потому что мне нужно перенаправить события мыши на этом составная часть).
Эти факты могут привести меня к двум соображениям:
- Компонент должен перехватывать щелчки мыши, даже если события мыши передаются его методу mouseDown вручную (это правда? Я не уверен в этом)
- После обработки события мыши в FileBrowserComponent существуют другие классы, которые используют информацию о своем состоянии перехвата щелчка мыши, иначе это будет работать, если после target-> mouseDown (newEvent) я снова отключу щелчки мыши. Любая идея?
заранее спасибо
2 ответа
Вы должны лучше создавать производные классы из Компонента, и в этих производных классах реализовывать необходимые им события мыши, и когда эти события запускаются, вы можете отправить сообщение родительскому классу, чтобы он мог выполнять другие действия.
Кажется, что вы нажимаете на дочерний компонент FileBrowserComponent. и событие мыши дочернего объекта не пересылается обратно родителю (FileBrowserComponent). вот почему, когда вы нажимаете внутри, родитель не получит событие.
поэтому вместо того, чтобы идти сверху -> снизу, вы должны пойти снизу -> сверху. Для этого: вы должны добавить слушателя мыши к ребенку следующим способом:
addMouseListener (MouseListener *newListener,
bool wantsEventsForAllNestedChildComponents)
Итак, для примера, который вы показываете:
child->addMouseListener(this, true);
И метод mouseDown() должен быть таким:
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
}
}
Надеюсь, это поможет.