diff --git a/Source/Processors/RecordNode/EngineConfigWindow.cpp b/Source/Processors/RecordNode/EngineConfigWindow.cpp index 6fb06d7c12ae92d68ca98f87c3f2c4e7285efa9d..309748230f4232a5e097bd4ee3e23152129757ea 100644 --- a/Source/Processors/RecordNode/EngineConfigWindow.cpp +++ b/Source/Processors/RecordNode/EngineConfigWindow.cpp @@ -33,11 +33,26 @@ EngineParameterComponent::EngineParameterComponent(EngineParameter& param) but->setBounds(120,0,100,20); addAndMakeVisible(but); control = but; + name = param.name; } + else if (param.type == EngineParameter::MULTI) + { + ComboBox* box = new ComboBox(); + box->setBounds(120, 0, 100, 20); + StringArray options = StringArray::fromTokens(param.name, "|", "\""); + name = options[0]; + options.remove(0); + box->addItemList(options, 1); + box->setSelectedId(param.multiParam.value + 1, dontSendNotification); + box->setEditableText(false); + addAndMakeVisible(box); + control = box; + } else { Label* lab = new Label(); lab->setFont(Font("Small Text",10,Font::plain)); + name = param.name; switch (param.type) { case EngineParameter::BOOL: @@ -74,7 +89,7 @@ void EngineParameterComponent::paint(Graphics& g) { g.setColour(Colours::black); g.setFont(13); - g.drawText(parameter.name+":",0,0,100,30,Justification::left,true); + g.drawText(name+":",0,0,100,30,Justification::left,true); } void EngineParameterComponent::labelTextChanged(Label* l) @@ -104,25 +119,28 @@ void EngineParameterComponent::saveValue() switch (parameter.type) { case EngineParameter::BOOL: - parameter.boolParam.value = ((ToggleButton*)control.get())->getToggleState(); + parameter.boolParam.value = static_cast<ToggleButton*>(control.get())->getToggleState(); break; case EngineParameter::INT: - parameter.intParam.value = ((Label*)control.get())->getText().getIntValue(); + parameter.intParam.value = static_cast<Label*>(control.get())->getText().getIntValue(); if (parameter.intParam.value < parameter.intParam.min) parameter.intParam.value = parameter.intParam.min; if (parameter.intParam.value > parameter.intParam.max) parameter.intParam.value = parameter.intParam.max; break; case EngineParameter::FLOAT: - parameter.floatParam.value = ((Label*)control.get())->getText().getFloatValue(); + parameter.floatParam.value = static_cast<Label*>(control.get())->getText().getFloatValue(); if (parameter.floatParam.value < parameter.floatParam.min) parameter.floatParam.value = parameter.floatParam.min; if (parameter.floatParam.value > parameter.floatParam.max) parameter.floatParam.value = parameter.floatParam.max; break; case EngineParameter::STR: - parameter.strParam.value = ((Label*)control.get())->getText(); + parameter.strParam.value = static_cast<Label*>(control.get())->getText(); break; + case EngineParameter::MULTI: + parameter.multiParam.value = static_cast<ComboBox*>(control.get())->getSelectedId() - 1; + break; } } @@ -135,7 +153,7 @@ EngineConfigComponent::EngineConfigComponent(RecordEngineManager* man, int heigh for (int i = 0; i < man->getNumParameters(); i++) { EngineParameterComponent* par = new EngineParameterComponent(man->getParameter(i)); - if (man->getParameter(i).type == EngineParameter::STR) + if (man->getParameter(i).type == EngineParameter::STR || man->getParameter(i).type == EngineParameter::MULTI) hasString=true; par->setBounds(10,10+40*i,300,30); addAndMakeVisible(par); diff --git a/Source/Processors/RecordNode/EngineConfigWindow.h b/Source/Processors/RecordNode/EngineConfigWindow.h index d57975b7bf8fed8dad5eb7a7f8fff0ddfbe0551f..0e3e1925bb1e1714bea8cdf213d903d6d5749b5f 100644 --- a/Source/Processors/RecordNode/EngineConfigWindow.h +++ b/Source/Processors/RecordNode/EngineConfigWindow.h @@ -43,6 +43,7 @@ private: ScopedPointer<Component> control; EngineParameter::EngineParameterType type; EngineParameter& parameter; + String name; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EngineParameterComponent); }; diff --git a/Source/Processors/RecordNode/RecordEngine.cpp b/Source/Processors/RecordNode/RecordEngine.cpp index 6aaef305fd4b5b3db8118d256a01200f92536645..fc9a8db2b2c26ea9f63706257700d8335089da18 100644 --- a/Source/Processors/RecordNode/RecordEngine.cpp +++ b/Source/Processors/RecordNode/RecordEngine.cpp @@ -209,6 +209,9 @@ void EngineParameter::restoreDefault() strParam.value = def; break; + case MULTI: + multiParam.value = def; + default: break; } @@ -329,6 +332,10 @@ void RecordEngineManager::saveParametersToXml (XmlElement* xml) param->setAttribute ("value", parameters[i]->strParam.value); break; + case EngineParameter::MULTI: + param->setAttribute("type", "multi"); + param->setAttribute("value", parameters[i]->multiParam.value); + default: break; } @@ -363,6 +370,11 @@ void RecordEngineManager::loadParametersFromXml (XmlElement* xml) { parameters[i]->strParam.value = xmlNode->getStringAttribute ("value"); } + else if ((xmlNode->getStringAttribute("type") == "multi") + && (parameters[i]->type == EngineParameter::MULTI)) + { + parameters[i]->multiParam.value = xmlNode->getIntAttribute("value"); + } } } } diff --git a/Source/Processors/RecordNode/RecordEngine.h b/Source/Processors/RecordNode/RecordEngine.h index f6864ec06021f644be3c7c78aaa81274926f5f7b..b75e45e06082aac56816256d38320aec69b2d72a 100644 --- a/Source/Processors/RecordNode/RecordEngine.h +++ b/Source/Processors/RecordNode/RecordEngine.h @@ -38,6 +38,8 @@ v = parameter.floatParam.value #define strParameter(i,v) if ((parameter.id == i) && (parameter.type == EngineParameter::STR)) \ v = parameter.strParam.value +#define multiParameter(i,v) if ((parameter.id == i) && (parameter.type == EngineParameter::MULTI)) \ + v = parameter.multiParam.value struct RecordProcessorInfo { @@ -219,7 +221,7 @@ typedef RecordEngine* (*EngineCreator)(); struct PLUGIN_API EngineParameter { public: - enum EngineParameterType { STR, INT, FLOAT, BOOL }; + enum EngineParameterType { STR, INT, FLOAT, BOOL, MULTI }; EngineParameter (EngineParameterType paramType, int paramId, @@ -250,6 +252,11 @@ public: { bool value; } boolParam; + + struct + { + int value; + } multiParam; }; //Strings can't be inside an union. This means wasting a bit of memory, but adds more safety than using char*