/ / перехоплення подій миші в FileBrowserComponent в бібліотеці Juce - c ++, juce

перехоплення подій миші на FileBrowserComponent в бібліотеці Juce - c ++, juce

Я останнім часом починаю користуватися Бібліотека соку. Я зазвичай розміщую питання, пов'язані з ДжусомФорум, але я бореться з питаннями вже багато днів, і я не отримав відповіді досі. Тож stackoveflow варто спробувати, навіть якщо здається, що тут не так багато користувачів 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;
}

Цілями цього класу є:

  1. зберігати єдиний компонент ієрархія компонентів (дочірня)

  2. перехопити всі пов'язані з подіями миші дитині або одному з її нащадків

  3. робити щось
  4. врешті-решт переслати MouseEvent до компонент, на який він був спрямований до

Я спробував цей клас із компонентами слайдерів якдіти, навіть вкладені всередину інших компонентів .. все працює чудово. Зараз я робив кілька експериментів з FileBrowserComponent і, здається, не працює належним чином. Наприклад, коли я натискаю кнопку, щоб перейти до перевернутого каталогу, це не відбувається (кнопка отримує подію миші, і її клацають, але нічого не відбувається у вигляді дерева). Також вибір елементів зі списку не працює.

У чому може бути проблема? (Я зробив декілька експериментів і, здається, що кнопка методу натиснута у 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 (де я відключаю натискання миші після), змусить це працювати (навіть якщо це не результат, який я хотів би отримати, тому що мені потрібно повторно змінити події миші на цьому компонент).

Ці факти можуть привести мене до двох міркувань:

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

Спасибі заздалегідь

Відповіді:

0 для відповіді № 1

Вам слід краще створити похідні класи зКомпонент і в цих похідних класах реалізують необхідні події миші, і коли ці події запускаються, ви можете опублікувати повідомлення в батьківському класі, щоб він міг робити інші речі.


0 для відповіді № 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
}
}

Сподіваюсь, ця допомога.