From 057b555f08a0755092dfcc1b98c9140effc0eec6 Mon Sep 17 00:00:00 2001 From: ed Date: Mon, 8 Nov 2021 16:18:08 +0000 Subject: [PATCH] Tooltip: Track mouse clicks using global Desktop mouse listener callbacks to fix bug with Timer callbacks missing events --- .../windows/juce_TooltipWindow.cpp | 28 +++++++++++-------- .../windows/juce_TooltipWindow.h | 5 ++-- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp index 8b090b1e8a..158647d127 100644 --- a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp @@ -37,13 +37,19 @@ TooltipWindow::TooltipWindow (Component* parentComp, int delayMs) if (parentComp != nullptr) parentComp->addChildComponent (this); - if (Desktop::getInstance().getMainMouseSource().canHover()) + auto& desktop = Desktop::getInstance(); + + if (desktop.getMainMouseSource().canHover()) + { + desktop.addGlobalMouseListener (this); startTimer (123); + } } TooltipWindow::~TooltipWindow() { hideTip(); + Desktop::getInstance().removeGlobalMouseListener (this); } void TooltipWindow::setMillisecondsBeforeTipAppears (const int newTimeMs) noexcept @@ -56,11 +62,15 @@ void TooltipWindow::paint (Graphics& g) getLookAndFeel().drawTooltip (g, tipShowing, getWidth(), getHeight()); } -void TooltipWindow::mouseEnter (const MouseEvent&) +void TooltipWindow::mouseEnter (const MouseEvent& e) { - hideTip(); + if (e.eventComponent == this) + hideTip(); } +void TooltipWindow::mouseDown (const MouseEvent&) { dismissalMouseEventOccured = true; } +void TooltipWindow::mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) { dismissalMouseEventOccured = true; } + void TooltipWindow::updatePosition (const String& tip, Point pos, Rectangle parentArea) { setBounds (getLookAndFeel().getTooltipBounds (tip, pos, parentArea)); @@ -126,6 +136,7 @@ void TooltipWindow::displayTipInternal (Point screenPos, const String& tip, toFront (false); manuallyShownTip = shownManually == ShownManually::yes ? tip : String(); + dismissalMouseEventOccured = false; } } @@ -148,6 +159,7 @@ void TooltipWindow::hideTip() { tipShowing = {}; manuallyShownTip = {}; + dismissalMouseEventOccured = false; removeFromDesktop(); setVisible (false); @@ -196,17 +208,11 @@ void TooltipWindow::timerCallback() lastComponentUnderMouse = newComp; lastTipUnderMouse = newTip; - const auto clickCount = desktop.getMouseButtonClickCounter(); - const auto wheelCount = desktop.getMouseWheelMoveCounter(); - const auto mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves); - mouseClicks = clickCount; - mouseWheelMoves = wheelCount; - const auto mousePos = mouseSource.getScreenPosition(); const auto mouseMovedQuickly = (mousePos.getDistanceFrom (lastMousePos) > 12); lastMousePos = mousePos; - if (tipChanged || mouseWasClicked || mouseMovedQuickly) + if (tipChanged || dismissalMouseEventOccured || mouseMovedQuickly) lastCompChangeTime = now; auto showTip = [this, &mouseSource, &mousePos, &newTip] @@ -225,7 +231,7 @@ void TooltipWindow::timerCallback() { // if a tip is currently visible (or has just disappeared), update to a new one // immediately if needed.. - if (newComp == nullptr || mouseWasClicked || newTip.isEmpty()) + if (newComp == nullptr || dismissalMouseEventOccured || newTip.isEmpty()) { if (isVisible()) { diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.h b/modules/juce_gui_basics/windows/juce_TooltipWindow.h index a5d30efe75..fe430cc5ec 100644 --- a/modules/juce_gui_basics/windows/juce_TooltipWindow.h +++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.h @@ -133,9 +133,8 @@ private: Component* lastComponentUnderMouse = nullptr; String tipShowing, lastTipUnderMouse, manuallyShownTip; int millisecondsBeforeTipAppears; - int mouseClicks = 0, mouseWheelMoves = 0; unsigned int lastCompChangeTime = 0, lastHideTime = 0; - bool reentrant = false; + bool reentrant = false, dismissalMouseEventOccured = false; enum ShownManually { yes, no }; void displayTipInternal (Point, const String&, ShownManually); @@ -143,6 +142,8 @@ private: std::unique_ptr createAccessibilityHandler() override; void paint (Graphics&) override; void mouseEnter (const MouseEvent&) override; + void mouseDown (const MouseEvent&) override; + void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override; void timerCallback() override; void updatePosition (const String&, Point, Rectangle);