From 37d0e6c22deff4554b57c750b1c43021083c9495 Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 25 Sep 2007 09:02:24 +0000 Subject: [PATCH] --- .../gui/components/controls/juce_Slider.cpp | 31 +++++++++++++------ .../gui/components/controls/juce_Slider.h | 2 +- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/juce_appframework/gui/components/controls/juce_Slider.cpp b/src/juce_appframework/gui/components/controls/juce_Slider.cpp index 39ed12a645..611b827669 100644 --- a/src/juce_appframework/gui/components/controls/juce_Slider.cpp +++ b/src/juce_appframework/gui/components/controls/juce_Slider.cpp @@ -1011,6 +1011,8 @@ void Slider::mouseDown (const MouseEvent& e) } } + minMaxDiff = valueMax - valueMin; + mouseXWhenLastDragged = e.x; mouseYWhenLastDragged = e.y; lastAngle = rotaryStart + (rotaryEnd - rotaryStart) @@ -1086,13 +1088,14 @@ void Slider::restoreMouseIfHidden() c->enableUnboundedMouseMovement (false); - int x = getWidth() / 2; - int y = getHeight() / 2; + const double pos = (sliderBeingDragged == 2) ? getMaxValue() + : ((sliderBeingDragged == 1) ? getMinValue() + : currentValue); + + const int pixelPos = (int) getLinearSliderPos (pos); - if (isHorizontal()) - x = (int) getLinearSliderPos (currentValue); - else if (isVertical()) - y = (int) getLinearSliderPos (currentValue); + int x = isHorizontal() ? pixelPos : (getWidth() / 2); + int y = isVertical() ? pixelPos : (getHeight() / 2); relativePositionToGlobal (x, y); Desktop::setMousePosition (x, y); @@ -1185,7 +1188,7 @@ void Slider::mouseDrag (const MouseEvent& e) return; } - if (isVelocityBased == e.mods.isAnyModifierKeyDown() + if (isVelocityBased == (e.mods.testFlags (ModifierKeys::ctrlModifier | ModifierKeys::commandModifier | ModifierKeys::altModifier)) || ((maximum - minimum) / sliderRegionSize < interval)) { const int mousePos = (isHorizontal() || style == RotaryHorizontalDrag) ? e.x : e.y; @@ -1263,14 +1266,24 @@ void Slider::mouseDrag (const MouseEvent& e) else if (sliderBeingDragged == 1) { setMinValue (snapValue (valueWhenLastDragged, true), - ! sendChangeOnlyOnRelease, false); + ! sendChangeOnlyOnRelease, false); + + if (e.mods.isShiftDown()) + setMaxValue (getMinValue() + minMaxDiff, false); + else + minMaxDiff = valueMax - valueMin; } else { jassert (sliderBeingDragged == 2); setMaxValue (snapValue (valueWhenLastDragged, true), - ! sendChangeOnlyOnRelease, false); + ! sendChangeOnlyOnRelease, false); + + if (e.mods.isShiftDown()) + setMinValue (getMaxValue() - minMaxDiff, false); + else + minMaxDiff = valueMax - valueMin; } mouseXWhenLastDragged = e.x; diff --git a/src/juce_appframework/gui/components/controls/juce_Slider.h b/src/juce_appframework/gui/components/controls/juce_Slider.h index 3c51ed4f62..ee0ab56d6f 100644 --- a/src/juce_appframework/gui/components/controls/juce_Slider.h +++ b/src/juce_appframework/gui/components/controls/juce_Slider.h @@ -677,7 +677,7 @@ private: double currentValue, valueMin, valueMax; double minimum, maximum, interval, doubleClickReturnValue; double valueWhenLastDragged, valueOnMouseDown, skewFactor, lastAngle; - double velocityModeSensitivity, velocityModeOffset; + double velocityModeSensitivity, velocityModeOffset, minMaxDiff; int velocityModeThreshold; float rotaryStart, rotaryEnd; int numDecimalPlaces, mouseXWhenLastDragged, mouseYWhenLastDragged;