перехват событий мыши в FileBrowserComponent в библиотеке Juce

#c #juce

#c #juce

Вопрос:

Недавно я начал использовать библиотеку Juce. Обычно я публикую вопрос, связанный с Juce, на его форуме, но я борюсь с проблемами в течение многих дней, и я до сих пор не получил ответов. Итак, stackoveflow действительно стоит попробовать, даже если кажется, что здесь не так много пользователей Juce.

Вот в чем вопрос:

Я провожу несколько экспериментов с компонентами Juce. У меня есть следующий класс:

 class MyComponent : public Component{

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

}
void mouseDown (const MouseEvent amp;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 amp;amp; doIWantToForwardEventToTarget()){
        MouseEvent newEvent = e.getEventRelativeTo(target);
        target->mouseDown(newEvent);
   }
}
void mouseMove (const MouseEvent amp;e);
void mouseEnter (const MouseEvent amp;e);
void mouseExit (const MouseEvent amp;e);
void mouseDrag (const MouseEvent amp;e);
void mouseUp (const MouseEvent amp;e);
void mouseDoubleClick (const MouseEvent amp;e);
void mouseWheelMove (const MouseEvent amp;e, float wheelIncrementX, float wheelIncrementY);

private:

Component *child;
}
  

Целями этого класса являются:

  1. хранить один компонент в иерархии компонентов (дочерний)

  2. перехватывать все события мыши, связанные с дочерним элементом или одним из его потомков

  3. сделайте что-нибудь
  4. в конечном итоге перенаправьте MouseEvent компоненту, на который оно было направлено

Я пробовал этот класс с компонентами sliders в качестве дочерних элементов, даже вложенных в другие компоненты.. все работает нормально. Теперь я проводил некоторые эксперименты с FileBrowserComponent, и, похоже, он не работает должным образом. Например, когда я нажимаю на кнопку, чтобы перейти в каталог upside, этого не происходит (кнопка получает событие mouse и нажимается, но в древовидном представлении ничего не происходит). Также не работает выбор элементов из списка.

В чем может быть проблема? (Я провел несколько экспериментов, и кажется, что метод buttonClicked в FileBrowserComponent не вызывается, но я не знаю почему) Есть предложения?

Я также пытался изменить код таким образом:

 void mouseDown (const MouseEvent amp;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 amp;amp; doIWantToForwardEventToTarget()){
        target->setInterceptsMouseClicks(true, true);
        MouseEvent newEvent = e.getEventRelativeTo(target);
        target->mouseDown(newEvent);
        target->setInterceptsMouseClicks(false, false);
   }
}
  

Это все еще не работает. В любом случае, я обнаружил, что если я прокомментирую второй вызов setInterceptMouseClicks (где я отключаю щелчок мыши после), все заработает (даже если это не тот результат, который я хотел бы получить, потому что мне нужно повторно активировать события мыши в этом компоненте).

Эти факты могут привести меня к двум соображениям:

  1. Компоненту необходимо перехватывать щелчки мыши, даже если события мыши вручную передаются в его метод mouseDown (это правда? Я не так уверен в этом)
  2. После обработки события мыши в FileBrowserComponent существуют другие классы, которые используют информацию о состоянии перехвата щелчка мыши, в противном случае это сработало бы, если после target-> mouseDown (newEvent) я снова отключу щелчки мыши. Есть идея?

Заранее спасибо

Ответ №1:

Вам лучше создавать производные классы из Component, и в этих производных классах реализовывать требуемые для них события мыши, и когда эти события запускаются, вы можете отправлять сообщение родительскому классу, чтобы он мог выполнять другие действия.

Ответ №2:

Кажется, что вы нажимаете на дочерний компонент FileBrowserComponent. и событие мыши дочернего элемента не пересылается обратно родительскому элементу (FileBrowserComponent). вот почему, когда вы щелкаете внутри, родительский элемент не получит событие.

таким образом, вместо перехода Top -> Bottom вам следует перейти bottom -> top. Чтобы сделать это: вы должны добавить прослушиватель мыши к дочернему элементу с помощью этого метода:

 addMouseListener (MouseListener *newListener, 
                  bool wantsEventsForAllNestedChildComponents)
  

Итак, для примера, который вы показываете :

 child->addMouseListener(this, true);
  

И метод mouseDown() должен быть таким :

 void mouseDown (const MouseEvent amp;e){

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

      // do something
    }
}
  

Надеюсь, это поможет.