118 if (index < m_pluginParameterInfos.size())
120 m_pluginParameterInfos.at(index).currentValue = value;
121 m_pluginParameterInfos.at(index).id = id;
123 if (m_parameterValueComboBoxes.count(index) != 0)
124 m_parameterValueComboBoxes.at(index)->setSelectedId(
int(value * (m_pluginParameterInfos.at(index).stepCount - 1) + 1), juce::dontSendNotification);
125 else if (m_parameterValueSliders.count(index) != 0)
126 m_parameterValueSliders.at(index)->setValue(
float(value), juce::dontSendNotification);
127 else if (m_parameterValueButtons.count(index) != 0)
128 m_parameterValueButtons.at(index)->setToggleState(value > 0.5f, juce::dontSendNotification);
134 for (
auto const& parameterInfo : m_pluginParameterInfos)
136 if (!parameterInfo.isRemoteControllable)
139 if (parameterInfo.type != ParameterControlType::Toggle)
141 if (m_parameterNameLabels.count(parameterInfo.index) != 0)
142 m_parameterNameLabels.at(parameterInfo.index)->setText(parameterInfo.name, juce::dontSendNotification);
145 m_parameterNameLabels[parameterInfo.index] = std::make_unique<juce::Label>(parameterInfo.id);
146 m_parameterNameLabels[parameterInfo.index]->setJustificationType(juce::Justification::centredBottom);
147 m_parameterNameLabels[parameterInfo.index]->setText(parameterInfo.name, juce::dontSendNotification);
148 addAndMakeVisible(m_parameterNameLabels[parameterInfo.index].get());
152 if (parameterInfo.type == ParameterControlType::Discrete)
154 if (m_parameterValueComboBoxes.count(parameterInfo.index) != 0)
155 m_parameterValueComboBoxes.at(parameterInfo.index)->setSelectedId(
int(parameterInfo.currentValue * (parameterInfo.stepCount - 1) + 1), juce::dontSendNotification);
158 m_parameterValueComboBoxes[parameterInfo.index] = std::make_unique<juce::ComboBox>(parameterInfo.id);
159 jassert(parameterInfo.stepCount == parameterInfo.stepNames.size());
161 for (
auto const& stepName : parameterInfo.stepNames)
162 m_parameterValueComboBoxes[parameterInfo.index]->addItem(stepName, i++);
163 m_parameterValueComboBoxes[parameterInfo.index]->setSelectedId(
int(parameterInfo.currentValue * (parameterInfo.stepCount - 1) + 1), juce::dontSendNotification);
164 m_parameterValueComboBoxes[parameterInfo.index]->onChange = [=]() {
165 auto pIdx = parameterInfo.index;
166 if (m_parameterValueComboBoxes.count(pIdx) > 0 && m_pluginParameterInfos.size() > pIdx)
168 auto sId = m_parameterValueComboBoxes[pIdx]->getSelectedId();
169 m_pluginParameterInfos[pIdx].currentValue = float((1.0f / (parameterInfo.stepCount - 1)) * (sId - 1));
175 addAndMakeVisible(m_parameterValueComboBoxes[parameterInfo.index].get());
178 else if (parameterInfo.type == ParameterControlType::Continuous)
180 if (m_parameterValueSliders.count(parameterInfo.index) != 0)
181 m_parameterValueSliders.at(parameterInfo.index)->setValue(
int(parameterInfo.currentValue));
184 m_parameterValueSliders[parameterInfo.index] = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::Rotary, juce::Slider::NoTextBox);
185 m_parameterValueSliders[parameterInfo.index]->setSliderStyle(juce::Slider::SliderStyle::Rotary);
186 m_parameterValueSliders[parameterInfo.index]->setTogglalbe(
false);
187 m_parameterValueSliders[parameterInfo.index]->setRange(parameterInfo.minValue, parameterInfo.maxValue, juce::dontSendNotification);
188 m_parameterValueSliders[parameterInfo.index]->setValue(parameterInfo.currentValue);
189 m_parameterValueSliders[parameterInfo.index]->onValueChange = [=]() {
190 auto pIdx = parameterInfo.index;
191 if (m_parameterValueSliders.count(pIdx) > 0 && m_pluginParameterInfos.size() > pIdx)
193 auto value = float(m_parameterValueSliders[pIdx]->getValue());
194 m_pluginParameterInfos[pIdx].currentValue = value;
200 addAndMakeVisible(m_parameterValueSliders[parameterInfo.index].get());
203 else if (parameterInfo.type == ParameterControlType::Toggle)
205 if (m_parameterValueButtons.count(parameterInfo.index) != 0)
206 m_parameterValueButtons.at(parameterInfo.index)->setToggleState(parameterInfo.currentValue > 0.5f, juce::dontSendNotification);
209 m_parameterValueButtons[parameterInfo.index] = std::make_unique<juce::TextButton>(parameterInfo.name,
"Toggle to enable or disable parameter.");
210 m_parameterValueButtons[parameterInfo.index]->setClickingTogglesState(
true);
211 m_parameterValueButtons[parameterInfo.index]->setToggleState(parameterInfo.currentValue > 0.5f, juce::dontSendNotification);
212 m_parameterValueButtons[parameterInfo.index]->onStateChange = [=]() {
213 auto pIdx = parameterInfo.index;
214 if (m_parameterValueButtons.count(pIdx) > 0 && m_pluginParameterInfos.size() > pIdx)
216 auto value = float(m_parameterValueButtons[pIdx]->getToggleState() ? 1.0f : 0.0f);
217 m_pluginParameterInfos[pIdx].currentValue = value;
223 addAndMakeVisible(m_parameterValueButtons[parameterInfo.index].get());
233 auto bounds = m_parameterBounds;
234 if (bounds.isEmpty())
238 auto itemCount = int(m_parameterValueComboBoxes.size() + m_parameterValueSliders.size() + m_parameterValueButtons.size());
246 const int labelHeight = 30;
247 const int controlMargin = 5;
249 int availableWidth = bounds.getWidth();
250 int availableHeight = bounds.getHeight();
253 int itemsPerRow = juce::jmax(1, availableWidth / gridItemControlSize);
254 itemsPerRow = juce::jmin(itemCount, itemsPerRow);
257 int numRowPairs =
static_cast<int>(std::ceil(
static_cast<float>(itemCount) /
static_cast<float>(itemsPerRow)));
260 int columnWidth = gridItemControlSize;
261 int controlHeight = gridItemControlSize;
264 m_parameterControlsGrid->templateRows.clear();
265 m_parameterControlsGrid->templateColumns.clear();
266 m_parameterControlsGrid->items.clear();
269 for (
int i = 0; i < numRowPairs; ++i)
271 m_parameterControlsGrid->templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(labelHeight)));
272 m_parameterControlsGrid->templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(controlHeight)));
276 for (
int i = 0; i < itemsPerRow; ++i)
277 m_parameterControlsGrid->templateColumns.add(juce::Grid::TrackInfo(juce::Grid::Px(columnWidth)));
283 for (
auto const& buttonKV : m_parameterValueButtons)
285 auto* button = buttonKV.second.get();
288 int row = (currentItem / itemsPerRow) * 2;
289 int col = currentItem % itemsPerRow;
292 auto buttonSize = float(gridItemControlSize - (controlMargin * 2));
294 m_parameterControlsGrid->items.add(juce::GridItem(*button)
295 .withArea(row + 2, col + 1)
296 .withMargin(juce::GridItem::Margin(controlMargin))
297 .withWidth(buttonSize)
298 .withHeight(buttonSize)
299 .withJustifySelf(juce::GridItem::JustifySelf::center)
300 .withAlignSelf(juce::GridItem::AlignSelf::center));
306 for (
auto const& comboKV : m_parameterValueComboBoxes)
308 auto paramIndex = comboKV.first;
309 auto* combo = comboKV.second.get();
312 auto labelIter = m_parameterNameLabels.find(paramIndex);
313 if (labelIter == m_parameterNameLabels.end() || !labelIter->second)
316 auto* label = labelIter->second.get();
319 int row = (currentItem / itemsPerRow) * 2;
320 int col = currentItem % itemsPerRow;
323 m_parameterControlsGrid->items.add(juce::GridItem(*label)
324 .withArea(row + 1, col + 1)
325 .withMargin(juce::GridItem::Margin(2.0f)));
328 m_parameterControlsGrid->items.add(juce::GridItem(*combo)
329 .withArea(row + 2, col + 1)
330 .withMargin(juce::GridItem::Margin(controlMargin))
332 .withJustifySelf(juce::GridItem::JustifySelf::center)
333 .withAlignSelf(juce::GridItem::AlignSelf::center));
339 for (
auto const& sliderKV : m_parameterValueSliders)
341 auto paramIndex = sliderKV.first;
342 auto* slider = sliderKV.second.get();
345 auto labelIter = m_parameterNameLabels.find(paramIndex);
346 if (labelIter == m_parameterNameLabels.end() || !labelIter->second)
349 auto* label = labelIter->second.get();
352 int row = (currentItem / itemsPerRow) * 2;
353 int col = currentItem % itemsPerRow;
356 m_parameterControlsGrid->items.add(juce::GridItem(*label)
357 .withArea(row + 1, col + 1)
358 .withMargin(juce::GridItem::Margin(2.0f)));
361 auto sliderSize = float(gridItemControlSize - (controlMargin * 2));
363 m_parameterControlsGrid->items.add(juce::GridItem(*slider)
364 .withArea(row + 2, col + 1)
365 .withMargin(juce::GridItem::Margin(controlMargin))
366 .withWidth(sliderSize)
367 .withHeight(sliderSize)
368 .withJustifySelf(juce::GridItem::JustifySelf::center)
369 .withAlignSelf(juce::GridItem::AlignSelf::center));
375 m_parameterControlsGrid->performLayout(bounds);