85 auto crosspointControlBounds = getLocalBounds();
87 if (m_inputControlsGrid)
90 m_inputControlsGrid->performLayout({ ctrlsSize, 0, currentInputsWidth, ctrlsSize -
s_scrollbarsize });
92 m_inputControlsGrid->performLayout({ 0, 0, currentInputsWidth, ctrlsSize -
s_scrollbarsize });
95 if (m_outputControlsGrid)
98 m_outputControlsGrid->performLayout({ 0, ctrlsSize, ctrlsSize -
s_scrollbarsize, currentOutputsHeight });
100 m_outputControlsGrid->performLayout({ 0, 0, ctrlsSize -
s_scrollbarsize, currentOutputsHeight });
103 if (m_crosspointsControlsGrid)
107 crosspointControlBounds.removeFromLeft(ctrlsSize);
108 crosspointControlBounds.removeFromRight(
s_gap);
112 crosspointControlBounds.removeFromTop(ctrlsSize);
113 crosspointControlBounds.removeFromBottom(
s_gap);
117 crosspointControlBounds.removeFromLeft(ctrlsSize);
118 crosspointControlBounds.removeFromRight(
s_gap);
119 crosspointControlBounds.removeFromTop(ctrlsSize);
120 crosspointControlBounds.removeFromBottom(
s_gap);
122 m_crosspointsControlsGrid->performLayout(crosspointControlBounds);
127 addAndMakeVisible(m_horizontalScrollViewport.get());
128 addAndMakeVisible(m_verticalScrollViewport.get());
129 if (m_hvScrollViewport) m_hvScrollViewport->setVisible(
false);
131 m_horizontalScrollContainerComponent->setBounds({ 0, 0, currentInputsWidth, ctrlsSize -
s_scrollbarsize });
132 m_horizontalScrollViewport->setBounds(getLocalBounds().removeFromTop(ctrlsSize).removeFromRight(getWidth() - ctrlsSize));
133 m_verticalScrollContainerComponent->setBounds({ 0, 0, getWidth() -
s_scrollbarsize, currentOutputsHeight });
134 m_verticalScrollViewport->setBounds(getLocalBounds().removeFromBottom(getHeight() - ctrlsSize));
138 addAndMakeVisible(m_horizontalScrollViewport.get());
139 addAndMakeVisible(m_verticalScrollViewport.get());
140 if (m_hvScrollViewport) m_hvScrollViewport->setVisible(
false);
142 m_horizontalScrollContainerComponent->setBounds({ 0, 0, currentInputsWidth, getHeight() -
s_scrollbarsize });
143 m_horizontalScrollViewport->setBounds(getLocalBounds().removeFromRight(getWidth() - ctrlsSize));
144 m_verticalScrollContainerComponent->setBounds({ 0, 0, ctrlsSize -
s_scrollbarsize, currentOutputsHeight });
145 m_verticalScrollViewport->setBounds(getLocalBounds().removeFromBottom(getHeight() - ctrlsSize));
149 if (m_horizontalScrollViewport) m_horizontalScrollViewport->setVisible(
false);
150 if (m_verticalScrollViewport) m_verticalScrollViewport->setVisible(
false);
151 addAndMakeVisible(m_hvScrollViewport.get());
153 m_hvScrollContainerComponent->setBounds({ 0, 0, currentInputsWidth + ctrlsSize, currentOutputsHeight + ctrlsSize });
154 m_hvScrollViewport->setBounds(getLocalBounds());
211 if (ioCount.first != m_inputSelectButtons.size() || ioCount.first != m_inputMuteButtons.size() || force)
213 auto templateColums = juce::Array<juce::Grid::TrackInfo>();
214 for (
auto in = 0; in < ioCount.first; in++)
215 templateColums.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
217 m_inputMuteButtons.resize(ioCount.first);
218 m_inputSelectButtons.resize(ioCount.first);
219 m_inputControlsGrid->items.clear();
220 m_inputControlsGrid->templateRows = { juce::Grid::TrackInfo(juce::Grid::Fr(1)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
221 m_inputControlsGrid->templateColumns = templateColums;
223 for (
auto i = 0; i < ioCount.first; i++)
225 auto in = std::uint16_t(i + 1);
226 m_inputSelectButtons.at(i) = std::make_unique<juce::TextButton>(
"In " + juce::String(in));
227 m_inputSelectButtons.at(i)->setClickingTogglesState(
true);
228 m_inputSelectButtons.at(i)->setColour(juce::TextButton::ColourIds::buttonOnColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
229 m_inputSelectButtons.at(i)->onClick = [
this, i] {
230 if (m_inputSelectButtons.size() > i)
232 auto in = std::uint16_t(i + 1);
233 if (m_inputSelectButtons.at(i)->getToggleState())
242 m_hvScrollContainerComponent->addAndMakeVisible(m_inputSelectButtons.at(i).get());
244 m_horizontalScrollContainerComponent->addAndMakeVisible(m_inputSelectButtons.at(i).get());
245 m_inputControlsGrid->items.add(juce::GridItem(m_inputSelectButtons.at(i).get()));
247 for (
auto i = 0; i < ioCount.first; i++)
249 auto in = std::uint16_t(i + 1);
250 m_inputMuteButtons.at(i) = std::make_unique<juce::TextButton>(
"M");
251 m_inputMuteButtons.at(i)->setClickingTogglesState(
true);
253 m_inputMuteButtons.at(i)->setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colours::red);
254 m_inputMuteButtons.at(i)->onClick = [
this, i] {
255 auto inputMuteStates = std::map<std::uint16_t, bool>();
256 auto in = std::uint16_t(i + 1);
257 inputMuteStates[in] = m_inputMuteButtons.at(i)->getToggleState();
263 m_hvScrollContainerComponent->addAndMakeVisible(m_inputMuteButtons.at(i).get());
265 m_horizontalScrollContainerComponent->addAndMakeVisible(m_inputMuteButtons.at(i).get());
266 m_inputControlsGrid->items.add(juce::GridItem(m_inputMuteButtons.at(i).get()));
275 if (ioCount.second != m_outputSelectButtons.size() || ioCount.second != m_outputMuteButtons.size() || force)
277 auto templateRows = juce::Array<juce::Grid::TrackInfo>();
278 for (
auto out = 0; out < ioCount.second; out++)
279 templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
281 m_outputMuteButtons.resize(ioCount.second);
282 m_outputSelectButtons.resize(ioCount.second);
283 m_outputControlsGrid->items.clear();
284 m_outputControlsGrid->templateRows = templateRows;
285 m_outputControlsGrid->templateColumns = { juce::Grid::TrackInfo(juce::Grid::Fr(1)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
287 for (
auto o = 0; o < ioCount.second; o++)
289 auto out = std::uint16_t(o + 1);
290 m_outputSelectButtons.at(o) = std::make_unique<juce::TextButton>(
"Out " + juce::String(out));
291 m_outputSelectButtons.at(o)->setClickingTogglesState(
true);
292 m_outputSelectButtons.at(o)->setColour(juce::TextButton::ColourIds::buttonOnColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
293 m_outputSelectButtons.at(o)->onClick = [
this, o] {
294 if (m_outputSelectButtons.size() > o)
296 auto out = std::uint16_t(o + 1);
297 if (m_outputSelectButtons.at(o)->getToggleState())
306 m_hvScrollContainerComponent->addAndMakeVisible(m_outputSelectButtons.at(o).get());
308 m_verticalScrollContainerComponent->addAndMakeVisible(m_outputSelectButtons.at(o).get());
309 m_outputControlsGrid->items.add(juce::GridItem(m_outputSelectButtons.at(o).get()));
311 m_outputMuteButtons.at(o) = std::make_unique<juce::TextButton>(
"M");
312 m_outputMuteButtons.at(o)->setClickingTogglesState(
true);
314 m_outputMuteButtons.at(o)->setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colours::red);
315 m_outputMuteButtons.at(o)->onClick = [
this, o] {
316 auto outputMuteStates = std::map<std::uint16_t, bool>();
317 auto out = std::uint16_t(o + 1);
318 outputMuteStates[out] = m_outputMuteButtons.at(o)->getToggleState();
324 m_hvScrollContainerComponent->addAndMakeVisible(m_outputMuteButtons.at(o).get());
326 m_verticalScrollContainerComponent->addAndMakeVisible(m_outputMuteButtons.at(o).get());
327 m_outputControlsGrid->items.add(juce::GridItem(m_outputMuteButtons.at(o).get()));
338 if (force || ioCount.first != m_crosspointGainSliders.size())
340 auto templateColums = juce::Array<juce::Grid::TrackInfo>();
341 for (
auto in = 0; in < ioCount.first; in++)
342 templateColums.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
344 m_crosspointGainSliders.resize(ioCount.first);
345 m_crosspointsControlsGrid->items.clear();
346 m_crosspointsControlsGrid->templateRows = { juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
347 m_crosspointsControlsGrid->templateColumns = templateColums;
349 for (
auto i = 0; i < ioCount.first; i++)
351 m_crosspointGainSliders.at(i) = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::LinearVertical, juce::Slider::NoTextBox);
352 m_crosspointGainSliders.at(i)->setColour(juce::Slider::ColourIds::trackColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
353 m_crosspointGainSliders.at(i)->setRange(0.0, 1.0, 0.01);
354 m_crosspointGainSliders.at(i)->setTitle(juce::String(i + 1));
355 m_crosspointGainSliders.at(i)->displayValueConverter = [](
double val) {
return juce::String(juce::Decibels::gainToDecibels(val,
static_cast<double>(
ProcessorDataAnalyzer::getGlobalMindB())), 1) +
" dB"; };
359 m_crosspointGainSliders.at(i)->onValueChange = [
this, i] {
360 auto crosspointValues = std::map<std::uint16_t, std::map<std::uint16_t, float>>();
362 auto faderValue = m_crosspointGainSliders.at(i)->getValue();
363 auto in = std::uint16_t(i + 1);
364 auto out = std::uint16_t(m_currentIOChannel.second);
365 crosspointValues[in][out] = float(faderValue);
370 m_crosspointGainSliders.at(i)->onToggleStateChange = [
this, i] {
371 auto crosspointStates = std::map<std::uint16_t, std::map<std::uint16_t, bool>>();
373 auto faderState = m_crosspointGainSliders.at(i)->getToggleState();
374 auto in = std::uint16_t(i + 1);
375 auto out = std::uint16_t(m_currentIOChannel.second);
376 crosspointStates[in][out] = faderState;
381 m_horizontalScrollContainerComponent->addAndMakeVisible(m_crosspointGainSliders.at(i).get());
382 m_crosspointsControlsGrid->items.add(juce::GridItem(m_crosspointGainSliders.at(i).get()));
385 for (
auto i = 0; i < ioCount.first; i++)
387 if (m_crosspointGainSliders.size() > i)
389 auto in = std::uint16_t(i + 1);
390 auto out = std::uint16_t(m_currentIOChannel.second);
393 m_crosspointGainSliders.at(i)->setToggleState(crosspointState, juce::dontSendNotification);
395 m_crosspointGainSliders.at(i)->setValue(
double(crosspointValue), juce::dontSendNotification);
396 m_crosspointGainSliders.at(i)->setVisible(
true);
402 if (force || ioCount.second != m_crosspointGainSliders.size())
404 auto templateRows = juce::Array<juce::Grid::TrackInfo>();
405 for (
auto out = 0; out < ioCount.second; out++)
406 templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
408 m_crosspointGainSliders.resize(ioCount.second);
409 m_crosspointsControlsGrid->items.clear();
410 m_crosspointsControlsGrid->templateColumns = { juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
411 m_crosspointsControlsGrid->templateRows = templateRows;
413 for (
auto o = 0; o < ioCount.second; o++)
415 m_crosspointGainSliders.at(o) = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::LinearHorizontal, juce::Slider::NoTextBox);
416 m_crosspointGainSliders.at(o)->setColour(juce::Slider::ColourIds::trackColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
417 m_crosspointGainSliders.at(o)->setRange(0.0, 1.0, 0.01);
418 m_crosspointGainSliders.at(o)->setTitle(juce::String(o + 1));
419 m_crosspointGainSliders.at(o)->displayValueConverter = [](
double val) {
return juce::String(juce::Decibels::gainToDecibels(val,
static_cast<double>(
ProcessorDataAnalyzer::getGlobalMindB())), 1) +
" dB"; };
423 m_crosspointGainSliders.at(o)->onValueChange = [
this, o] {
424 auto crosspointValues = std::map<std::uint16_t, std::map<std::uint16_t, float>>();
426 auto faderValue = m_crosspointGainSliders.at(o)->getValue();
427 auto in = std::uint16_t(m_currentIOChannel.second);
428 auto out = std::uint16_t(o + 1);
429 crosspointValues[in][out] = float(faderValue);
434 m_crosspointGainSliders.at(o)->onToggleStateChange = [
this, o] {
435 auto crosspointStates = std::map<std::uint16_t, std::map<std::uint16_t, bool>>();
436 auto faderState = m_crosspointGainSliders.at(o)->getToggleState();
437 auto in = std::uint16_t(m_currentIOChannel.second);
438 auto out = std::uint16_t(o + 1);
439 crosspointStates[in][out] = faderState;
444 m_verticalScrollContainerComponent->addAndMakeVisible(m_crosspointGainSliders.at(o).get());
445 m_crosspointsControlsGrid->items.add(juce::GridItem(m_crosspointGainSliders.at(o).get()));
449 for (
auto o = 0; o < ioCount.second; o++)
451 if (m_crosspointGainSliders.size() > o)
453 auto in = std::uint16_t(m_currentIOChannel.second);
454 auto out = std::uint16_t(o + 1);
457 m_crosspointGainSliders.at(o)->setToggleState(crosspointState, juce::dontSendNotification);
459 m_crosspointGainSliders.at(o)->setValue(
double(crosspointValue), juce::dontSendNotification);
460 m_crosspointGainSliders.at(o)->setVisible(
true);
466 if (force || (ioCount.first * ioCount.second) != m_crosspointGainSliders.size())
468 auto templateColumns = juce::Array<juce::Grid::TrackInfo>();
469 for (
auto in = 0; in < ioCount.first; in++)
470 templateColumns.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
471 auto templateRows = juce::Array<juce::Grid::TrackInfo>();
472 for (
auto out = 0; out < ioCount.second; out++)
473 templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
475 m_crosspointGainSliders.resize(ioCount.first * ioCount.second);
476 m_crosspointsControlsGrid->items.clear();
477 m_crosspointsControlsGrid->templateColumns = templateColumns;
478 m_crosspointsControlsGrid->templateRows = templateRows;
480 for (
auto o = 0; o < ioCount.second; o++)
482 for (
auto i = 0; i < ioCount.first; i++)
484 auto idx = o + i * ioCount.second;
485 m_crosspointGainSliders.at(idx) = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::Rotary, juce::Slider::NoTextBox);
486 m_crosspointGainSliders.at(idx)->setColour(juce::Slider::ColourIds::trackColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
487 m_crosspointGainSliders.at(idx)->setRange(0.0, 1.0, 0.01);
488 m_crosspointGainSliders.at(idx)->displayValueConverter = [](
double val) {
return juce::String(juce::Decibels::gainToDecibels(val,
static_cast<double>(
ProcessorDataAnalyzer::getGlobalMindB())), 1) +
" dB"; };
492 m_crosspointGainSliders.at(idx)->onValueChange = [
this, idx, i, o] {
493 auto crosspointValues = std::map<std::uint16_t, std::map<std::uint16_t, float>>();
495 auto faderValue = m_crosspointGainSliders.at(idx)->getValue();
496 auto in = std::uint16_t(i + 1);
497 auto out = std::uint16_t(o + 1);
498 crosspointValues[in][out] = float(faderValue);
503 m_crosspointGainSliders.at(idx)->onToggleStateChange = [
this, idx, i, o] {
504 auto crosspointStates = std::map<std::uint16_t, std::map<std::uint16_t, bool>>();
505 auto faderState = m_crosspointGainSliders.at(idx)->getToggleState();
506 auto in = std::uint16_t(i + 1);
507 auto out = std::uint16_t(o + 1);
508 crosspointStates[in][out] = faderState;
513 m_hvScrollContainerComponent->addAndMakeVisible(m_crosspointGainSliders.at(idx).get());
514 m_crosspointsControlsGrid->items.add(juce::GridItem(m_crosspointGainSliders.at(idx).get()));
519 for (
auto i = 0; i < ioCount.first; i++)
521 for (
auto o = 0; o < ioCount.second; o++)
523 auto idx = i * ioCount.second + o;
524 if (m_crosspointGainSliders.size() > idx)
526 auto in = std::uint16_t(i + 1);
527 auto out = std::uint16_t(o + 1);
530 m_crosspointGainSliders.at(idx)->setToggleState(crosspointState, juce::dontSendNotification);
532 m_crosspointGainSliders.at(idx)->setValue(
double(crosspointValue), juce::dontSendNotification);
533 m_crosspointGainSliders.at(idx)->setVisible(
true);