From 2b27a7ab1e80e91a23d7ca981e23ffa3ecd17f30 Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sun, 1 May 2016 18:04:38 +1000 Subject: [PATCH] Add ability to set scrolling step on knobs, does not apply to drag - Fine tuning with CTRL-scroll is 1/10 of the scroll step set - Set the major scroll step with setScrollStep() Signed-off-by: Damien Zammit --- dgl/ImageWidgets.hpp | 2 ++ dgl/src/ImageWidgets.cpp | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/dgl/ImageWidgets.hpp b/dgl/ImageWidgets.hpp index aafe1962..3bad8a84 100644 --- a/dgl/ImageWidgets.hpp +++ b/dgl/ImageWidgets.hpp @@ -112,6 +112,7 @@ public: void setDefault(float def) noexcept; void setRange(float min, float max) noexcept; void setStep(float step) noexcept; + void setScrollStep(float step) noexcept; void setValue(float value, bool sendCallback = false) noexcept; void setUsingLogScale(bool yesNo) noexcept; @@ -131,6 +132,7 @@ private: Image fImage; float fMinimum; float fMaximum; + float fScrollStep; float fStep; float fValue; float fValueDef; diff --git a/dgl/src/ImageWidgets.cpp b/dgl/src/ImageWidgets.cpp index 9b4625c1..c77bf65a 100644 --- a/dgl/src/ImageWidgets.cpp +++ b/dgl/src/ImageWidgets.cpp @@ -195,6 +195,7 @@ ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation fImage(image), fMinimum(0.0f), fMaximum(1.0f), + fScrollStep(0.0f), fStep(0.0f), fValue(0.5f), fValueDef(fValue), @@ -223,6 +224,7 @@ ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation fImage(image), fMinimum(0.0f), fMaximum(1.0f), + fScrollStep(0.0f), fStep(0.0f), fValue(0.5f), fValueDef(fValue), @@ -251,6 +253,7 @@ ImageKnob::ImageKnob(const ImageKnob& imageKnob) fImage(imageKnob.fImage), fMinimum(imageKnob.fMinimum), fMaximum(imageKnob.fMaximum), + fScrollStep(imageKnob.fScrollStep), fStep(imageKnob.fStep), fValue(imageKnob.fValue), fValueDef(imageKnob.fValueDef), @@ -279,6 +282,7 @@ ImageKnob& ImageKnob::operator=(const ImageKnob& imageKnob) fImage = imageKnob.fImage; fMinimum = imageKnob.fMinimum; fMaximum = imageKnob.fMaximum; + fScrollStep = imageKnob.fScrollStep; fStep = imageKnob.fStep; fValue = imageKnob.fValue; fValueDef = imageKnob.fValueDef; @@ -363,6 +367,11 @@ void ImageKnob::setRange(float min, float max) noexcept fMaximum = max; } +void ImageKnob::setScrollStep(float step) noexcept +{ + fScrollStep = step; +} + void ImageKnob::setStep(float step) noexcept { fStep = step; @@ -599,8 +608,16 @@ bool ImageKnob::onScroll(const ScrollEvent& ev) if (! contains(ev.pos)) return false; - const float d = (ev.mod & kModifierControl) ? 2000.0f : 200.0f; - float value = (fUsingLog ? _invlogscale(fValueTmp) : fValueTmp) + (float(fMaximum - fMinimum) / d * 10.f * ev.delta.getY()); + float value, d; + + if (d_isZero(fScrollStep)) { + d = (ev.mod & kModifierControl) ? 2000.0f : 200.0f; + value = (fUsingLog ? _invlogscale(fValueTmp) : fValueTmp) + (float(fMaximum - fMinimum) / d * 10.f * ev.delta.getY()); + } else { + d = (ev.mod & kModifierControl) ? fScrollStep * 0.1f : fScrollStep; + value = (fUsingLog ? _invlogscale(fValueTmp + d * ev.delta.getY()) + : fValueTmp + d * ev.delta.getY()); + } if (fUsingLog) value = _logscale(value);