7 SynthSection(prefix), vertical_(true), selections_enabled_(false), min_modulations_shown_(0), num_shown_(0) {
8 for (
int i = 0; i < number; ++i) {
9 std::string name = prefix +
"_" + std::to_string(i + 1);
10 modulation_buttons_.push_back(std::make_unique<ModulationButton>(name));
12 modulation_buttons_.back()->addListener(
this);
17 SynthSection(name), vertical_(true), selections_enabled_(false), min_modulations_shown_(0), num_shown_(0) {
18 for (
int i = 0; i < number; ++i) {
19 modulation_buttons_.push_back(std::make_unique<ModulationButton>(names[i]));
21 modulation_buttons_.back()->addListener(
this);
28 int num_to_show = getNumModulationsToShow();
29 if (num_shown_ != num_to_show) {
31 num_shown_ = num_to_show;
37 for (
auto& button : modulation_buttons_) {
38 if (button->isVisible()) {
40 Rectangle<int> bounds = getLocalArea(button.get(), button->getLocalBounds());
41 g.reduceClipRegion(bounds);
42 g.setOrigin(bounds.getTopLeft());
43 button->paintBackground(g);
50 SynthSection* parent = findParentComponentOfClass<SynthSection>();
51 if (parent ==
nullptr)
56 g.fillRoundedRectangle(getLocalBounds().toFloat(), rounding_amount);
64 int num_to_show = getNumModulationsToShow();
67 float cell_height = float(getHeight() + 1) / num_to_show;
70 for (
int i = 0; i < num_to_show; ++i) {
72 y = std::round((i + 1) * cell_height);
73 modulation_buttons_[i]->setBounds(0.0f, last_y, getWidth(), y - last_y - 1);
74 modulation_buttons_[i]->setVisible(
true);
78 float cell_width = float(getWidth() + 1) / num_to_show;
81 for (
int i = 0; i < num_to_show; ++i) {
83 x = std::round((i + 1) * cell_width);
84 modulation_buttons_[i]->setBounds(last_x, 0, x - last_x - 1, getHeight());
85 modulation_buttons_[i]->setVisible(
true);
89 for (
int i = num_to_show; i < modulation_buttons_.size(); ++i)
90 modulation_buttons_[i]->setVisible(
false);
92 if (num_to_show != num_shown_ && should_repaint)
97 for (
auto& button : modulation_buttons_) {
98 button->select(
false);
99 button->setActiveModulation(
false);
102 modulation_buttons_[0]->select(selections_enabled_);
104 if (getNumModulationsToShow() != num_shown_)
107 modulation_buttons_[0]->select(selections_enabled_);
108 for (
Listener *listener : listeners_)
109 listener->modulationSelected(
this, 0);
113 int index = getModulationIndex(source->getName());
115 if (selections_enabled_) {
116 for (
int i = 0; i < modulation_buttons_.size(); ++i)
117 modulation_buttons_[i]->select(index == i);
122 for (
Listener *listener : listeners_)
123 listener->modulationSelected(
this, index);
127 if (getNumModulationsToShow() != num_shown_)
132 if (getNumModulationsToShow() != num_shown_)
137 if (getNumModulationsToShow() != num_shown_)
142 for (
auto& button : modulation_buttons_)
147 for (
auto& button : modulation_buttons_)
148 button->setFontSize(font_size);
151int ModulationTabSelector::getNumModulationsToShow() {
152 int num_to_show =
static_cast<int>(modulation_buttons_.size());
153 if (min_modulations_shown_ > 0) {
154 num_to_show = min_modulations_shown_;
155 for (
int i = min_modulations_shown_ - 1; i < modulation_buttons_.size(); ++i) {
156 if (modulation_buttons_[i]->hasAnyModulation())
160 return std::min(num_to_show,
static_cast<int>(modulation_buttons_.size()));
163int ModulationTabSelector::getModulationIndex(String name) {
164 for (
int i = 0; i < modulation_buttons_.size(); ++i) {
165 if (name == modulation_buttons_[i]->getName())
Interface for objects interested in ModulationTabSelector events.
Definition modulation_tab_selector.h:22
void modulationConnectionChanged() override
Called when a modulation connection changes (e.g., a new connection added or removed).
Definition modulation_tab_selector.cpp:131
virtual ~ModulationTabSelector()
Destructor.
ModulationTabSelector(std::string prefix, int number)
Constructs a ModulationTabSelector with a given prefix and number of tabs.
Definition modulation_tab_selector.cpp:6
void reset() override
Resets the tab selector to its default state.
Definition modulation_tab_selector.cpp:96
void paintBackground(Graphics &g) override
Paints the component background and tab shadows.
Definition modulation_tab_selector.cpp:27
void checkNumShown(bool should_repaint)
Checks the number of modulations that should be displayed and updates the layout.
Definition modulation_tab_selector.cpp:63
void resized() override
Called when the component is resized.
Definition modulation_tab_selector.cpp:59
void paintTabShadow(Graphics &g) override
Paints a shadow behind the tabs.
Definition modulation_tab_selector.cpp:49
void registerModulationButtons(SynthSection *synth_section)
Registers all modulation buttons with a given SynthSection.
Definition modulation_tab_selector.cpp:141
void modulationClicked(ModulationButton *source) override
Called when a modulation button within this selector is clicked.
Definition modulation_tab_selector.cpp:112
void modulationCleared() override
Called when all modulations for a source have been cleared.
Definition modulation_tab_selector.cpp:136
void setFontSize(float font_size)
Sets the font size used for the modulation button labels.
Definition modulation_tab_selector.cpp:146
void endModulationMap() override
Called when modulation mapping ends.
Definition modulation_tab_selector.cpp:126
@ kBodyRounding
Definition skin.h:71
@ kBackground
Definition skin.h:128
@ kShadow
Definition skin.h:142
Base class for all synthesizer sections, providing UI layout, painting, and interaction logic.
Definition synth_section.h:193
void addModulationButton(ModulationButton *button, bool show=true)
Adds a modulation button to this section.
Definition synth_section.cpp:438
float findValue(Skin::ValueId value_id) const
Finds a value in the skin overrides or from the parent if not found locally.
Definition synth_section.cpp:18
void addOpenGlComponent(OpenGlComponent *open_gl_component, bool to_beginning=false)
Definition synth_section.cpp:489
virtual void repaintBackground()
Requests a repaint of the background.
Definition synth_section.cpp:96