diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index a30981e7bd..8b72df0313 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -2430,6 +2430,22 @@ void Component::internalMouseDown (MouseInputSource source, Point relativ desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDown (me); }); MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); + + + if (checker.shouldBailOut()) + return; + + // check for double-click + if (flags.doubleClickTriggerOnMouseDown && me.getNumberOfClicks() >= 2) + { + mouseDoubleClick (me); + + if (checker.shouldBailOut()) + return; + + desktop.mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDoubleClick (me); }); + MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); + } } void Component::internalMouseUp (MouseInputSource source, Point relativePos, Time time, @@ -2463,7 +2479,7 @@ void Component::internalMouseUp (MouseInputSource source, Point relativeP return; // check for double-click - if (me.getNumberOfClicks() >= 2) + if (! flags.doubleClickTriggerOnMouseDown && me.getNumberOfClicks() >= 2) { mouseDoubleClick (me); @@ -2691,6 +2707,16 @@ bool Component::getMouseClickGrabsKeyboardFocus() const noexcept return ! flags.dontFocusOnMouseClickFlag; } +void Component::setDoubleClickTriggeredOnMouseDown (bool isTriggeredOnMouseDown) noexcept +{ + flags.doubleClickTriggerOnMouseDown = isTriggeredOnMouseDown; +} + +bool Component::getDoubleClickTriggeredOnMouseDown() const noexcept +{ + return flags.doubleClickTriggerOnMouseDown; +} + bool Component::getWantsKeyboardFocus() const noexcept { return flags.wantsFocusFlag && ! flags.isDisabledFlag; diff --git a/modules/juce_gui_basics/components/juce_Component.h b/modules/juce_gui_basics/components/juce_Component.h index 5dbeb7a00c..d17cad7ce1 100644 --- a/modules/juce_gui_basics/components/juce_Component.h +++ b/modules/juce_gui_basics/components/juce_Component.h @@ -1240,6 +1240,25 @@ public: */ bool getMouseClickGrabsKeyboardFocus() const noexcept; + //============================================================================== + /** Sets whether the double click should happen when the mouse is pressed or released + during the second click. + + By default the button is only considered to have been double clicked when the mouse is + released after the second click, but setting this to true will make it call the mouseDoubleClick() + method as soon as the button is pressed. + + @see mouseDoubleClick + */ + void setDoubleClickTriggeredOnMouseDown (bool isTriggeredOnMouseDown) noexcept; + + /** Returns whether the double click happens when the mouse is pressed or released + during the second click. + + @see setDoubleClickTriggeredOnMouseDown + */ + bool getDoubleClickTriggeredOnMouseDown() const noexcept; + //============================================================================== /** Tries to give keyboard focus to this component. @@ -2316,27 +2335,28 @@ private: struct ComponentFlags { - bool hasHeavyweightPeerFlag : 1; - bool visibleFlag : 1; - bool opaqueFlag : 1; - bool ignoresMouseClicksFlag : 1; - bool allowChildMouseClicksFlag : 1; - bool wantsFocusFlag : 1; - bool isFocusContainerFlag : 1; - bool dontFocusOnMouseClickFlag : 1; - bool alwaysOnTopFlag : 1; - bool bufferToImageFlag : 1; - bool bringToFrontOnClickFlag : 1; - bool repaintOnMouseActivityFlag : 1; - bool isDisabledFlag : 1; - bool childCompFocusedFlag : 1; - bool dontClipGraphicsFlag : 1; - bool mouseDownWasBlocked : 1; - bool isMoveCallbackPending : 1; - bool isResizeCallbackPending : 1; - bool viewportIgnoreDragFlag : 1; + bool hasHeavyweightPeerFlag : 1; + bool visibleFlag : 1; + bool opaqueFlag : 1; + bool ignoresMouseClicksFlag : 1; + bool allowChildMouseClicksFlag : 1; + bool wantsFocusFlag : 1; + bool isFocusContainerFlag : 1; + bool dontFocusOnMouseClickFlag : 1; + bool doubleClickTriggerOnMouseDown : 1; + bool alwaysOnTopFlag : 1; + bool bufferToImageFlag : 1; + bool bringToFrontOnClickFlag : 1; + bool repaintOnMouseActivityFlag : 1; + bool isDisabledFlag : 1; + bool childCompFocusedFlag : 1; + bool dontClipGraphicsFlag : 1; + bool mouseDownWasBlocked : 1; + bool isMoveCallbackPending : 1; + bool isResizeCallbackPending : 1; + bool viewportIgnoreDragFlag : 1; #if JUCE_DEBUG - bool isInsidePaintCall : 1; + bool isInsidePaintCall : 1; #endif };