34 "Modulation Drag Drop",
45 "Label Background Height",
48 "Text Component Label Offset",
49 "Rotary Option X Offset",
50 "Rotary Option Y Offset",
51 "Rotary Option Width",
56 "Text Component Height",
57 "Text Component Offset",
58 "Text Component Font Size",
65 "Knob Mod Amount Arc Size",
66 "Knob Mod Amount Arc Thickness",
67 "Knob Mod Meter Arc Size",
68 "Knob Mod Meter Arc Thickness",
70 "Knob Section Height",
73 "Modulation Button Width",
74 "Modulation Font Size",
76 "Widget Rounded Corner",
82 "Wavetable Horizontal Angle",
83 "Wavetable Vertical Angle",
84 "Wavetable Draw Width",
85 "Wavetable Draw Height",
92 "Body Heading Background",
105 "Popup Selector Background",
109 "Text Component Background",
110 "Text Component Text",
113 "Rotary Arc Disabled",
114 "Rotary Arc Unselected",
115 "Rotary Arc Unselected Disabled",
118 "Rotary Body Border",
121 "Linear Slider Disabled",
122 "Linear Slider Unselected",
123 "Linear Slider Thumb",
124 "Linear Slider Thumb Disabled",
126 "Widget Center Line",
129 "Widget Primary Disabled",
130 "Widget Secondary 1",
131 "Widget Secondary 2",
132 "Widget Secondary Disabled",
138 "Modulation Meter Left",
139 "Modulation Meter Right",
140 "Modulation Meter Control",
141 "Modulation Button Selected",
142 "Modulation Button Dragging",
143 "Modulation Button Unselected",
145 "Icon Selector Icon",
148 "Icon Button Off Hover",
149 "Icon Button Off Pressed",
151 "Icon Button On Hover",
152 "Icon Button On Pressed",
159 "UI Action Button Hover",
160 "UI Action Button Press",
162 "Text Editor Background",
163 "Text Editor Border",
165 "Text Editor Selection"
178 if (default_skin.exists()) {
196 MemoryInputStream skin((
const void*)BinaryData::default_vitalskin, BinaryData::default_vitalskinSize,
false);
197 std::string skin_string = skin.readEntireStreamAsString().toStdString();
200 json data = json::parse(skin_string,
nullptr,
false);
203 catch (
const json::exception& e) {
211 component->setColour(color_id, color);
222 component->removeColour(i);
225 component->setColour(color.first, color.second);
229 std::map<ValueId, float> values;
245 if (section ==
kNone)
252 if (section ==
kNone)
271 if (section ==
kNone)
277 return Colours::black;
288 if (section ==
kNone)
295 if (section !=
kNone)
300 if (section ==
kNone)
307 if (section !=
kNone)
314 data[kColorNames[i]] =
colors_[i].toString().toStdString();
317 data[kValueNames[i]] =
values_[i];
321 json override_section;
324 override_section[kColorNames[index]] = color.second.toString().toStdString();
328 int index = value.first;
329 override_section[kValueNames[index]] = value.second;
332 overrides[kOverrideNames[override_index]] = override_section;
335 data[
"overrides"] = overrides;
336 data[
"synth_version"] = ProjectInfo::versionNumber;
351 if (data.count(
"synth_version"))
352 version = data[
"synth_version"];
354 if (version < 0x608) {
355 data[
"Knob Arc Size"] = data[
"Knob Size"];
356 data[
"Knob Arc Thickness"] = data[
"Knob Thickness"];
357 data[
"Knob Handle Length"] = data[
"Knob Handle Radial Amount"];
358 data[
"Knob Mod Amount Arc Size"] = data[
"Knob Mod Amount Size"];
359 data[
"Knob Mod Amount Arc Thickness"] = data[
"Knob Mod Amount Thickness"];
360 data[
"Knob Mod Meter Arc Size"] = data[
"Knob Mod Meter Size"];
361 data[
"Knob Mod Meter Arc Thickness"] = data[
"Knob Mod Meter Thickness"];
364 if (data.count(
"Widget Fill Boost") == 0)
365 data[
"Widget Fill Boost"] = 1.6f;
366 if (data.count(
"Widget Line Boost") == 0)
367 data[
"Widget Line Boost"] = 1.0f;
370 data[
"Modulation Meter"] = Colours::white.toString().toStdString();
379 if (data.count(
"overrides")) {
380 json overrides = data[
"overrides"];
382 std::string name = kOverrideNames[override_index];
386 if (overrides.count(name) == 0)
389 json override_section = overrides[name];
391 if (override_section.count(kColorNames[i])) {
394 std::string color_string = override_section[kColorNames[i]];
395 color_overrides_[override_index][color_id] = Colour::fromString(color_string);
400 if (override_section.count(kValueNames[i])) {
402 float value = override_section[kValueNames[i]];
410 if (data.count(kColorNames[i])) {
411 std::string color_string = data[kColorNames[i]];
412 colors_[i] = Colour::fromString(color_string);
417 if (data.count(kValueNames[i]))
418 values_[i] = data[kValueNames[i]];
426 json data = json::parse(skin_string.toStdString(),
nullptr,
false);
429 catch (
const json::exception& e) {
439class SkinColorPicker :
public Component,
public Button::Listener,
public Slider::Listener,
public ChangeListener {
472 value_sliders_[i]->setValue(value, NotificationType::dontSendNotification);
477 override_buttons_.push_back(std::make_unique<TextButton>(kOverrideNames[override_index]));
484 color_buttons_.push_back(std::make_unique<TextButton>(kColorNames[color_index]));
497 value_sliders_.push_back(std::make_unique<Slider>(kValueNames[value_index]));
514 g.fillCheckerBoard(getLocalBounds().toFloat(), 20.0f, 20.0f, Colours::grey, Colours::white);
516 g.setColour(Colour(0xff444444));
518 int text_x = 2 * getWidth() / 3;
522 g.setColour(Colours::white);
523 int width = getWidth() / 2;
525 g.drawText(kValueNames[i], text_x, y, width,
kButtonHeight, Justification::centredLeft);
535 float overrides_height = getHeight() - overrides_y;
536 float overrides_width = getWidth() / 3;
540 override_buttons_[i]->setBounds(0, override_y + overrides_y, overrides_width, override_height);
550 value_sliders_[i]->setTextBoxStyle(Slider::TextBoxLeft,
false, width / 2, slider_height);
561 container_->setBounds(getWidth() / 3, 0, 2 * getWidth() / 3 - 10, y);
562 viewport_.setBounds(getWidth() / 3, 0, 2 * getWidth() / 3, getHeight());
568 override_button->setButtonText(override_button->getName());
570 bool show_override = override_index !=
Skin::kNone;
603 Colour color =
color_buttons_[color_index]->findColour(TextButton::buttonColourId);
628 if (open_box.browseForFileToOpen()) {
630 AlertWindow::showNativeDialogBox(
"Error opening skin",
"Skin file is corrupted and won't load.",
false);
640 if (save_box.browseForFileToSave(
true))
670 ColourSelector* color_selector =
new ColourSelector();
671 color_selector->setCurrentColour(clicked_button->findColour(TextButton::buttonColourId));
672 color_selector->addChangeListener(
this);
673 color_selector->setColour(ColourSelector::backgroundColourId, Colours::transparentBlack);
674 color_selector->setSize(300, 400);
676 CallOutBox::launchAsynchronously(std::unique_ptr<Component>(color_selector), clicked_button->getScreenBounds(),
nullptr);
694 Colour text_color = color.contrasting(0.9f);
696 button->setColour(TextButton::buttonColourId, color);
697 button->setColour(TextButton::textColourOnId, text_color);
698 button->setColour(TextButton::textColourOffId, text_color);
702 ColourSelector* selector =
dynamic_cast<ColourSelector*
>(source);
703 if (selector ==
nullptr)
706 Colour color = selector->getCurrentColour();
733 DocumentWindow(
"Skin Designer", Colours::grey, DocumentWindow::closeButton){
734 container_ = std::make_unique<SkinColorPicker>(
"Container", skin, full_interface);
static DefaultLookAndFeel * instance()
Singleton instance accessor.
Definition default_look_and_feel.h:157
The main GUI container for the entire synthesizer interface.
Definition full_interface.h:61
void reloadSkin(const Skin &skin)
Reloads and applies a new skin, then adjusts layout accordingly.
Definition full_interface.cpp:276
static File getDefaultSkin()
Retrieves the file specifying the default skin.
Definition load_save.cpp:1168
void sliderValueChanged(Slider *changed_slider) override
Definition skin.cpp:679
void resized() override
Definition skin.cpp:530
TextButton load_button_
Definition skin.cpp:715
static constexpr int kButtonHeight
Definition skin.cpp:442
void toggleValueOverride(int value_index)
Definition skin.cpp:612
void addColor(int color_index)
Definition skin.cpp:483
void setSliderValues()
Definition skin.cpp:469
void toggleOverride(int color_index)
Definition skin.cpp:599
void addOverrideSection(int override_index)
Definition skin.cpp:476
FullInterface * full_interface_
Definition skin.cpp:727
std::vector< std::unique_ptr< TextButton > > color_buttons_
Definition skin.cpp:720
void repaintWithSettings()
Definition skin.cpp:689
TextButton save_button_
Definition skin.cpp:716
std::vector< std::unique_ptr< ToggleButton > > value_override_toggle_buttons_
Definition skin.cpp:719
Skin * skin_
Definition skin.cpp:726
Viewport viewport_
Definition skin.cpp:729
std::vector< std::unique_ptr< Label > > value_labels_
Definition skin.cpp:722
std::vector< std::unique_ptr< TextButton > > override_buttons_
Definition skin.cpp:717
void changeListenerCallback(ChangeBroadcaster *source) override
Definition skin.cpp:701
static constexpr int kLoadSaveHeight
Definition skin.cpp:441
std::vector< std::unique_ptr< ToggleButton > > override_toggle_buttons_
Definition skin.cpp:718
SkinColorPicker(String name, Skin *skin, FullInterface *full_interface)
Definition skin.cpp:444
void setButtonColor(int index, Colour color)
Definition skin.cpp:693
void paint(Graphics &g) override
Definition skin.cpp:513
void setOverride(int override_index)
Definition skin.cpp:565
Component * container_
Definition skin.cpp:728
int override_index_
Definition skin.cpp:723
int editing_index_
Definition skin.cpp:724
void buttonClicked(Button *clicked_button) override
Definition skin.cpp:625
std::vector< std::unique_ptr< Slider > > value_sliders_
Definition skin.cpp:721
void addValueSlider(int value_index)
Definition skin.cpp:496
std::unique_ptr< Component > container_
Container component hosting skin editing controls.
Definition skin.h:441
SkinDesigner(Skin *skin, FullInterface *full_interface)
Constructs a SkinDesigner window.
Definition skin.cpp:732
~SkinDesigner()
Destructor.
Manages the overall color and value theme (or "skin") of the user interface.
Definition skin.h:24
Skin()
Constructs a Skin with default or loaded settings.
Definition skin.cpp:176
Colour getColor(int section, ColorId color_id) const
Retrieves a color possibly overridden by a section.
Definition skin.cpp:270
bool stringToState(String skin_string)
Loads skin state from a JSON string.
Definition skin.cpp:424
bool overridesValue(int section, ValueId value_id) const
Checks if a given section overrides a specific value.
Definition skin.cpp:251
Colour colors_[kNumColors]
Array of global colors.
Definition skin.h:404
bool overridesColor(int section, ColorId color_id) const
Checks if a given section overrides a specific color.
Definition skin.cpp:244
json updateJson(json data)
Updates JSON data to a newer format or version if needed.
Definition skin.cpp:349
bool loadFromFile(File source)
Loads skin state from a file.
Definition skin.cpp:435
void addOverrideValue(int section, ValueId value_id, float value)
Adds a value override for a given section.
Definition skin.cpp:299
float getValue(ValueId value_id) const
Gets a global UI value.
Definition skin.h:308
static constexpr int kNumColors
Definition skin.h:208
void addOverrideColor(int section, ColorId color_id, Colour color)
Adds a color override for a given section.
Definition skin.cpp:287
void jsonToState(json skin_var)
Loads skin state from JSON data.
Definition skin.cpp:375
void setValue(ValueId value_id, float value)
Sets a global UI value.
Definition skin.h:301
json stateToJson()
Converts the current skin state to JSON.
Definition skin.cpp:311
void removeOverrideColor(int section, ColorId color_id)
Removes a color override from a section.
Definition skin.cpp:294
ValueId
Identifiers for various UI scaling/spacing values and configuration constants.
Definition skin.h:70
@ kWavetableVerticalAngle
Definition skin.h:111
@ kWidgetFillCenter
Definition skin.h:107
@ kWidgetFillFade
Definition skin.h:108
@ kWavetableHorizontalAngle
Definition skin.h:110
@ kKnobHandleLength
Definition skin.h:92
@ kWidgetLineBoost
Definition skin.h:106
@ kWidgetFillBoost
Definition skin.h:109
@ kFrequencyDisplay
Definition skin.h:116
@ kNumSkinValueIds
Definition skin.h:115
std::map< ValueId, float > value_overrides_[kNumSectionOverrides]
Per-section value overrides.
Definition skin.h:408
ColorId
Identifiers for all colors used in the UI.
Definition skin.h:126
@ kFinalColor
Definition skin.h:205
@ kPopupBorder
Definition skin.h:145
@ kInitialColor
Definition skin.h:127
@ kBodyText
Definition skin.h:133
@ kPopupBackground
Definition skin.h:144
void removeOverrideValue(int section, ValueId value_id)
Removes a value override from a section.
Definition skin.cpp:306
Colour getColor(ColorId color_id) const
Retrieves a globally defined color.
Definition skin.h:264
static bool shouldScaleValue(ValueId value_id)
Checks if a certain ValueId should be scaled by the display ratio.
Definition skin.cpp:169
void setComponentValues(SynthSection *component) const
Applies all default values to a SynthSection.
Definition skin.cpp:228
void setColor(ColorId color_id, const Colour &color)
Sets a color for a global ColorId.
Definition skin.h:257
SectionOverride
Identifiers for different UI sections that can have color or value overrides.
Definition skin.h:30
@ kNone
Definition skin.h:31
@ kNumSectionOverrides
Definition skin.h:61
String stateToString()
Converts the current skin state to a string (JSON representation).
Definition skin.cpp:341
void setComponentColors(Component *component) const
Applies all component colors to a given component.
Definition skin.cpp:207
void loadDefaultSkin()
Loads a default built-in skin.
Definition skin.cpp:195
void copyValuesToLookAndFeel(LookAndFeel *look_and_feel) const
Copies global skin values into a LookAndFeel instance.
Definition skin.cpp:258
void saveToFile(File destination)
Saves the current skin to a file.
Definition skin.cpp:345
std::map< ColorId, Colour > color_overrides_[kNumSectionOverrides]
Per-section color overrides.
Definition skin.h:407
void clearSkin()
Clears all overrides, returning to a clean default state.
Definition skin.cpp:188
float values_[kNumSkinValueIds]
Array of global float values.
Definition skin.h:405
Base class for all synthesizer sections, providing UI layout, painting, and interaction logic.
Definition synth_section.h:193
virtual void setSkinValues(const Skin &skin, bool top_level)
Sets skin values (colors, sizes) and applies them to sub-sections.
Definition synth_section.cpp:86
nlohmann::json json
Definition line_generator.h:7
const std::string kSkinExtension
File extension for Vital skin/theme files.
Definition synth_constants.h:97
Declares the Wavetable3d class, which provides a 3D and 2D visualization for wavetables.