1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Added MouseInputSource::isUnboundedMouseMovementEnabled(). Tweaks to mouse cursor snap-back in Sliders.

This commit is contained in:
jules 2013-09-09 12:29:06 +01:00
parent 40c896ac64
commit 7bf1da5e17
7 changed files with 59 additions and 60 deletions

View file

@ -210,17 +210,15 @@ static SleepEvent sleepEvent;
void JUCE_CALLTYPE Thread::sleep (const int millisecs)
{
jassert (millisecs >= 0);
if (millisecs >= 10 || sleepEvent.handle == 0)
{
Sleep ((DWORD) millisecs);
}
else
{
// unlike Sleep() this is guaranteed to return to the current thread after
// the time expires, so we'll use this for short waits, which are more likely
// to need to be accurate
WaitForSingleObject (sleepEvent.handle, (DWORD) millisecs);
}
}
void Thread::yield()
@ -231,7 +229,7 @@ void Thread::yield()
//==============================================================================
static int lastProcessPriority = -1;
// called by WindowDriver because Windows does weird things to process priority
// called when the app gains focus because Windows does weird things to process priority
// when you swap apps, and this forces an update when the app is brought to the front.
void juce_repeatLastProcessPriority()
{

View file

@ -59,18 +59,15 @@ public:
ReadWriteLock() noexcept;
/** Destructor.
If the object is deleted whilst locked, any subsequent behaviour
is unpredictable.
If the object is deleted whilst locked, any subsequent behaviour is undefined.
*/
~ReadWriteLock() noexcept;
//==============================================================================
/** Locks this object for reading.
Multiple threads can simulaneously lock the object for reading, but if another
thread has it locked for writing, then this will block until it releases the
lock.
Multiple threads can simultaneously lock the object for reading, but if another
thread has it locked for writing, then this will block until it releases the lock.
@see exitRead, ScopedReadLock
*/
@ -78,7 +75,7 @@ public:
/** Tries to lock this object for reading.
Multiple threads can simulaneously lock the object for reading, but if another
Multiple threads can simultaneously lock the object for reading, but if another
thread has it locked for writing, then this will fail and return false.
@returns true if the lock is successfully gained.

View file

@ -177,7 +177,7 @@ public:
ModifierKeys withFlags (int rawFlagsToSet) const noexcept { return ModifierKeys (flags | rawFlagsToSet); }
/** Tests a combination of flags and returns true if any of them are set. */
bool testFlags (const int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; }
bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; }
/** Returns the total number of mouse buttons that are down. */
int getNumMouseButtonsDown() const noexcept;

View file

@ -49,7 +49,7 @@ void ComponentDragger::dragComponent (Component* const componentToDrag, const Mo
// so their coordinates become wrong after the first one moves the window, so in that case, we'll use
// the current mouse position instead of the one that the event contains...
if (componentToDrag->isOnDesktop())
bounds += componentToDrag->getMouseXYRelative() - mouseDownWithinTarget;
bounds += componentToDrag->getLocalPoint (nullptr, e.source.getScreenPosition()) - mouseDownWithinTarget;
else
bounds += e.getEventRelativeTo (componentToDrag).getPosition() - mouseDownWithinTarget;

View file

@ -27,8 +27,9 @@ class MouseInputSourceInternal : private AsyncUpdater
public:
//==============================================================================
MouseInputSourceInternal (const int i, const bool isMouse)
: index (i), isMouseDevice (isMouse), lastPeer (nullptr),
isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), currentCursorHandle (nullptr),
: index (i), isMouseDevice (isMouse),
isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false),
lastPeer (nullptr), currentCursorHandle (nullptr),
mouseEventCounter (0), mouseMovedSignificantlySincePressed (false)
{
}
@ -463,12 +464,13 @@ public:
Point<int> lastScreenPos;
ModifierKeys buttonState;
Point<int> unboundedMouseOffset;
bool isUnboundedMouseModeOn, isCursorVisibleUntilOffscreen;
private:
WeakReference<Component> componentUnderMouse;
ComponentPeer* lastPeer;
Point<int> unboundedMouseOffset;
bool isUnboundedMouseModeOn, isCursorVisibleUntilOffscreen;
void* currentCursorHandle;
int mouseEventCounter;
@ -550,6 +552,7 @@ bool MouseInputSource::hasMouseMovedSignificantlySincePressed() const noexcept
bool MouseInputSource::canDoUnboundedMovement() const noexcept { return isMouse(); }
void MouseInputSource::enableUnboundedMouseMovement (bool isEnabled, bool keepCursorVisibleUntilOffscreen) const
{ pimpl->enableUnboundedMouseMovement (isEnabled, keepCursorVisibleUntilOffscreen); }
bool MouseInputSource::isUnboundedMouseMovementEnabled() const { return pimpl->isUnboundedMouseModeOn; }
bool MouseInputSource::hasMouseCursor() const noexcept { return isMouse(); }
void MouseInputSource::showMouseCursor (const MouseCursor& cursor) { pimpl->showMouseCursor (cursor, false); }
void MouseInputSource::hideCursor() { pimpl->hideCursor(); }

View file

@ -158,6 +158,9 @@ public:
*/
void enableUnboundedMouseMovement (bool isEnabled, bool keepCursorVisibleUntilOffscreen = false) const;
/** Returns true if this source is currently in "unbounded" mode. */
bool isUnboundedMouseMovementEnabled() const;
/** Attempts to set this mouse pointer's screen position. */
void setScreenPosition (Point<int> newPosition);

View file

@ -818,13 +818,11 @@ public:
valueWhenLastDragged = owner.proportionOfLengthToValue (jlimit (0.0, 1.0, currentPos + speed));
e.source.enableUnboundedMouseMovement (true, false);
mouseWasHidden = true;
}
}
void mouseDown (const MouseEvent& e)
{
mouseWasHidden = false;
incDecDragged = false;
useDragEvents = false;
mouseDragStartPos = mousePosWhenLastDragged = e.getPosition();
@ -880,9 +878,9 @@ public:
void mouseDrag (const MouseEvent& e)
{
if (useDragEvents
&& maximum > minimum
&& ! ((style == LinearBar || style == LinearBarVertical) && e.mouseWasClicked() && valueBox != nullptr && valueBox->isEditable()))
if (useDragEvents && maximum > minimum
&& ! ((style == LinearBar || style == LinearBarVertical)
&& e.mouseWasClicked() && valueBox != nullptr && valueBox->isEditable()))
{
if (style == Rotary)
{
@ -899,10 +897,7 @@ public:
mouseDragStartPos = e.getPosition();
}
if (isVelocityBased == (userKeyOverridesVelocity && e.mods.testFlags (ModifierKeys::ctrlModifier
| ModifierKeys::commandModifier
| ModifierKeys::altModifier))
|| (maximum - minimum) / sliderRegionSize < interval)
if (isAbsoluteDragMode (e.mods) || (maximum - minimum) / sliderRegionSize < interval)
handleAbsoluteDrag (e);
else
handleVelocityDrag (e);
@ -1019,50 +1014,54 @@ public:
void modifierKeysChanged (const ModifierKeys& modifiers)
{
if (style != IncDecButtons
&& style != Rotary
&& isVelocityBased == modifiers.isAnyModifierKeyDown())
{
if (style != IncDecButtons && style != Rotary && isAbsoluteDragMode (modifiers))
restoreMouseIfHidden();
}
}
bool isAbsoluteDragMode (ModifierKeys mods) const
{
return isVelocityBased == (userKeyOverridesVelocity
&& mods.testFlags (ModifierKeys::ctrlAltCommandModifiers));
}
void restoreMouseIfHidden()
{
if (mouseWasHidden)
const Array<MouseInputSource>& mouseSources = Desktop::getInstance().getMouseSources();
for (MouseInputSource* mi = mouseSources.begin(), * const e = mouseSources.end(); mi != e; ++mi)
{
mouseWasHidden = false;
const Array<MouseInputSource>& mouseSources = Desktop::getInstance().getMouseSources();
for (MouseInputSource* mi = mouseSources.begin(), * const e = mouseSources.end(); mi != e; ++mi)
if (mi->isUnboundedMouseMovementEnabled())
{
mi->enableUnboundedMouseMovement (false);
const double pos = sliderBeingDragged == 2 ? getMaxValue()
: (sliderBeingDragged == 1 ? getMinValue()
: (double) currentValue.getValue());
Point<int> mousePos;
const double pos = sliderBeingDragged == 2 ? getMaxValue()
: (sliderBeingDragged == 1 ? getMinValue()
: (double) currentValue.getValue());
Point<int> mousePos;
if (isRotary())
{
mousePos = Desktop::getLastMouseDownPosition();
if (isRotary())
{
mousePos = mi->getLastMouseDownPosition();
const int delta = roundToInt (pixelsForFullDragExtent * (owner.valueToProportionOfLength (valueOnMouseDown)
- owner.valueToProportionOfLength (pos)));
const int delta = roundToInt (pixelsForFullDragExtent * (owner.valueToProportionOfLength (valueOnMouseDown)
- owner.valueToProportionOfLength (pos)));
if (style == RotaryHorizontalDrag) mousePos += Point<int> (-delta, 0);
else if (style == RotaryVerticalDrag) mousePos += Point<int> (0, delta);
else mousePos += Point<int> (delta / -2, delta / 2);
if (style == RotaryHorizontalDrag) mousePos += Point<int> (-delta, 0);
else if (style == RotaryVerticalDrag) mousePos += Point<int> (0, delta);
else mousePos += Point<int> (delta / -2, delta / 2);
mousePos = owner.getScreenBounds().getConstrainedPoint (mousePos);
}
else
{
const int pixelPos = (int) getLinearSliderPos (pos);
mousePos = owner.localPointToGlobal (Point<int> (isHorizontal() ? pixelPos : (owner.getWidth() / 2),
isVertical() ? pixelPos : (owner.getHeight() / 2)));
}
mi->setScreenPosition (mousePos);
}
else
{
const int pixelPos = (int) getLinearSliderPos (pos);
mousePos = owner.localPointToGlobal (Point<int> (isHorizontal() ? pixelPos : (owner.getWidth() / 2),
isVertical() ? pixelPos : (owner.getHeight() / 2)));
}
Desktop::setMousePosition (mousePos);
}
}
@ -1254,7 +1253,6 @@ public:
bool popupDisplayEnabled;
bool menuEnabled;
bool useDragEvents;
bool mouseWasHidden;
bool incDecDragged;
bool scrollWheelEnabled;
bool snapsToMousePos;