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());
215 if (ioCount.first != m_inputSelectButtons.size() || ioCount.first != m_inputMuteButtons.size() || force)
217 auto templateColums = juce::Array<juce::Grid::TrackInfo>();
218 for (
auto in = 0; in < ioCount.first; in++)
219 templateColums.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
221 m_inputMuteButtons.resize(ioCount.first);
222 m_inputSelectButtons.resize(ioCount.first);
223 m_inputControlsGrid->items.clear();
224 m_inputControlsGrid->templateRows = { juce::Grid::TrackInfo(juce::Grid::Fr(1)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
225 m_inputControlsGrid->templateColumns = templateColums;
227 for (
auto i = 0; i < ioCount.first; i++)
229 auto in = std::uint16_t(i + 1);
230 m_inputSelectButtons.at(i) = std::make_unique<juce::TextButton>(
"In " + juce::String(in));
231 m_inputSelectButtons.at(i)->setClickingTogglesState(
true);
232 m_inputSelectButtons.at(i)->setColour(juce::TextButton::ColourIds::buttonOnColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
233 m_inputSelectButtons.at(i)->onClick = [
this, i] {
234 if (m_inputSelectButtons.size() > i)
236 auto in = std::uint16_t(i + 1);
237 if (m_inputSelectButtons.at(i)->getToggleState())
246 m_hvScrollContainerComponent->addAndMakeVisible(m_inputSelectButtons.at(i).get());
248 m_horizontalScrollContainerComponent->addAndMakeVisible(m_inputSelectButtons.at(i).get());
249 m_inputControlsGrid->items.add(juce::GridItem(m_inputSelectButtons.at(i).get()));
251 for (
auto i = 0; i < ioCount.first; i++)
253 auto in = std::uint16_t(i + 1);
254 m_inputMuteButtons.at(i) = std::make_unique<juce::TextButton>(
"M");
255 m_inputMuteButtons.at(i)->setClickingTogglesState(
true);
257 m_inputMuteButtons.at(i)->setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colours::red);
258 m_inputMuteButtons.at(i)->onClick = [
this, i] {
259 auto inputMuteStates = std::map<std::uint16_t, bool>();
260 auto in = std::uint16_t(i + 1);
261 inputMuteStates[in] = m_inputMuteButtons.at(i)->getToggleState();
267 m_hvScrollContainerComponent->addAndMakeVisible(m_inputMuteButtons.at(i).get());
269 m_horizontalScrollContainerComponent->addAndMakeVisible(m_inputMuteButtons.at(i).get());
270 m_inputControlsGrid->items.add(juce::GridItem(m_inputMuteButtons.at(i).get()));
279 if (ioCount.second != m_outputSelectButtons.size() || ioCount.second != m_outputMuteButtons.size() || force)
281 auto templateRows = juce::Array<juce::Grid::TrackInfo>();
282 for (
auto out = 0; out < ioCount.second; out++)
283 templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
285 m_outputMuteButtons.resize(ioCount.second);
286 m_outputSelectButtons.resize(ioCount.second);
287 m_outputControlsGrid->items.clear();
288 m_outputControlsGrid->templateRows = templateRows;
289 m_outputControlsGrid->templateColumns = { juce::Grid::TrackInfo(juce::Grid::Fr(1)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
291 for (
auto o = 0; o < ioCount.second; o++)
293 auto out = std::uint16_t(o + 1);
294 m_outputSelectButtons.at(o) = std::make_unique<juce::TextButton>(
"Out " + juce::String(out));
295 m_outputSelectButtons.at(o)->setClickingTogglesState(
true);
296 m_outputSelectButtons.at(o)->setColour(juce::TextButton::ColourIds::buttonOnColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
297 m_outputSelectButtons.at(o)->onClick = [
this, o] {
298 if (m_outputSelectButtons.size() > o)
300 auto out = std::uint16_t(o + 1);
301 if (m_outputSelectButtons.at(o)->getToggleState())
310 m_hvScrollContainerComponent->addAndMakeVisible(m_outputSelectButtons.at(o).get());
312 m_verticalScrollContainerComponent->addAndMakeVisible(m_outputSelectButtons.at(o).get());
313 m_outputControlsGrid->items.add(juce::GridItem(m_outputSelectButtons.at(o).get()));
315 m_outputMuteButtons.at(o) = std::make_unique<juce::TextButton>(
"M");
316 m_outputMuteButtons.at(o)->setClickingTogglesState(
true);
318 m_outputMuteButtons.at(o)->setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colours::red);
319 m_outputMuteButtons.at(o)->onClick = [
this, o] {
320 auto outputMuteStates = std::map<std::uint16_t, bool>();
321 auto out = std::uint16_t(o + 1);
322 outputMuteStates[out] = m_outputMuteButtons.at(o)->getToggleState();
328 m_hvScrollContainerComponent->addAndMakeVisible(m_outputMuteButtons.at(o).get());
330 m_verticalScrollContainerComponent->addAndMakeVisible(m_outputMuteButtons.at(o).get());
331 m_outputControlsGrid->items.add(juce::GridItem(m_outputMuteButtons.at(o).get()));
342 if (force || ioCount.first != m_crosspointGainSliders.size())
344 auto templateColums = juce::Array<juce::Grid::TrackInfo>();
345 for (
auto in = 0; in < ioCount.first; in++)
346 templateColums.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
348 m_crosspointGainSliders.resize(ioCount.first);
349 m_crosspointsControlsGrid->items.clear();
350 m_crosspointsControlsGrid->templateRows = { juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
351 m_crosspointsControlsGrid->templateColumns = templateColums;
353 for (
auto i = 0; i < ioCount.first; i++)
355 m_crosspointGainSliders.at(i) = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::LinearVertical, juce::Slider::NoTextBox);
356 m_crosspointGainSliders.at(i)->setColour(juce::Slider::ColourIds::trackColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
357 m_crosspointGainSliders.at(i)->setRange(0.0, 1.0, 0.01);
358 m_crosspointGainSliders.at(i)->setTitle(juce::String(i + 1));
359 m_crosspointGainSliders.at(i)->displayValueConverter = [](
double val) {
return juce::String(juce::Decibels::gainToDecibels(val,
static_cast<double>(
ProcessorDataAnalyzer::getGlobalMindB())), 1) +
" dB"; };
363 m_crosspointGainSliders.at(i)->onValueChange = [
this, i] {
364 auto crosspointValues = std::map<std::uint16_t, std::map<std::uint16_t, float>>();
366 auto faderValue = m_crosspointGainSliders.at(i)->getValue();
367 auto in = std::uint16_t(i + 1);
368 auto out = std::uint16_t(m_currentIOChannel.second);
369 crosspointValues[in][out] = float(faderValue);
374 m_crosspointGainSliders.at(i)->onToggleStateChange = [
this, i] {
375 auto crosspointStates = std::map<std::uint16_t, std::map<std::uint16_t, bool>>();
377 auto faderState = m_crosspointGainSliders.at(i)->getToggleState();
378 auto in = std::uint16_t(i + 1);
379 auto out = std::uint16_t(m_currentIOChannel.second);
380 crosspointStates[in][out] = faderState;
385 m_horizontalScrollContainerComponent->addAndMakeVisible(m_crosspointGainSliders.at(i).get());
386 m_crosspointsControlsGrid->items.add(juce::GridItem(m_crosspointGainSliders.at(i).get()));
389 for (
auto i = 0; i < ioCount.first; i++)
391 if (m_crosspointGainSliders.size() > i)
393 auto in = std::uint16_t(i + 1);
394 auto out = std::uint16_t(m_currentIOChannel.second);
397 m_crosspointGainSliders.at(i)->setToggleState(crosspointState, juce::dontSendNotification);
399 m_crosspointGainSliders.at(i)->setValue(
double(crosspointValue), juce::dontSendNotification);
400 m_crosspointGainSliders.at(i)->setVisible(
true);
406 if (force || ioCount.second != m_crosspointGainSliders.size())
408 auto templateRows = juce::Array<juce::Grid::TrackInfo>();
409 for (
auto out = 0; out < ioCount.second; out++)
410 templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
412 m_crosspointGainSliders.resize(ioCount.second);
413 m_crosspointsControlsGrid->items.clear();
414 m_crosspointsControlsGrid->templateColumns = { juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
415 m_crosspointsControlsGrid->templateRows = templateRows;
417 for (
auto o = 0; o < ioCount.second; o++)
419 m_crosspointGainSliders.at(o) = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::LinearHorizontal, juce::Slider::NoTextBox);
420 m_crosspointGainSliders.at(o)->setColour(juce::Slider::ColourIds::trackColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
421 m_crosspointGainSliders.at(o)->setRange(0.0, 1.0, 0.01);
422 m_crosspointGainSliders.at(o)->setTitle(juce::String(o + 1));
423 m_crosspointGainSliders.at(o)->displayValueConverter = [](
double val) {
return juce::String(juce::Decibels::gainToDecibels(val,
static_cast<double>(
ProcessorDataAnalyzer::getGlobalMindB())), 1) +
" dB"; };
427 m_crosspointGainSliders.at(o)->onValueChange = [
this, o] {
428 auto crosspointValues = std::map<std::uint16_t, std::map<std::uint16_t, float>>();
430 auto faderValue = m_crosspointGainSliders.at(o)->getValue();
431 auto in = std::uint16_t(m_currentIOChannel.second);
432 auto out = std::uint16_t(o + 1);
433 crosspointValues[in][out] = float(faderValue);
438 m_crosspointGainSliders.at(o)->onToggleStateChange = [
this, o] {
439 auto crosspointStates = std::map<std::uint16_t, std::map<std::uint16_t, bool>>();
440 auto faderState = m_crosspointGainSliders.at(o)->getToggleState();
441 auto in = std::uint16_t(m_currentIOChannel.second);
442 auto out = std::uint16_t(o + 1);
443 crosspointStates[in][out] = faderState;
448 m_verticalScrollContainerComponent->addAndMakeVisible(m_crosspointGainSliders.at(o).get());
449 m_crosspointsControlsGrid->items.add(juce::GridItem(m_crosspointGainSliders.at(o).get()));
453 for (
auto o = 0; o < ioCount.second; o++)
455 if (m_crosspointGainSliders.size() > o)
457 auto in = std::uint16_t(m_currentIOChannel.second);
458 auto out = std::uint16_t(o + 1);
461 m_crosspointGainSliders.at(o)->setToggleState(crosspointState, juce::dontSendNotification);
463 m_crosspointGainSliders.at(o)->setValue(
double(crosspointValue), juce::dontSendNotification);
464 m_crosspointGainSliders.at(o)->setVisible(
true);
470 if (force || (ioCount.first * ioCount.second) != m_crosspointGainSliders.size())
472 auto templateColumns = juce::Array<juce::Grid::TrackInfo>();
473 for (
auto in = 0; in < ioCount.first; in++)
474 templateColumns.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
475 auto templateRows = juce::Array<juce::Grid::TrackInfo>();
476 for (
auto out = 0; out < ioCount.second; out++)
477 templateRows.add(juce::Grid::TrackInfo(juce::Grid::Px(
m_controlsSize)));
479 m_crosspointGainSliders.resize(ioCount.first * ioCount.second);
480 m_crosspointsControlsGrid->items.clear();
481 m_crosspointsControlsGrid->templateColumns = templateColumns;
482 m_crosspointsControlsGrid->templateRows = templateRows;
484 for (
auto o = 0; o < ioCount.second; o++)
486 for (
auto i = 0; i < ioCount.first; i++)
488 auto idx = o + i * ioCount.second;
489 m_crosspointGainSliders.at(idx) = std::make_unique<JUCEAppBasics::ToggleStateSlider>(juce::Slider::Rotary, juce::Slider::NoTextBox);
490 m_crosspointGainSliders.at(idx)->setColour(juce::Slider::ColourIds::trackColourId, getLookAndFeel().findColour(JUCEAppBasics::CustomLookAndFeel::ColourIds::MeteringRmsColourId));
491 m_crosspointGainSliders.at(idx)->setRange(0.0, 1.0, 0.01);
492 m_crosspointGainSliders.at(idx)->displayValueConverter = [](
double val) {
return juce::String(juce::Decibels::gainToDecibels(val,
static_cast<double>(
ProcessorDataAnalyzer::getGlobalMindB())), 1) +
" dB"; };
496 m_crosspointGainSliders.at(idx)->onValueChange = [
this, idx, i, o] {
497 auto crosspointValues = std::map<std::uint16_t, std::map<std::uint16_t, float>>();
499 auto faderValue = m_crosspointGainSliders.at(idx)->getValue();
500 auto in = std::uint16_t(i + 1);
501 auto out = std::uint16_t(o + 1);
502 crosspointValues[in][out] = float(faderValue);
507 m_crosspointGainSliders.at(idx)->onToggleStateChange = [
this, idx, i, o] {
508 auto crosspointStates = std::map<std::uint16_t, std::map<std::uint16_t, bool>>();
509 auto faderState = m_crosspointGainSliders.at(idx)->getToggleState();
510 auto in = std::uint16_t(i + 1);
511 auto out = std::uint16_t(o + 1);
512 crosspointStates[in][out] = faderState;
517 m_hvScrollContainerComponent->addAndMakeVisible(m_crosspointGainSliders.at(idx).get());
518 m_crosspointsControlsGrid->items.add(juce::GridItem(m_crosspointGainSliders.at(idx).get()));
523 for (
auto i = 0; i < ioCount.first; i++)
525 for (
auto o = 0; o < ioCount.second; o++)
527 auto idx = i * ioCount.second + o;
528 if (m_crosspointGainSliders.size() > idx)
530 auto in = std::uint16_t(i + 1);
531 auto out = std::uint16_t(o + 1);
534 m_crosspointGainSliders.at(idx)->setToggleState(crosspointState, juce::dontSendNotification);
536 m_crosspointGainSliders.at(idx)->setValue(
double(crosspointValue), juce::dontSendNotification);
537 m_crosspointGainSliders.at(idx)->setVisible(
true);