LMMS
Loading...
Searching...
No Matches
juce_TooltipWindow.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29TooltipWindow::TooltipWindow (Component* parentComp, int delayMs)
30 : Component ("tooltip"),
32{
33 setAlwaysOnTop (true);
34 setOpaque (true);
35 setAccessible (false);
36
37 if (parentComp != nullptr)
38 parentComp->addChildComponent (this);
39
40 auto& desktop = Desktop::getInstance();
41
42 if (desktop.getMainMouseSource().canHover())
43 {
44 desktop.addGlobalMouseListener (this);
45 startTimer (123);
46 }
47}
48
50{
51 hideTip();
52 Desktop::getInstance().removeGlobalMouseListener (this);
53}
54
55void TooltipWindow::setMillisecondsBeforeTipAppears (const int newTimeMs) noexcept
56{
58}
59
61{
62 getLookAndFeel().drawTooltip (g, tipShowing, getWidth(), getHeight());
63}
64
66{
67 if (e.eventComponent == this)
68 hideTip();
69}
70
76
82
84{
85 setBounds (getLookAndFeel().getTooltipBounds (tip, pos, parentArea));
86 setVisible (true);
87}
88
89#if JUCE_DEBUG
90static Array<TooltipWindow*> activeTooltipWindows;
91#endif
92
93void TooltipWindow::displayTip (Point<int> screenPos, const String& tip)
94{
95 jassert (tip.isNotEmpty());
96
97 displayTipInternal (screenPos, tip, ShownManually::yes);
98}
99
100void TooltipWindow::displayTipInternal (Point<int> screenPos, const String& tip, ShownManually shownManually)
101{
102 if (! reentrant)
103 {
104 ScopedValueSetter<bool> setter (reentrant, true, false);
105
106 if (tipShowing != tip)
107 {
108 tipShowing = tip;
109 repaint();
110 }
111
112 if (auto* parent = getParentComponent())
113 {
114 updatePosition (tip, parent->getLocalPoint (nullptr, screenPos),
115 parent->getLocalBounds());
116 }
117 else
118 {
119 const auto physicalPos = ScalingHelpers::scaledScreenPosToUnscaled (screenPos);
120 const auto scaledPos = ScalingHelpers::unscaledScreenPosToScaled (*this, physicalPos);
121 updatePosition (tip, scaledPos, Desktop::getInstance().getDisplays().getDisplayForPoint (screenPos)->userArea);
122
127 }
128
129 #if JUCE_DEBUG
130 activeTooltipWindows.addIfNotAlreadyThere (this);
131
132 auto* parent = getParentComponent();
133
134 for (auto* w : activeTooltipWindows)
135 {
136 if (w != nullptr && w != this && w->tipShowing == tipShowing && w->getParentComponent() == parent)
137 {
138 // Looks like you have more than one TooltipWindow showing the same tip..
139 // Be careful not to create more than one instance of this class with the
140 // same parent component!
142 }
143 }
144 #endif
145
146 toFront (false);
147 manuallyShownTip = shownManually == ShownManually::yes ? tip : String();
149 }
150}
151
153{
155 && ! ModifierKeys::currentModifiers.isAnyMouseButtonDown())
156 {
157 if (auto* ttc = dynamic_cast<TooltipClient*> (&c))
158 if (! c.isCurrentlyBlockedByAnotherModalComponent())
159 return ttc->getTooltip();
160 }
161
162 return {};
163}
164
166{
167 if (isVisible() && ! reentrant)
168 {
169 tipShowing = {};
170 manuallyShownTip = {};
172
174 setVisible (false);
175
177
178 #if JUCE_DEBUG
179 activeTooltipWindows.removeAllInstancesOf (this);
180 #endif
181 }
182}
183
191
192std::unique_ptr<AccessibilityHandler> TooltipWindow::createAccessibilityHandler()
193{
195}
196
198{
199 const auto mouseSource = Desktop::getInstance().getMainMouseSource();
200 auto* newComp = mouseSource.isTouch() ? nullptr : mouseSource.getComponentUnderMouse();
201
202 if (manuallyShownTip.isNotEmpty())
203 {
204 if (dismissalMouseEventOccurred || newComp == nullptr)
205 hideTip();
206
207 return;
208 }
209
210 if (newComp == nullptr || getParentComponent() == nullptr || newComp->getPeer() == getPeer())
211 {
212 const auto newTip = newComp != nullptr ? getTipFor (*newComp) : String();
213
214 const auto mousePos = mouseSource.getScreenPosition();
215 const auto mouseMovedQuickly = (mousePos.getDistanceFrom (lastMousePos) > 12);
216 lastMousePos = mousePos;
217
218 const auto tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);
220
221 lastComponentUnderMouse = newComp;
222 lastTipUnderMouse = newTip;
223
224 if (tipChanged || dismissalMouseEventOccurred || mouseMovedQuickly)
225 lastCompChangeTime = now;
226
227 const auto showTip = [this, &mouseSource, &mousePos, &newTip]
228 {
229 if (mouseSource.getLastMouseDownPosition() != lastMousePos)
230 displayTipInternal (mousePos.roundToInt(), newTip, ShownManually::no);
231 };
232
233 if (isVisible() || now < lastHideTime + 500)
234 {
235 // if a tip is currently visible (or has just disappeared), update to a new one
236 // immediately if needed..
237 if (newComp == nullptr || dismissalMouseEventOccurred || newTip.isEmpty())
238 hideTip();
239 else if (tipChanged)
240 showTip();
241 }
242 else
243 {
244 // if there isn't currently a tip, but one is needed, only let it appear after a timeout
245 if (newTip.isNotEmpty()
246 && newTip != tipShowing
248 {
249 showTip();
250 }
251 }
252 }
253}
254
255} // namespace juce
#define nullptr
Definition DistrhoDefines.h:75
Definition juce_Array.h:56
int removeAllInstancesOf(ParameterType valueToRemove)
Definition juce_Array.h:861
bool addIfNotAlreadyThere(ParameterType newElement)
Definition juce_Array.h:522
void setAccessible(bool shouldBeAccessible)
Definition juce_Component.cpp:3273
bool isVisible() const noexcept
Definition juce_Component.h:122
void removeFromDesktop()
Definition juce_Component.cpp:773
Component * getParentComponent() const noexcept
Definition juce_Component.h:804
int getHeight() const noexcept
Definition juce_Component.h:274
void toFront(bool shouldAlsoGainKeyboardFocus)
Definition juce_Component.cpp:954
static float JUCE_CALLTYPE getApproximateScaleFactorForComponent(const Component *targetComponent)
Definition juce_Component.cpp:1383
void setAlwaysOnTop(bool shouldStayOnTop)
Definition juce_Component.cpp:1074
void setOpaque(bool shouldBeOpaque)
Definition juce_Component.cpp:829
void repaint()
Definition juce_Component.cpp:1917
Component() noexcept
Definition juce_Component.cpp:517
virtual void addToDesktop(int windowStyleFlags, void *nativeWindowToAttachTo=nullptr)
Definition juce_Component.cpp:658
void setBounds(int x, int y, int width, int height)
Definition juce_Component.cpp:1147
static std::unique_ptr< AccessibilityHandler > createIgnoredAccessibilityHandler(Component &)
Definition juce_Component.cpp:3292
int getWidth() const noexcept
Definition juce_Component.h:271
ComponentPeer * getPeer() const
Definition juce_Component.cpp:801
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
void addChildComponent(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1548
virtual void setVisible(bool shouldBeVisible)
Definition juce_Component.cpp:575
virtual float getDesktopScaleFactor() const
Definition juce_Component.cpp:826
@ windowIsTemporary
Definition juce_ComponentPeer.h:52
@ windowIgnoresKeyPresses
Definition juce_ComponentPeer.h:71
@ windowIgnoresMouseClicks
Definition juce_ComponentPeer.h:54
@ windowHasDropShadow
Definition juce_ComponentPeer.h:66
static Desktop &JUCE_CALLTYPE getInstance()
Definition juce_Desktop.cpp:50
Definition juce_GraphicsContext.h:45
static ModifierKeys currentModifiers
Definition juce_ModifierKeys.h:189
Definition juce_MouseEvent.h:39
Definition juce_Point.h:42
Definition juce_Rectangle.h:67
Definition juce_ScopedValueSetter.h:55
Definition juce_String.h:53
bool isNotEmpty() const noexcept
Definition juce_String.h:316
static uint32 getApproximateMillisecondCounter() noexcept
Definition juce_Time.cpp:261
void startTimer(int intervalInMilliseconds) noexcept
Definition juce_Timer.cpp:332
Definition juce_TooltipClient.h:42
void mouseWheelMove(const MouseEvent &, const MouseWheelDetails &) override
Definition juce_TooltipWindow.cpp:77
bool reentrant
Definition juce_TooltipWindow.h:143
void displayTipInternal(Point< int >, const String &, ShownManually)
Definition juce_TooltipWindow.cpp:100
String manuallyShownTip
Definition juce_TooltipWindow.h:140
Point< float > lastMousePos
Definition juce_TooltipWindow.h:138
TooltipWindow(Component *parentComponent=nullptr, int millisecondsBeforeTipAppears=700)
Definition juce_TooltipWindow.cpp:29
void displayTip(Point< int > screenPosition, const String &text)
Definition juce_TooltipWindow.cpp:93
void mouseEnter(const MouseEvent &) override
Definition juce_TooltipWindow.cpp:65
bool dismissalMouseEventOccurred
Definition juce_TooltipWindow.h:143
void paint(Graphics &) override
Definition juce_TooltipWindow.cpp:60
void updatePosition(const String &, Point< int >, Rectangle< int >)
Definition juce_TooltipWindow.cpp:83
~TooltipWindow() override
Definition juce_TooltipWindow.cpp:49
void mouseDown(const MouseEvent &) override
Definition juce_TooltipWindow.cpp:71
int millisecondsBeforeTipAppears
Definition juce_TooltipWindow.h:141
float getDesktopScaleFactor() const override
Definition juce_TooltipWindow.cpp:184
void timerCallback() override
Definition juce_TooltipWindow.cpp:197
String tipShowing
Definition juce_TooltipWindow.h:140
void hideTip()
Definition juce_TooltipWindow.cpp:165
void setMillisecondsBeforeTipAppears(int newTimeMs=700) noexcept
Definition juce_TooltipWindow.cpp:55
unsigned int lastHideTime
Definition juce_TooltipWindow.h:142
ShownManually
Definition juce_TooltipWindow.h:145
@ yes
Definition juce_TooltipWindow.h:145
@ no
Definition juce_TooltipWindow.h:145
virtual String getTipFor(Component &)
Definition juce_TooltipWindow.cpp:152
SafePointer< Component > lastComponentUnderMouse
Definition juce_TooltipWindow.h:139
String lastTipUnderMouse
Definition juce_TooltipWindow.h:140
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_TooltipWindow.cpp:192
unsigned int lastCompChangeTime
Definition juce_TooltipWindow.h:142
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
int g
Definition inflate.c:1573
static uintptr_t parent
Definition pugl.h:1644
#define jassert(expression)
#define jassertfalse
Definition carla_juce.cpp:31
unsigned int uint32
Definition juce_MathsFunctions.h:45
static bool isForegroundOrEmbeddedProcess(Component *viewComponent)
Definition juce_gui_basics.cpp:120
Definition juce_MouseEvent.h:392
static PointOrRect scaledScreenPosToUnscaled(float scale, PointOrRect pos) noexcept
Definition juce_Component.cpp:207
static PointOrRect unscaledScreenPosToScaled(float scale, PointOrRect pos) noexcept
Definition juce_Component.cpp:201
return c
Definition crypt.c:175