mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-11 23:54:18 +00:00
small updates to improve TooltipWindow
This commit is contained in:
parent
f8e2eaccc3
commit
f2c0fda2e9
3 changed files with 206 additions and 200 deletions
|
|
@ -1454,9 +1454,10 @@ void NSViewComponentPeer::drawRect (NSRect r)
|
|||
bool NSViewComponentPeer::canBecomeKeyWindow()
|
||||
{
|
||||
// If running as a plugin, let the component decide whether it's going to allow the window to get focused.
|
||||
return JUCEApplication::getInstance() != 0
|
||||
|| (isValidPeer (this)
|
||||
&& ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false));
|
||||
return ((getStyleFlags() & juce::ComponentPeer::windowIsTemporary) == 0)
|
||||
&& (JUCEApplication::getInstance() != 0
|
||||
|| (isValidPeer (this)
|
||||
&& ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false)));
|
||||
}
|
||||
|
||||
bool NSViewComponentPeer::windowShouldClose()
|
||||
|
|
|
|||
|
|
@ -74870,7 +74870,9 @@ void TooltipWindow::showFor (Component* const c, const String& tip)
|
|||
|
||||
const String TooltipWindow::getTipFor (Component* const c)
|
||||
{
|
||||
if (c->isValidComponent() && Process::isForegroundProcess())
|
||||
if (c->isValidComponent()
|
||||
&& Process::isForegroundProcess()
|
||||
&& ! Component::isMouseButtonDownAnywhere())
|
||||
{
|
||||
TooltipClient* const ttc = dynamic_cast <TooltipClient*> (c);
|
||||
|
||||
|
|
@ -269734,9 +269736,10 @@ void NSViewComponentPeer::drawRect (NSRect r)
|
|||
bool NSViewComponentPeer::canBecomeKeyWindow()
|
||||
{
|
||||
// If running as a plugin, let the component decide whether it's going to allow the window to get focused.
|
||||
return JUCEApplication::getInstance() != 0
|
||||
|| (isValidPeer (this)
|
||||
&& ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false));
|
||||
return ((getStyleFlags() & juce::ComponentPeer::windowIsTemporary) == 0)
|
||||
&& (JUCEApplication::getInstance() != 0
|
||||
|| (isValidPeer (this)
|
||||
&& ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false)));
|
||||
}
|
||||
|
||||
bool NSViewComponentPeer::windowShouldClose()
|
||||
|
|
|
|||
|
|
@ -1,193 +1,195 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../../../../juce_core/basics/juce_StandardHeader.h"
|
||||
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
|
||||
#include "juce_TooltipWindow.h"
|
||||
#include "../../../../juce_core/basics/juce_Time.h"
|
||||
#include "../../../../juce_core/threads/juce_Process.h"
|
||||
#include "../lookandfeel/juce_LookAndFeel.h"
|
||||
#include "../juce_Desktop.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
TooltipWindow::TooltipWindow (Component* const parentComponent,
|
||||
const int millisecondsBeforeTipAppears_)
|
||||
: Component ("tooltip"),
|
||||
millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_),
|
||||
mouseX (0),
|
||||
mouseY (0),
|
||||
lastHideTime (0),
|
||||
lastComponentUnderMouse (0),
|
||||
changedCompsSinceShown (true)
|
||||
{
|
||||
startTimer (123);
|
||||
|
||||
setAlwaysOnTop (true);
|
||||
setOpaque (true);
|
||||
|
||||
if (parentComponent != 0)
|
||||
parentComponent->addChildComponent (this);
|
||||
}
|
||||
|
||||
TooltipWindow::~TooltipWindow()
|
||||
{
|
||||
hide();
|
||||
}
|
||||
|
||||
void TooltipWindow::setMillisecondsBeforeTipAppears (const int newTimeMs) throw()
|
||||
{
|
||||
millisecondsBeforeTipAppears = newTimeMs;
|
||||
}
|
||||
|
||||
void TooltipWindow::paint (Graphics& g)
|
||||
{
|
||||
getLookAndFeel().drawTooltip (g, tipShowing, getWidth(), getHeight());
|
||||
}
|
||||
|
||||
void TooltipWindow::mouseEnter (const MouseEvent&)
|
||||
{
|
||||
hide();
|
||||
}
|
||||
|
||||
void TooltipWindow::showFor (Component* const c, const String& tip)
|
||||
{
|
||||
jassert (tip.isNotEmpty());
|
||||
tipShowing = tip;
|
||||
|
||||
int mx, my;
|
||||
Desktop::getMousePosition (mx, my);
|
||||
|
||||
if (getParentComponent() != 0)
|
||||
getParentComponent()->globalPositionToRelative (mx, my);
|
||||
|
||||
int x, y, w, h;
|
||||
getLookAndFeel().getTooltipSize (tip, w, h);
|
||||
|
||||
if (mx > getParentWidth() / 2)
|
||||
x = mx - (w + 12);
|
||||
else
|
||||
x = mx + 24;
|
||||
|
||||
if (my > getParentHeight() / 2)
|
||||
y = my - (h + 6);
|
||||
else
|
||||
y = my + 6;
|
||||
|
||||
setBounds (x, y, w, h);
|
||||
setVisible (true);
|
||||
|
||||
if (getParentComponent() == 0)
|
||||
{
|
||||
addToDesktop (ComponentPeer::windowHasDropShadow
|
||||
| ComponentPeer::windowIsTemporary);
|
||||
}
|
||||
|
||||
toFront (false);
|
||||
}
|
||||
|
||||
const String TooltipWindow::getTipFor (Component* const c)
|
||||
{
|
||||
if (c->isValidComponent() && Process::isForegroundProcess())
|
||||
{
|
||||
TooltipClient* const ttc = dynamic_cast <TooltipClient*> (c);
|
||||
|
||||
if (ttc != 0 && ! c->isCurrentlyBlockedByAnotherModalComponent())
|
||||
return ttc->getTooltip();
|
||||
}
|
||||
|
||||
return String::empty;
|
||||
}
|
||||
|
||||
void TooltipWindow::hide()
|
||||
{
|
||||
tipShowing = String::empty;
|
||||
removeFromDesktop();
|
||||
setVisible (false);
|
||||
}
|
||||
|
||||
void TooltipWindow::timerCallback()
|
||||
{
|
||||
const unsigned int now = Time::getApproximateMillisecondCounter();
|
||||
Component* const newComp = Component::getComponentUnderMouse();
|
||||
const String newTip (getTipFor (newComp));
|
||||
|
||||
const bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);
|
||||
lastComponentUnderMouse = newComp;
|
||||
lastTipUnderMouse = newTip;
|
||||
|
||||
const int clickCount = Desktop::getInstance().getMouseButtonClickCounter();
|
||||
const bool mouseWasClicked = clickCount > mouseClicks;
|
||||
mouseClicks = clickCount;
|
||||
|
||||
int mx, my;
|
||||
Desktop::getMousePosition (mx, my);
|
||||
const bool mouseMovedQuickly = (abs (mx - mouseX) + abs (my - mouseY) > 12);
|
||||
mouseX = mx;
|
||||
mouseY = my;
|
||||
|
||||
if (tipChanged || mouseWasClicked || mouseMovedQuickly)
|
||||
lastCompChangeTime = now;
|
||||
|
||||
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 == 0 || mouseWasClicked || newTip.isEmpty())
|
||||
{
|
||||
if (isVisible())
|
||||
{
|
||||
lastHideTime = now;
|
||||
hide();
|
||||
}
|
||||
}
|
||||
else if (tipChanged)
|
||||
{
|
||||
showFor (newComp, 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 + millisecondsBeforeTipAppears)
|
||||
{
|
||||
showFor (newComp, newTip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../../../../juce_core/basics/juce_StandardHeader.h"
|
||||
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
|
||||
#include "juce_TooltipWindow.h"
|
||||
#include "../../../../juce_core/basics/juce_Time.h"
|
||||
#include "../../../../juce_core/threads/juce_Process.h"
|
||||
#include "../lookandfeel/juce_LookAndFeel.h"
|
||||
#include "../juce_Desktop.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
TooltipWindow::TooltipWindow (Component* const parentComponent,
|
||||
const int millisecondsBeforeTipAppears_)
|
||||
: Component ("tooltip"),
|
||||
millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_),
|
||||
mouseX (0),
|
||||
mouseY (0),
|
||||
lastHideTime (0),
|
||||
lastComponentUnderMouse (0),
|
||||
changedCompsSinceShown (true)
|
||||
{
|
||||
startTimer (123);
|
||||
|
||||
setAlwaysOnTop (true);
|
||||
setOpaque (true);
|
||||
|
||||
if (parentComponent != 0)
|
||||
parentComponent->addChildComponent (this);
|
||||
}
|
||||
|
||||
TooltipWindow::~TooltipWindow()
|
||||
{
|
||||
hide();
|
||||
}
|
||||
|
||||
void TooltipWindow::setMillisecondsBeforeTipAppears (const int newTimeMs) throw()
|
||||
{
|
||||
millisecondsBeforeTipAppears = newTimeMs;
|
||||
}
|
||||
|
||||
void TooltipWindow::paint (Graphics& g)
|
||||
{
|
||||
getLookAndFeel().drawTooltip (g, tipShowing, getWidth(), getHeight());
|
||||
}
|
||||
|
||||
void TooltipWindow::mouseEnter (const MouseEvent&)
|
||||
{
|
||||
hide();
|
||||
}
|
||||
|
||||
void TooltipWindow::showFor (Component* const c, const String& tip)
|
||||
{
|
||||
jassert (tip.isNotEmpty());
|
||||
tipShowing = tip;
|
||||
|
||||
int mx, my;
|
||||
Desktop::getMousePosition (mx, my);
|
||||
|
||||
if (getParentComponent() != 0)
|
||||
getParentComponent()->globalPositionToRelative (mx, my);
|
||||
|
||||
int x, y, w, h;
|
||||
getLookAndFeel().getTooltipSize (tip, w, h);
|
||||
|
||||
if (mx > getParentWidth() / 2)
|
||||
x = mx - (w + 12);
|
||||
else
|
||||
x = mx + 24;
|
||||
|
||||
if (my > getParentHeight() / 2)
|
||||
y = my - (h + 6);
|
||||
else
|
||||
y = my + 6;
|
||||
|
||||
setBounds (x, y, w, h);
|
||||
setVisible (true);
|
||||
|
||||
if (getParentComponent() == 0)
|
||||
{
|
||||
addToDesktop (ComponentPeer::windowHasDropShadow
|
||||
| ComponentPeer::windowIsTemporary);
|
||||
}
|
||||
|
||||
toFront (false);
|
||||
}
|
||||
|
||||
const String TooltipWindow::getTipFor (Component* const c)
|
||||
{
|
||||
if (c->isValidComponent()
|
||||
&& Process::isForegroundProcess()
|
||||
&& ! Component::isMouseButtonDownAnywhere())
|
||||
{
|
||||
TooltipClient* const ttc = dynamic_cast <TooltipClient*> (c);
|
||||
|
||||
if (ttc != 0 && ! c->isCurrentlyBlockedByAnotherModalComponent())
|
||||
return ttc->getTooltip();
|
||||
}
|
||||
|
||||
return String::empty;
|
||||
}
|
||||
|
||||
void TooltipWindow::hide()
|
||||
{
|
||||
tipShowing = String::empty;
|
||||
removeFromDesktop();
|
||||
setVisible (false);
|
||||
}
|
||||
|
||||
void TooltipWindow::timerCallback()
|
||||
{
|
||||
const unsigned int now = Time::getApproximateMillisecondCounter();
|
||||
Component* const newComp = Component::getComponentUnderMouse();
|
||||
const String newTip (getTipFor (newComp));
|
||||
|
||||
const bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);
|
||||
lastComponentUnderMouse = newComp;
|
||||
lastTipUnderMouse = newTip;
|
||||
|
||||
const int clickCount = Desktop::getInstance().getMouseButtonClickCounter();
|
||||
const bool mouseWasClicked = clickCount > mouseClicks;
|
||||
mouseClicks = clickCount;
|
||||
|
||||
int mx, my;
|
||||
Desktop::getMousePosition (mx, my);
|
||||
const bool mouseMovedQuickly = (abs (mx - mouseX) + abs (my - mouseY) > 12);
|
||||
mouseX = mx;
|
||||
mouseY = my;
|
||||
|
||||
if (tipChanged || mouseWasClicked || mouseMovedQuickly)
|
||||
lastCompChangeTime = now;
|
||||
|
||||
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 == 0 || mouseWasClicked || newTip.isEmpty())
|
||||
{
|
||||
if (isVisible())
|
||||
{
|
||||
lastHideTime = now;
|
||||
hide();
|
||||
}
|
||||
}
|
||||
else if (tipChanged)
|
||||
{
|
||||
showFor (newComp, 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 + millisecondsBeforeTipAppears)
|
||||
{
|
||||
showFor (newComp, newTip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue