diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp index 8bd5d8e9f3..6cdeb83523 100644 --- a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp @@ -109,7 +109,8 @@ void TooltipWindow::displayTip (Point screenPos, const String& tip) if (w != this && w->tipShowing == tipShowing) { // Looks like you have more than one TooltipWindow showing the same tip.. - // Be careful not to create more than one instance of this class! + // Be careful not to create more than one instance of this class with the + // same parent component! jassertfalse; } } @@ -153,50 +154,55 @@ void TooltipWindow::timerCallback() auto now = Time::getApproximateMillisecondCounter(); auto* newComp = mouseSource.isTouch() ? nullptr : mouseSource.getComponentUnderMouse(); - auto newTip = newComp != nullptr ? getTipFor (*newComp) : String(); - bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse); - lastComponentUnderMouse = newComp; - lastTipUnderMouse = newTip; + auto* parent = getParentComponent(); - auto clickCount = desktop.getMouseButtonClickCounter(); - auto wheelCount = desktop.getMouseWheelMoveCounter(); - bool mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves); - mouseClicks = clickCount; - mouseWheelMoves = wheelCount; + if (newComp == nullptr || parent == nullptr || parent == newComp || parent->isParentOf (newComp)) + { + auto newTip = newComp != nullptr ? getTipFor (*newComp) : String(); + bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse); + lastComponentUnderMouse = newComp; + lastTipUnderMouse = newTip; - auto mousePos = mouseSource.getScreenPosition(); - bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12; - lastMousePos = mousePos; + auto clickCount = desktop.getMouseButtonClickCounter(); + auto wheelCount = desktop.getMouseWheelMoveCounter(); + bool mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves); + mouseClicks = clickCount; + mouseWheelMoves = wheelCount; - if (tipChanged || mouseWasClicked || mouseMovedQuickly) - lastCompChangeTime = now; + auto mousePos = mouseSource.getScreenPosition(); + bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12; + lastMousePos = mousePos; - if (isVisible() || now < lastHideTime + 500) - { - // 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 (tipChanged || mouseWasClicked || mouseMovedQuickly) + lastCompChangeTime = now; + + if (isVisible() || now < lastHideTime + 500) { - if (isVisible()) + // if a tip is currently visible (or has just disappeared), update to a new one + // immediately if needed.. + if (newComp == nullptr || mouseWasClicked || newTip.isEmpty()) { - lastHideTime = now; - hideTip(); + if (isVisible()) + { + lastHideTime = now; + hideTip(); + } + } + else if (tipChanged) + { + displayTip (mousePos.roundToInt(), newTip); } } - else if (tipChanged) - { - displayTip (mousePos.roundToInt(), newTip); - } - } - else - { - // if there isn't currently a tip, but one is needed, only let it - // appear after a timeout.. - if (newTip.isNotEmpty() - && newTip != tipShowing - && now > lastCompChangeTime + (uint32) millisecondsBeforeTipAppears) + else { - displayTip (mousePos.roundToInt(), newTip); + // if there isn't currently a tip, but one is needed, only let it + // appear after a timeout.. + if (newTip.isNotEmpty() + && newTip != tipShowing + && now > lastCompChangeTime + (uint32) millisecondsBeforeTipAppears) + { + displayTip (mousePos.roundToInt(), newTip); + } } } } diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.h b/modules/juce_gui_basics/windows/juce_TooltipWindow.h index a73f0f750c..cbdc16989d 100644 --- a/modules/juce_gui_basics/windows/juce_TooltipWindow.h +++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.h @@ -32,11 +32,15 @@ namespace juce A window that displays a pop-up tooltip when the mouse hovers over another component. To enable tooltips in your app, just create a single instance of a TooltipWindow - object. Note that if you instantiate more than one instance of this class, you'll - end up with multiple tooltips being shown! This is a common problem when compiling - audio plug-ins with JUCE: depending on the way you instantiate TooltipWindow, - you may end up with a TooltipWindow for each plug-in instance. To avoid this use a - SharedResourcePointer to instantiate the TooltipWindow only once. + object. Note that if you instantiate more than one instance of this class with the + same parentComponent (even if both TooltipWindow's parentComponent is nil), you'll + end up with multiple tooltips being shown! To avoid this use a SharedResourcePointer + to instantiate the TooltipWindow only once. + + For audio plug-ins (which should not be opening native windows) it is better + to add a TooltipWindow as a member variable to the editor and ensure that the + editor is the parentComponent of your TooltipWindow. This will ensure that your + TooltipWindow is scaled according to your editor and the DAWs scaling setting. The TooltipWindow object will then stay invisible, waiting until the mouse hovers for the specified length of time - it will then see if it's currently