gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 8bd1093698cf4fcd4f2198e1357ff64d38f1f091
parent 6e05377736dd809a7ff3975c1f9023ca15ab1dfe
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Thu, 26 May 2022 03:57:56 +0200

add support for vertical & horizontal sliders

Diffstat:
Msource/juceUiLib/rotaryStyle.cpp | 47+++++++++++++++++++++++++++++++++++++++++++++++
Msource/juceUiLib/rotaryStyle.h | 15+++++++++++++++
Msource/juceUiLib/uiObject.cpp | 20++++++++++++++++++--
3 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/source/juceUiLib/rotaryStyle.cpp b/source/juceUiLib/rotaryStyle.cpp @@ -1,7 +1,25 @@ #include "rotaryStyle.h" +#include "uiObject.h" + namespace genericUI { + void RotaryStyle::apply(Editor& _editor, const UiObject& _object) + { + UiObjectStyle::apply(_editor, _object); + + const auto style = _object.getProperty("style", "Rotary"); + + if(style == "LinearHorizontal") + m_style = Style::LinearHorizontal; + else if(style == "LinearVertical") + m_style = Style::LinearVertical; + else if(style == "Rotary") + m_style = Style::Rotary; + else + throw std::runtime_error("Unknown slider style type " + style); + } + void RotaryStyle::drawRotarySlider(juce::Graphics& _graphics, int x, int y, int width, int height, float sliderPosProportional, float rotaryStartAngle, float rotaryEndAngle, juce::Slider& _slider) { if(!m_drawable || !m_tileSizeX || !m_tileSizeY) @@ -20,4 +38,33 @@ namespace genericUI m_drawable->drawAt(_graphics, static_cast<float>(x), static_cast<float>(y), 1.0f); } + + void RotaryStyle::drawLinearSlider(juce::Graphics& _graphics, int x, int y, int width, int height, float sliderPos, float minSliderPos, float maxSliderPos, const juce::Slider::SliderStyle _sliderStyle, juce::Slider& _slider) + { + if (!m_drawable || !_slider.isEnabled()) + return; + + if (_sliderStyle == juce::Slider::LinearHorizontal) + { + const auto pos = sliderPos - static_cast<float>(m_drawable->getWidth()) * 0.5f; + m_drawable->drawAt(_graphics, pos, static_cast<float>(y), 1.0f); + } + else if (_sliderStyle == juce::Slider::LinearVertical) + { + const auto pos = sliderPos - static_cast<float>(m_drawable->getHeight()) * 0.5f; + m_drawable->drawAt(_graphics, static_cast<float>(x), pos, 1.0f); + } + } + + int RotaryStyle::getSliderThumbRadius(juce::Slider& _slider) + { + if(!m_drawable) + return UiObjectStyle::getSliderThumbRadius(_slider); + if(_slider.getSliderStyle() == juce::Slider::LinearHorizontal) + return m_drawable->getWidth() >> 1; + if(_slider.getSliderStyle() == juce::Slider::LinearVertical) + return m_drawable->getHeight() >> 1; + + return UiObjectStyle::getSliderThumbRadius(_slider); + } } diff --git a/source/juceUiLib/rotaryStyle.h b/source/juceUiLib/rotaryStyle.h @@ -9,9 +9,24 @@ namespace genericUI class RotaryStyle : public UiObjectStyle { public: + enum class Style + { + Rotary, + LinearVertical, + LinearHorizontal + }; + explicit RotaryStyle(Editor& _editor) : UiObjectStyle(_editor) {} + void apply(Editor& _editor, const UiObject& _object) override; + + Style getStyle() const { return m_style; } + private: void drawRotarySlider(juce::Graphics&, int x, int y, int width, int height, float sliderPosProportional, float rotaryStartAngle, float rotaryEndAngle, juce::Slider&) override; + void drawLinearSlider(juce::Graphics&, int x, int y, int width, int height, float sliderPos, float minSliderPos, float maxSliderPos, const juce::Slider::SliderStyle, juce::Slider&) override; + int getSliderThumbRadius(juce::Slider&) override; + + Style m_style = Style::Rotary; }; } diff --git a/source/juceUiLib/uiObject.cpp b/source/juceUiLib/uiObject.cpp @@ -84,12 +84,28 @@ namespace genericUI void UiObject::apply(Editor& _editor, juce::Slider& _target) { - _target.setSliderStyle(juce::Slider::RotaryHorizontalVerticalDrag); _target.setTextBoxStyle(juce::Slider::NoTextBox, false, 0, 0); apply(_editor, static_cast<juce::Component&>(_target)); - createStyle(_editor, _target, new RotaryStyle(_editor)); + auto* const s = new RotaryStyle(_editor); + + createStyle(_editor, _target, s); + + const auto sliderStyle = s->getStyle(); + + switch (sliderStyle) + { + case RotaryStyle::Style::Rotary: + _target.setSliderStyle(juce::Slider::RotaryHorizontalVerticalDrag); + break; + case RotaryStyle::Style::LinearVertical: + _target.setSliderStyle(juce::Slider::LinearVertical); + break; + case RotaryStyle::Style::LinearHorizontal: + _target.setSliderStyle(juce::Slider::LinearHorizontal); + break; + } bindParameter(_editor, _target); }