44 auto bounds = getLocalBounds();
47 m_outputLevels->setBounds(bounds
48 .removeFromRight(bounds.getWidth() -
int(s_channelSize + s_channelGap))
49 .removeFromTop(
int(m_outputMutes.size() * (s_channelSize + s_channelGap))));
51 if (!m_outputMutes.empty())
53 auto muteHeight = int(s_channelSize + s_channelGap);
54 for (
auto const& outputMuteKV : m_outputMutes)
56 outputMuteKV.second->setBounds(bounds.removeFromTop(muteHeight).reduced(2));
111 if (m_channelCount != channelCount)
113 m_channelCount = channelCount;
114 DBG(__FUNCTION__ <<
" " <<
int(channelCount));
116 m_outputLevels->setChannelCount(channelCount);
118 auto channelsToRemove = std::vector<std::uint16_t>();
119 for (
auto const& outputMuteKV : m_outputMutes)
121 if (outputMuteKV.first > channelCount)
122 channelsToRemove.push_back(outputMuteKV.first);
124 for (
auto const& channel : channelsToRemove)
126 removeChildComponent(m_outputMutes.at(channel).get());
127 auto iter = std::find_if(m_outputMutes.begin(), m_outputMutes.end(), [=](
const auto& outputMuteKV) { return outputMuteKV.first == channel; });
128 if (iter != m_outputMutes.end())
129 m_outputMutes.erase(iter);
132 for (std::uint16_t channel = 1; channel <= channelCount; channel++)
134 if (m_outputMutes.count(channel) == 0)
136 m_outputMutes[channel] =std::make_unique<juce::TextButton>(
"M",
"Mute");
137 m_outputMutes.at(channel)->setClickingTogglesState(
true);
138 m_outputMutes.at(channel)->addListener(
this);
139 m_outputMutes.at(channel)->setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colours::red);
140 addAndMakeVisible(m_outputMutes.at(channel).get());
153 auto iter = std::find_if(m_outputMutes.begin(), m_outputMutes.end(), [=](
const auto& outputMuteKV) { return outputMuteKV.second.get() == button; });
154 if (iter != m_outputMutes.end() &&
nullptr != iter->second)