36 Group* parent =
nullptr;
45 int numberOfStates = 0;
46 float defaultValue = 0.0f;
67 low = str.upToFirstOccurrenceOf (
",",
false,
false).getFloatValue();
68 high = str.fromLastOccurrenceOf (
",",
false,
false).getFloatValue();
71 bool contains (
float f)
const noexcept
73 return (inclusiveLow ? (f >= low) : (f > low))
74 && (inclusiveHigh ? (f <= high) : (f < high));
80 bool inclusiveLow =
false;
81 bool inclusiveHigh =
false;
102 const Param* getParamForID (
int paramID,
const Group* grp)
const
104 for (
auto item : (grp != nullptr ? grp->paramTree : paramTree))
106 if (
auto param =
dynamic_cast<const Param*
> (item))
107 if (param->paramID == paramID)
110 if (
auto group =
dynamic_cast<const Group*
> (item))
111 if (
auto res = getParamForID (paramID, group))
118 const ValueType* getValueType (
const juce::String& name)
const
120 for (
auto v : valueTypes)
134 for (
auto item : xml.getChildIterator())
136 if (item->hasTagName (
"Param")) parseParam (*item,
nullptr,
nullptr);
137 else if (item->hasTagName (
"ValueType")) parseValueType (*item);
138 else if (item->hasTagName (
"Template")) parseTemplate (*item);
139 else if (item->hasTagName (
"Group")) parseGroup (*item,
nullptr);
143 void parseParam (
const juce::XmlElement& item, Group* group, Template* temp)
145 auto param =
new Param();
159 param->shortNames.trim();
160 param->shortNames.removeEmptyStrings();
162 if (group !=
nullptr)
164 group->paramTree.add (param);
165 param->parent = group;
167 else if (temp !=
nullptr)
169 temp->params.add (param);
173 paramTree.
add (param);
179 auto vt =
new ValueType();
188 for (
auto entryXml : item.getChildWithTagNameIterator (
"Entry"))
190 auto entry =
new Entry();
191 entry->name = entryXml->getStringAttribute (
"name");
193 if (entryXml->hasAttribute (
"value"))
195 entry->range.set (entryXml->getStringAttribute (
"value"));
199 entry->range.low = curEntry / (
float) numEntries;
200 entry->range.high = (curEntry + 1) / (
float) numEntries;
202 entry->range.inclusiveLow =
true;
203 entry->range.inclusiveHigh = (curEntry == numEntries - 1);
206 vt->entries.add (entry);
213 auto temp =
new Template();
214 templates.
add (temp);
217 for (
auto param : item.getChildIterator())
218 parseParam (*param, nullptr, temp);
223 auto group =
new Group();
227 parentGroup->paramTree.add (group);
228 group->parent = parentGroup;
232 paramTree.
add (group);
243 for (
auto temp : templates)
247 for (
int i = 0; i < temp->params.size(); ++i)
249 auto param =
new Param();
250 group->paramTree.add (param);
252 param->parent = group;
253 param->paramID = evaluate (temp->params[i]->expr, variables);
254 param->defaultValue = temp->params[i]->defaultValue;
255 param->label = temp->params[i]->label;
256 param->name = temp->params[i]->name;
257 param->numberOfStates = temp->params[i]->numberOfStates;
258 param->shortNames = temp->params[i]->shortNames;
259 param->type = temp->params[i]->type;
266 for (
auto subItem : item.getChildIterator())
268 if (subItem->hasTagName (
"Param")) parseParam (*subItem, group,
nullptr);
269 else if (subItem->hasTagName (
"Group")) parseGroup (*subItem, group);
279 for (
auto& v : variables)
281 if (v.contains (
"="))
283 names.
add (v.upToFirstOccurrenceOf (
"=",
false,
false));
284 vals.
add (v.fromFirstOccurrenceOf (
"=",
false,
false).getIntValue());
288 for (
int i = 0; i < names.
size(); ++i)
310 for (
const auto& s : tokens)
323 val += s.getIntValue();
325 val -= s.getIntValue();