From 1a3b409ebd51ac767e6e9c3ffa8d180c3edde387 Mon Sep 17 00:00:00 2001 From: gvnnz Date: Fri, 26 Jul 2024 23:49:03 +0200 Subject: [PATCH] Add support for solo-ing groups --- src/core/rendering/reactor.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/core/rendering/reactor.cpp b/src/core/rendering/reactor.cpp index 4db9b190f..baf099dfb 100644 --- a/src/core/rendering/reactor.cpp +++ b/src/core/rendering/reactor.cpp @@ -221,6 +221,30 @@ void Reactor::toggleSolo(ID channelId) ch.setSolo(newSolo); + if (ch.type == ChannelType::GROUP) + { + /* Toggling a solo on a group will toggle solo on all its children too. */ + for (const ID childId : ch.groupChannel->getChildren()) + m_model.get().channels.get(childId).setSolo(newSolo); + } + else if (ch.isGrouped()) + { + const auto noChildrenSoloed = [this](const std::vector& childrenIds) + { + for (const ID childId : childrenIds) + if (m_model.get().channels.get(childId).isSoloed()) + return false; + return true; + }; + /* Turn parent solo on if one of the children has been soloed. Turn parent solo off + if no children are soloed instead. */ + Channel& parent = m_model.get().channels.get(ch.parentId); + if (newSolo) + parent.setSolo(true); + else if (noChildrenSoloed(parent.groupChannel->getChildren())) + parent.setSolo(false); + } + m_model.swap(model::SwapType::SOFT); if (ch.midiLightning.enabled)