DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit b4ec56fb2a255873b021cf7b3ce175aa31fba9b8
parent a14e2233bbf9019ddc62b992226c0d9eda61cb5d
Author: falkTX <falktx@gmail.com>
Date:   Tue,  4 Feb 2014 09:32:05 +0000

Implement ImageSlider::setStep

Diffstat:
Mdgl/ImageSlider.hpp | 5+++--
Mdgl/src/ImageKnob.cpp | 2+-
Mdgl/src/ImageSlider.cpp | 81++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mexamples/nekobi-ui_src/DistrhoUINekobi.cpp | 2+-
4 files changed, 50 insertions(+), 40 deletions(-)

diff --git a/dgl/ImageSlider.hpp b/dgl/ImageSlider.hpp @@ -48,8 +48,8 @@ public: void setEndPos(int x, int y); void setRange(float min, float max); + void setStep(float step); void setValue(float value, bool sendCallback = false); - void setIsSwitch(bool yesNo); void setCallback(Callback* callback); @@ -62,9 +62,10 @@ private: Image fImage; float fMinimum; float fMaximum; + float fStep; float fValue; + float fValueTmp; - bool fIsSwitch; bool fDragging; int fStartedX; int fStartedY; diff --git a/dgl/src/ImageKnob.cpp b/dgl/src/ImageKnob.cpp @@ -303,7 +303,7 @@ bool ImageKnob::onMotion(int x, int y) if (int movX = x - fLastX) { d = (getModifiers() & MODIFIER_SHIFT) ? 2000.0f : 200.0f; - value = fValue + (float(fMaximum - fMinimum) / d * float(movX)); + value = fValueTmp + (float(fMaximum - fMinimum) / d * float(movX)); doVal = true; } } diff --git a/dgl/src/ImageSlider.cpp b/dgl/src/ImageSlider.cpp @@ -16,6 +16,8 @@ #include "../ImageSlider.hpp" +#include <cmath> + START_NAMESPACE_DGL // ----------------------------------------------------------------------- @@ -25,8 +27,9 @@ ImageSlider::ImageSlider(Window& parent, const Image& image) fImage(image), fMinimum(0.0f), fMaximum(1.0f), + fStep(0.0f), fValue(0.5f), - fIsSwitch(false), + fValueTmp(fValue), fDragging(false), fStartedX(0), fStartedY(0), @@ -40,8 +43,9 @@ ImageSlider::ImageSlider(Widget* widget, const Image& image) fImage(image), fMinimum(0.0f), fMaximum(1.0f), + fStep(0.0f), fValue(0.5f), - fIsSwitch(false), + fValueTmp(fValue), fDragging(false), fStartedX(0), fStartedY(0), @@ -55,8 +59,9 @@ ImageSlider::ImageSlider(const ImageSlider& imageSlider) fImage(imageSlider.fImage), fMinimum(imageSlider.fMinimum), fMaximum(imageSlider.fMaximum), + fStep(imageSlider.fStep), fValue(imageSlider.fValue), - fIsSwitch(imageSlider.fIsSwitch), + fValueTmp(fValue), fDragging(false), fStartedX(0), fStartedY(0), @@ -118,27 +123,27 @@ void ImageSlider::setRange(float min, float max) fMaximum = max; } +void ImageSlider::setStep(float step) +{ + fStep = step; +} + void ImageSlider::setValue(float value, bool sendCallback) { if (fValue == value) return; fValue = value; + + if (fStep == 0.0f) + fValueTmp = value; + repaint(); if (sendCallback && fCallback != nullptr) fCallback->imageSliderValueChanged(this, fValue); } -void ImageSlider::setIsSwitch(bool yesNo) -{ - if (fIsSwitch == yesNo) - return; - - fIsSwitch = yesNo; - repaint(); -} - void ImageSlider::setCallback(Callback* callback) { fCallback = callback; @@ -198,21 +203,23 @@ bool ImageSlider::onMouse(int button, bool press, int x, int y) float value; - if (fIsSwitch) + value = fMaximum - vper * (fMaximum - fMinimum); + + if (value < fMinimum) { - if (vper < 0.5f) - value = fMaximum; - else - value = fMinimum; + value = fMinimum; + fValueTmp = value; } - else + else if (value > fMaximum) { - value = fMaximum - vper * (fMaximum - fMinimum); - - if (value < fMinimum) - value = fMinimum; - else if (value > fMaximum) - value = fMaximum; + value = fMaximum; + fValueTmp = value; + } + else if (fStep != 0.0f) + { + fValueTmp = value; + const float rest = std::fmod(value, fStep); + value = value - rest + (rest > fStep/2.0f ? fStep : 0.0f); } fDragging = true; @@ -262,21 +269,23 @@ bool ImageSlider::onMotion(int x, int y) float value; - if (fIsSwitch) + value = fMaximum - vper * (fMaximum - fMinimum); + + if (value < fMinimum) { - if (vper < 0.5f) - value = fMaximum; - else - value = fMinimum; + value = fMinimum; + fValueTmp = value; } - else + else if (value > fMaximum) { - value = fMaximum - vper * (fMaximum - fMinimum); - - if (value < fMinimum) - value = fMinimum; - else if (value > fMaximum) - value = fMaximum; + value = fMaximum; + fValueTmp = value; + } + else if (fStep != 0.0f) + { + fValueTmp = value; + const float rest = std::fmod(value, fStep); + value = value - rest + (rest > fStep/2.0f ? fStep : 0.0f); } setValue(value, true); diff --git a/examples/nekobi-ui_src/DistrhoUINekobi.cpp b/examples/nekobi-ui_src/DistrhoUINekobi.cpp @@ -41,7 +41,7 @@ DistrhoUINekobi::DistrhoUINekobi(DGL::Window& parent) fSliderWaveform->setEndPos(133, 60); fSliderWaveform->setRange(0.0f, 1.0f); fSliderWaveform->setValue(0.0f); - fSliderWaveform->setIsSwitch(true); + fSliderWaveform->setStep(1.0f); // knobs Image knobImage(DistrhoArtworkNekobi::knobData, DistrhoArtworkNekobi::knobWidth, DistrhoArtworkNekobi::knobHeight);