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.