From 266beb22b2c9ddc4e51bc37b7667bb8d2ba7e0de Mon Sep 17 00:00:00 2001 From: hogliux Date: Mon, 19 Mar 2018 11:31:39 +0000 Subject: [PATCH] Mouse: Added MouseListener::mouseMagnify and cleaned up some mouse event handler code --- .../components/juce_Component.cpp | 83 +++++++------------ .../components/juce_Component.h | 2 +- .../mouse/juce_MouseListener.cpp | 1 + .../mouse/juce_MouseListener.h | 13 +++ 4 files changed, 46 insertions(+), 53 deletions(-) diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index ba0cf99e4a..76dc7efb86 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -65,8 +65,9 @@ public: } } + template 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 relati Desktop::getInstance().getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseEnter (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); } void Component::internalMouseExit (MouseInputSource source, Point relativePos, Time time) @@ -2332,7 +2295,7 @@ void Component::internalMouseExit (MouseInputSource source, Point relativ Desktop::getInstance().getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseExit (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); } void Component::internalMouseDown (MouseInputSource source, Point relativePos, Time time, @@ -2397,7 +2360,7 @@ void Component::internalMouseDown (MouseInputSource source, Point relativ desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDown (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); } void Component::internalMouseUp (MouseInputSource source, Point relativePos, Time time, @@ -2425,7 +2388,7 @@ void Component::internalMouseUp (MouseInputSource source, Point relativeP auto& desktop = Desktop::getInstance(); desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseUp (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); if (checker.shouldBailOut()) return; @@ -2439,7 +2402,7 @@ void Component::internalMouseUp (MouseInputSource source, Point relativeP return; desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDoubleClick (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); } } @@ -2463,7 +2426,7 @@ void Component::internalMouseDrag (MouseInputSource source, Point relativ Desktop::getInstance().getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); } } @@ -2491,7 +2454,7 @@ void Component::internalMouseMove (MouseInputSource source, Point relativ desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); }); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); } } @@ -2521,21 +2484,37 @@ void Component::internalMouseWheel (MouseInputSource source, Point relati desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseWheelMove (me, wheel); }); if (! checker.shouldBailOut()) - MouseListenerList::sendWheelEvent (*this, checker, me, wheel); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseWheelMove, me, wheel); } } void Component::internalMagnifyGesture (MouseInputSource source, Point 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 (*this, checker, &MouseListener::mouseMagnify, me, amount); } } diff --git a/modules/juce_gui_basics/components/juce_Component.h b/modules/juce_gui_basics/components/juce_Component.h index cc4149d180..9b0df8b45c 100644 --- a/modules/juce_gui_basics/components/juce_Component.h +++ b/modules/juce_gui_basics/components/juce_Component.h @@ -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 diff --git a/modules/juce_gui_basics/mouse/juce_MouseListener.cpp b/modules/juce_gui_basics/mouse/juce_MouseListener.cpp index 984a436f29..133dad4328 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseListener.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseListener.cpp @@ -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 diff --git a/modules/juce_gui_basics/mouse/juce_MouseListener.h b/modules/juce_gui_basics/mouse/juce_MouseListener.h index 76160f4c6e..3639db618b 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseListener.h +++ b/modules/juce_gui_basics/mouse/juce_MouseListener.h @@ -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