1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-07 04:10:08 +00:00
JUCE/src/gui/components/mouse/juce_MouseHoverDetector.cpp

151 lines
4.2 KiB
C++

/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
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.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#include "../../../core/juce_StandardHeader.h"
BEGIN_JUCE_NAMESPACE
#include "../juce_Component.h"
#include "juce_MouseHoverDetector.h"
#include "juce_MouseEvent.h"
//==============================================================================
MouseHoverDetector::MouseHoverDetector (const int hoverTimeMillisecs_)
: source (0),
hoverTimeMillisecs (hoverTimeMillisecs_),
hasJustHovered (false)
{
internalTimer.owner = this;
}
MouseHoverDetector::~MouseHoverDetector()
{
setHoverComponent (0);
}
void MouseHoverDetector::setHoverTimeMillisecs (const int newTimeInMillisecs)
{
hoverTimeMillisecs = newTimeInMillisecs;
}
void MouseHoverDetector::setHoverComponent (Component* const newSourceComponent)
{
if (source != newSourceComponent)
{
internalTimer.stopTimer();
hasJustHovered = false;
if (source != 0)
{
// ! you need to delete the hover detector before deleting its component
jassert (source->isValidComponent());
source->removeMouseListener (&internalTimer);
}
source = newSourceComponent;
if (newSourceComponent != 0)
newSourceComponent->addMouseListener (&internalTimer, false);
}
}
void MouseHoverDetector::hoverTimerCallback()
{
internalTimer.stopTimer();
if (source != 0)
{
const Point<int> pos (source->getMouseXYRelative());
if (source->reallyContains (pos.getX(), pos.getY(), false))
{
hasJustHovered = true;
mouseHovered (pos.getX(), pos.getY());
}
}
}
void MouseHoverDetector::checkJustHoveredCallback()
{
if (hasJustHovered)
{
hasJustHovered = false;
mouseMovedAfterHover();
}
}
//==============================================================================
void MouseHoverDetector::HoverDetectorInternal::timerCallback()
{
owner->hoverTimerCallback();
}
void MouseHoverDetector::HoverDetectorInternal::mouseEnter (const MouseEvent&)
{
stopTimer();
owner->checkJustHoveredCallback();
}
void MouseHoverDetector::HoverDetectorInternal::mouseExit (const MouseEvent&)
{
stopTimer();
owner->checkJustHoveredCallback();
}
void MouseHoverDetector::HoverDetectorInternal::mouseDown (const MouseEvent&)
{
stopTimer();
owner->checkJustHoveredCallback();
}
void MouseHoverDetector::HoverDetectorInternal::mouseUp (const MouseEvent&)
{
stopTimer();
owner->checkJustHoveredCallback();
}
void MouseHoverDetector::HoverDetectorInternal::mouseMove (const MouseEvent& e)
{
if (lastX != e.x || lastY != e.y) // to avoid fake mouse-moves setting it off
{
lastX = e.x;
lastY = e.y;
if (owner->source != 0)
startTimer (owner->hoverTimeMillisecs);
owner->checkJustHoveredCallback();
}
}
void MouseHoverDetector::HoverDetectorInternal::mouseWheelMove (const MouseEvent&, float, float)
{
stopTimer();
owner->checkJustHoveredCallback();
}
END_JUCE_NAMESPACE