Implement the styled knobs
This commit is contained in:
parent
bf0786ca63
commit
5ee5fa85f8
5 changed files with 138 additions and 7 deletions
|
|
@ -3,7 +3,7 @@ version 1.0305
|
||||||
header_name {.h}
|
header_name {.h}
|
||||||
code_name {.cxx}
|
code_name {.cxx}
|
||||||
widget_class mainView {open
|
widget_class mainView {open
|
||||||
xywh {572 266 800 475} type Double
|
xywh {576 416 800 475} type Double
|
||||||
class LogicalGroup visible
|
class LogicalGroup visible
|
||||||
} {
|
} {
|
||||||
Fl_Box {} {
|
Fl_Box {} {
|
||||||
|
|
@ -128,7 +128,7 @@ widget_class mainView {open
|
||||||
Fl_Dial volumeSlider_ {
|
Fl_Dial volumeSlider_ {
|
||||||
comment {tag=kTagSetVolume}
|
comment {tag=kTagSetVolume}
|
||||||
xywh {680 20 48 48} value 0.5
|
xywh {680 20 48 48} value 0.5
|
||||||
class Knob48
|
class StyledKnob
|
||||||
}
|
}
|
||||||
Fl_Box volumeLabel_ {
|
Fl_Box volumeLabel_ {
|
||||||
label {0.0 dB}
|
label {0.0 dB}
|
||||||
|
|
@ -216,12 +216,12 @@ widget_class mainView {open
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Fl_Group {subPanels_[kPanelSettings]} {open
|
Fl_Group {subPanels_[kPanelSettings]} {selected
|
||||||
xywh {5 109 790 286}
|
xywh {5 109 790 286}
|
||||||
class LogicalGroup
|
class LogicalGroup
|
||||||
} {
|
} {
|
||||||
Fl_Group {} {
|
Fl_Group {} {
|
||||||
label Engine open selected
|
label Engine open
|
||||||
xywh {260 135 280 100} box ROUNDED_BOX labelsize 12 align 17
|
xywh {260 135 280 100} box ROUNDED_BOX labelsize 12 align 17
|
||||||
class TitleGroup
|
class TitleGroup
|
||||||
} {
|
} {
|
||||||
|
|
@ -279,7 +279,7 @@ widget_class mainView {open
|
||||||
Fl_Dial stretchedTuningSlider_ {
|
Fl_Dial stretchedTuningSlider_ {
|
||||||
comment {tag=kTagSetStretchedTuning}
|
comment {tag=kTagSetStretchedTuning}
|
||||||
xywh {515 315 48 48} value 0.5
|
xywh {515 315 48 48} value 0.5
|
||||||
class Knob48
|
class StyledKnob
|
||||||
}
|
}
|
||||||
Fl_Box {} {
|
Fl_Box {} {
|
||||||
label Stretch
|
label Stretch
|
||||||
|
|
|
||||||
|
|
@ -335,6 +335,9 @@ void Editor::Impl::createFrameContents()
|
||||||
CColor iconHighlight;
|
CColor iconHighlight;
|
||||||
CColor valueText;
|
CColor valueText;
|
||||||
CColor valueBackground;
|
CColor valueBackground;
|
||||||
|
CColor knobActiveTrackColor;
|
||||||
|
CColor knobInactiveTrackColor;
|
||||||
|
CColor knobLineIndicatorColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
Theme lightTheme;
|
Theme lightTheme;
|
||||||
|
|
@ -346,6 +349,9 @@ void Editor::Impl::createFrameContents()
|
||||||
lightTheme.iconHighlight = { 0xa8, 0x62, 0x34 };
|
lightTheme.iconHighlight = { 0xa8, 0x62, 0x34 };
|
||||||
lightTheme.valueText = { 0xff, 0xff, 0xff };
|
lightTheme.valueText = { 0xff, 0xff, 0xff };
|
||||||
lightTheme.valueBackground = { 0x2e, 0x34, 0x36 };
|
lightTheme.valueBackground = { 0x2e, 0x34, 0x36 };
|
||||||
|
lightTheme.knobActiveTrackColor = { 0x00, 0xb6, 0x2a };
|
||||||
|
lightTheme.knobInactiveTrackColor = { 0x30, 0x30, 0x30 };
|
||||||
|
lightTheme.knobLineIndicatorColor = { 0x00, 0x00, 0x00 };
|
||||||
Theme darkTheme;
|
Theme darkTheme;
|
||||||
darkTheme.boxBackground = { 0x2e, 0x34, 0x36 };
|
darkTheme.boxBackground = { 0x2e, 0x34, 0x36 };
|
||||||
darkTheme.text = { 0xff, 0xff, 0xff };
|
darkTheme.text = { 0xff, 0xff, 0xff };
|
||||||
|
|
@ -355,6 +361,9 @@ void Editor::Impl::createFrameContents()
|
||||||
darkTheme.iconHighlight = { 0xa8, 0x62, 0x34 };
|
darkTheme.iconHighlight = { 0xa8, 0x62, 0x34 };
|
||||||
darkTheme.valueText = { 0x2e, 0x34, 0x36 };
|
darkTheme.valueText = { 0x2e, 0x34, 0x36 };
|
||||||
darkTheme.valueBackground = { 0xff, 0xff, 0xff };
|
darkTheme.valueBackground = { 0xff, 0xff, 0xff };
|
||||||
|
darkTheme.knobActiveTrackColor = { 0x00, 0xb6, 0x2a };
|
||||||
|
darkTheme.knobInactiveTrackColor = { 0x60, 0x60, 0x60 };
|
||||||
|
darkTheme.knobLineIndicatorColor = { 0xff, 0xff, 0xff };
|
||||||
Theme& defaultTheme = lightTheme;
|
Theme& defaultTheme = lightTheme;
|
||||||
|
|
||||||
Theme* theme = &defaultTheme;
|
Theme* theme = &defaultTheme;
|
||||||
|
|
@ -367,6 +376,7 @@ void Editor::Impl::createFrameContents()
|
||||||
typedef CTextLabel Label;
|
typedef CTextLabel Label;
|
||||||
typedef CViewContainer HLine;
|
typedef CViewContainer HLine;
|
||||||
typedef CAnimKnob Knob48;
|
typedef CAnimKnob Knob48;
|
||||||
|
typedef SStyledKnob StyledKnob;
|
||||||
typedef CTextLabel ValueLabel;
|
typedef CTextLabel ValueLabel;
|
||||||
typedef CViewContainer VMeter;
|
typedef CViewContainer VMeter;
|
||||||
typedef SValueMenu ValueMenu;
|
typedef SValueMenu ValueMenu;
|
||||||
|
|
@ -426,6 +436,13 @@ void Editor::Impl::createFrameContents()
|
||||||
auto createKnob48 = [this, &knob48](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int) {
|
auto createKnob48 = [this, &knob48](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int) {
|
||||||
return new CAnimKnob(bounds, this, tag, 31, 48, knob48);
|
return new CAnimKnob(bounds, this, tag, 31, 48, knob48);
|
||||||
};
|
};
|
||||||
|
auto createStyledKnob = [this, &theme](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int) {
|
||||||
|
SStyledKnob* knob = new SStyledKnob(bounds, this, tag);
|
||||||
|
knob->setActiveTrackColor(theme->knobActiveTrackColor);
|
||||||
|
knob->setInactiveTrackColor(theme->knobInactiveTrackColor);
|
||||||
|
knob->setLineIndicatorColor(theme->knobLineIndicatorColor);
|
||||||
|
return knob;
|
||||||
|
};
|
||||||
auto createValueLabel = [&theme](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) {
|
auto createValueLabel = [&theme](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) {
|
||||||
CTextLabel* lbl = new CTextLabel(bounds, label);
|
CTextLabel* lbl = new CTextLabel(bounds, label);
|
||||||
lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00));
|
lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00));
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
||||||
|
|
||||||
#include "GUIComponents.h"
|
#include "GUIComponents.h"
|
||||||
|
#include <complex>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include "utility/vstgui_before.h"
|
#include "utility/vstgui_before.h"
|
||||||
|
|
@ -428,6 +429,7 @@ void SValueMenu::onItemClicked(int32_t index)
|
||||||
valueChanged();
|
valueChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
void STextButton::setHoverColor (const CColor& color)
|
void STextButton::setHoverColor (const CColor& color)
|
||||||
{
|
{
|
||||||
hoverColor_ = color;
|
hoverColor_ = color;
|
||||||
|
|
@ -458,3 +460,93 @@ CMouseEventResult STextButton::onMouseExited (CPoint& where, const CButtonState&
|
||||||
setDirty();
|
setDirty();
|
||||||
return CTextButton::onMouseExited(where, buttons);
|
return CTextButton::onMouseExited(where, buttons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
SStyledKnob::SStyledKnob(const CRect& size, IControlListener* listener, int32_t tag)
|
||||||
|
: CKnobBase(size, listener, tag, nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SStyledKnob::setActiveTrackColor(const CColor& color)
|
||||||
|
{
|
||||||
|
if (activeTrackColor_ == color)
|
||||||
|
return;
|
||||||
|
activeTrackColor_ = color;
|
||||||
|
setDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SStyledKnob::setInactiveTrackColor(const CColor& color)
|
||||||
|
{
|
||||||
|
if (inactiveTrackColor_ == color)
|
||||||
|
return;
|
||||||
|
inactiveTrackColor_ = color;
|
||||||
|
setDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SStyledKnob::setLineIndicatorColor(const CColor& color)
|
||||||
|
{
|
||||||
|
if (lineIndicatorColor_ == color)
|
||||||
|
return;
|
||||||
|
lineIndicatorColor_ = color;
|
||||||
|
setDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SStyledKnob::draw(CDrawContext* dc)
|
||||||
|
{
|
||||||
|
const CCoord lineWidth = 4.0;
|
||||||
|
const CCoord indicatorLineLength = 10.0;
|
||||||
|
const CCoord angleSpread = 250.0;
|
||||||
|
const CCoord angle1 = 270.0 - 0.5 * angleSpread;
|
||||||
|
const CCoord angle2 = 270.0 + 0.5 * angleSpread;
|
||||||
|
|
||||||
|
dc->setDrawMode(kAntiAliasing);
|
||||||
|
|
||||||
|
const CRect bounds = getViewSize();
|
||||||
|
|
||||||
|
// compute inner bounds
|
||||||
|
CRect rect(bounds);
|
||||||
|
rect.setWidth(std::min(rect.getWidth(), rect.getHeight()));
|
||||||
|
rect.setHeight(rect.getWidth());
|
||||||
|
rect.centerInside(bounds);
|
||||||
|
rect.extend(-lineWidth, -lineWidth);
|
||||||
|
|
||||||
|
SharedPointer<CGraphicsPath> path;
|
||||||
|
|
||||||
|
// inactive track
|
||||||
|
path = owned(dc->createGraphicsPath());
|
||||||
|
path->addArc(rect, angle1, angle2, true);
|
||||||
|
|
||||||
|
dc->setFrameColor(inactiveTrackColor_);
|
||||||
|
dc->setLineWidth(lineWidth);
|
||||||
|
dc->setLineStyle(kLineSolid);
|
||||||
|
dc->drawGraphicsPath(path, CDrawContext::kPathStroked);
|
||||||
|
|
||||||
|
// active track
|
||||||
|
const CCoord v = getValueNormalized();
|
||||||
|
const CCoord vAngle = angle1 + v * angleSpread;
|
||||||
|
path = owned(dc->createGraphicsPath());
|
||||||
|
path->addArc(rect, angle1, vAngle, true);
|
||||||
|
|
||||||
|
dc->setFrameColor(activeTrackColor_);
|
||||||
|
dc->setLineWidth(lineWidth + 0.5);
|
||||||
|
dc->setLineStyle(kLineSolid);
|
||||||
|
dc->drawGraphicsPath(path, CDrawContext::kPathStroked);
|
||||||
|
|
||||||
|
// indicator line
|
||||||
|
{
|
||||||
|
CCoord module1 = 0.5 * rect.getWidth() - indicatorLineLength;
|
||||||
|
CCoord module2 = 0.5 * rect.getWidth();
|
||||||
|
std::complex<CCoord> c1 = std::polar(module1, vAngle * (M_PI / 180.0));
|
||||||
|
std::complex<CCoord> c2 = std::polar(module2, vAngle * (M_PI / 180.0));
|
||||||
|
|
||||||
|
CPoint p1(c1.real(), c1.imag());
|
||||||
|
CPoint p2(c2.real(), c2.imag());
|
||||||
|
p1.offset(rect.getCenter());
|
||||||
|
p2.offset(rect.getCenter());
|
||||||
|
|
||||||
|
dc->setFrameColor(lineIndicatorColor_);
|
||||||
|
dc->setLineWidth(1.0);
|
||||||
|
dc->setLineStyle(kLineSolid);
|
||||||
|
dc->drawLine(p1, p2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -162,3 +162,25 @@ private:
|
||||||
CColor hoverColor_;
|
CColor hoverColor_;
|
||||||
bool hovered { false };
|
bool hovered { false };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
class SStyledKnob : public CKnobBase {
|
||||||
|
public:
|
||||||
|
SStyledKnob(const CRect& size, IControlListener* listener, int32_t tag);
|
||||||
|
|
||||||
|
const CColor& getActiveTrackColor() const { return activeTrackColor_; }
|
||||||
|
void setActiveTrackColor(const CColor& color);
|
||||||
|
const CColor& getInactiveTrackColor() const { return inactiveTrackColor_; }
|
||||||
|
void setInactiveTrackColor(const CColor& color);
|
||||||
|
const CColor& getLineIndicatorColor() const { return lineIndicatorColor_; }
|
||||||
|
void setLineIndicatorColor(const CColor& color);
|
||||||
|
|
||||||
|
CLASS_METHODS(SStyledKnob, CKnobBase)
|
||||||
|
protected:
|
||||||
|
void draw(CDrawContext* dc) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CColor activeTrackColor_;
|
||||||
|
CColor inactiveTrackColor_;
|
||||||
|
CColor lineIndicatorColor_;
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ view__24->setVisible(false);
|
||||||
ValueLabel* const view__25 = createValueLabel(CRect(40, 65, 100, 70), -1, "Center", kCenterText, 12);
|
ValueLabel* const view__25 = createValueLabel(CRect(40, 65, 100, 70), -1, "Center", kCenterText, 12);
|
||||||
view__23->addView(view__25);
|
view__23->addView(view__25);
|
||||||
view__25->setVisible(false);
|
view__25->setVisible(false);
|
||||||
Knob48* const view__26 = createKnob48(CRect(110, 15, 158, 63), kTagSetVolume, "", kCenterText, 14);
|
StyledKnob* const view__26 = createStyledKnob(CRect(110, 15, 158, 63), kTagSetVolume, "", kCenterText, 14);
|
||||||
volumeSlider_ = view__26;
|
volumeSlider_ = view__26;
|
||||||
view__23->addView(view__26);
|
view__23->addView(view__26);
|
||||||
ValueLabel* const view__27 = createValueLabel(CRect(105, 65, 165, 87), -1, "0.0 dB", kCenterText, 12);
|
ValueLabel* const view__27 = createValueLabel(CRect(105, 65, 165, 87), -1, "0.0 dB", kCenterText, 12);
|
||||||
|
|
@ -135,7 +135,7 @@ tuningFrequencySlider_ = view__54;
|
||||||
view__52->addView(view__54);
|
view__52->addView(view__54);
|
||||||
ValueLabel* const view__55 = createValueLabel(CRect(210, 20, 290, 45), -1, "Frequency", kCenterText, 12);
|
ValueLabel* const view__55 = createValueLabel(CRect(210, 20, 290, 45), -1, "Frequency", kCenterText, 12);
|
||||||
view__52->addView(view__55);
|
view__52->addView(view__55);
|
||||||
Knob48* const view__56 = createKnob48(CRect(310, 45, 358, 93), kTagSetStretchedTuning, "", kCenterText, 14);
|
StyledKnob* const view__56 = createStyledKnob(CRect(310, 45, 358, 93), kTagSetStretchedTuning, "", kCenterText, 14);
|
||||||
stretchedTuningSlider_ = view__56;
|
stretchedTuningSlider_ = view__56;
|
||||||
view__52->addView(view__56);
|
view__52->addView(view__56);
|
||||||
ValueLabel* const view__57 = createValueLabel(CRect(295, 20, 375, 45), -1, "Stretch", kCenterText, 12);
|
ValueLabel* const view__57 = createValueLabel(CRect(295, 20, 375, 45), -1, "Stretch", kCenterText, 12);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue