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:
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);
}