Browse Source

Mouse: Added MouseListener::mouseMagnify and cleaned up some mouse event handler code

tags/2021-05-28
hogliux 7 years ago
parent
commit
266beb22b2
4 changed files with 46 additions and 53 deletions
  1. +31
    -52
      modules/juce_gui_basics/components/juce_Component.cpp
  2. +1
    -1
      modules/juce_gui_basics/components/juce_Component.h
  3. +1
    -0
      modules/juce_gui_basics/mouse/juce_MouseListener.cpp
  4. +13
    -0
      modules/juce_gui_basics/mouse/juce_MouseListener.h

+ 31
- 52
modules/juce_gui_basics/components/juce_Component.cpp View File

@@ -65,8 +65,9 @@ public:
}
}
template <typename ...Params>
static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker,
void (MouseListener::*eventMethod) (const MouseEvent&), const MouseEvent& e)
void (MouseListener::*eventMethod) (Params...), Params... params)
{
if (checker.shouldBailOut())
return;
@@ -75,7 +76,7 @@ public:
{
for (int i = list->listeners.size(); --i >= 0;)
{
(list->listeners.getUnchecked(i)->*eventMethod) (e);
(list->listeners.getUnchecked(i)->*eventMethod) (params...);
if (checker.shouldBailOut())
return;
@@ -94,45 +95,7 @@ public:
for (int i = list->numDeepMouseListeners; --i >= 0;)
{
(list->listeners.getUnchecked(i)->*eventMethod) (e);
if (checker2.shouldBailOut())
return;
i = jmin (i, list->numDeepMouseListeners);
}
}
}
}
}
static void sendWheelEvent (Component& comp, Component::BailOutChecker& checker,
const MouseEvent& e, const MouseWheelDetails& wheel)
{
if (auto* list = comp.mouseListeners.get())
{
for (int i = list->listeners.size(); --i >= 0;)
{
list->listeners.getUnchecked(i)->mouseWheelMove (e, wheel);
if (checker.shouldBailOut())
return;
i = jmin (i, list->listeners.size());
}
}
for (Component* p = comp.parentComponent; p != nullptr; p = p->parentComponent)
{
if (auto* list = p->mouseListeners.get())
{
if (list->numDeepMouseListeners > 0)
{
BailOutChecker2 checker2 (checker, p);
for (int i = list->numDeepMouseListeners; --i >= 0;)
{
list->listeners.getUnchecked(i)->mouseWheelMove (e, wheel);
(list->listeners.getUnchecked(i)->*eventMethod) (params...);
if (checker2.shouldBailOut())
return;
@@ -2303,7 +2266,7 @@ void Component::internalMouseEnter (MouseInputSource source, Point<float> relati
Desktop::getInstance().getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseEnter (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseEnter, me);
}
void Component::internalMouseExit (MouseInputSource source, Point<float> relativePos, Time time)
@@ -2332,7 +2295,7 @@ void Component::internalMouseExit (MouseInputSource source, Point<float> relativ
Desktop::getInstance().getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseExit (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseExit, me);
}
void Component::internalMouseDown (MouseInputSource source, Point<float> relativePos, Time time,
@@ -2397,7 +2360,7 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDown (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseDown, me);
}
void Component::internalMouseUp (MouseInputSource source, Point<float> relativePos, Time time,
@@ -2425,7 +2388,7 @@ void Component::internalMouseUp (MouseInputSource source, Point<float> relativeP
auto& desktop = Desktop::getInstance();
desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseUp (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseUp, me);
if (checker.shouldBailOut())
return;
@@ -2439,7 +2402,7 @@ void Component::internalMouseUp (MouseInputSource source, Point<float> relativeP
return;
desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDoubleClick (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseDoubleClick, me);
}
}
@@ -2463,7 +2426,7 @@ void Component::internalMouseDrag (MouseInputSource source, Point<float> relativ
Desktop::getInstance().getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseDrag, me);
}
}
@@ -2491,7 +2454,7 @@ void Component::internalMouseMove (MouseInputSource source, Point<float> relativ
desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me);
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseMove, me);
}
}
@@ -2521,21 +2484,37 @@ void Component::internalMouseWheel (MouseInputSource source, Point<float> relati
desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseWheelMove (me, wheel); });
if (! checker.shouldBailOut())
MouseListenerList::sendWheelEvent (*this, checker, me, wheel);
MouseListenerList::template sendMouseEvent<const MouseEvent&, const MouseWheelDetails&> (*this, checker, &MouseListener::mouseWheelMove, me, wheel);
}
}
void Component::internalMagnifyGesture (MouseInputSource source, Point<float> relativePos,
Time time, float amount)
{
if (! isCurrentlyBlockedByAnotherModalComponent())
{
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
auto& desktop = Desktop::getInstance();
BailOutChecker checker (this);
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
this, this, time, relativePos, time, 0, false);
if (isCurrentlyBlockedByAnotherModalComponent())
{
// allow blocked mouse-events to go to global listeners..
desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMagnify (me, amount); });
}
else
{
mouseMagnify (me, amount);
if (checker.shouldBailOut())
return;
desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMagnify (me, amount); });
if (! checker.shouldBailOut())
MouseListenerList::template sendMouseEvent<const MouseEvent&, float> (*this, checker, &MouseListener::mouseMagnify, me, amount);
}
}


+ 1
- 1
modules/juce_gui_basics/components/juce_Component.h View File

@@ -1596,7 +1596,7 @@ public:
should be changed. A value of 1.0 would indicate no change,
values greater than 1.0 mean it should be enlarged.
*/
virtual void mouseMagnify (const MouseEvent& event, float scaleFactor);
virtual void mouseMagnify (const MouseEvent& event, float scaleFactor) override;
//==============================================================================
/** Ensures that a non-stop stream of mouse-drag events will be sent during the


+ 1
- 0
modules/juce_gui_basics/mouse/juce_MouseListener.cpp View File

@@ -35,5 +35,6 @@ void MouseListener::mouseDrag (const MouseEvent&) {}
void MouseListener::mouseMove (const MouseEvent&) {}
void MouseListener::mouseDoubleClick (const MouseEvent&) {}
void MouseListener::mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) {}
void MouseListener::mouseMagnify (const MouseEvent&, float) {}
} // namespace juce

+ 13
- 0
modules/juce_gui_basics/mouse/juce_MouseListener.h View File

@@ -155,6 +155,19 @@ public:
virtual void mouseWheelMove (const MouseEvent& event,
const MouseWheelDetails& wheel);
/** Called when a pinch-to-zoom mouse-gesture is used.
If not overridden, a component will forward this message to its parent, so
that parent components can collect gesture messages that are unused by child
components.
@param event details about the mouse event
@param scaleFactor a multiplier to indicate by how much the size of the target
should be changed. A value of 1.0 would indicate no change,
values greater than 1.0 mean it should be enlarged.
*/
virtual void mouseMagnify (const MouseEvent& event, float scaleFactor);
private:
#if JUCE_CATCH_DEPRECATED_CODE_MISUSE


Loading…
Cancel
Save