1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:57:35 +00:00

Piano: Allow per-track controls (again)

This makes Piano exactly as usable as when I started the large refactor
some years ago, which *sounds* like I'm a terrible person but now it (1)
looks nicer and (2) has a flexible backend that can already deal with
aribtrary kinds of processors on any track.
This commit is contained in:
kleines Filmröllchen 2023-02-27 15:31:43 +01:00 committed by Jelle Raaijmakers
parent d757027638
commit 0ab19dc4cd
9 changed files with 92 additions and 45 deletions

View file

@ -18,6 +18,7 @@
#include <LibGUI/BoxLayout.h>
#include <LibGUI/Menu.h>
#include <LibGUI/Slider.h>
#include <LibGUI/StackWidget.h>
#include <LibGUI/TabWidget.h>
ErrorOr<NonnullRefPtr<MainWidget>> MainWidget::try_create(TrackManager& manager, AudioPlayerLoop& loop)
@ -47,7 +48,7 @@ ErrorOr<void> MainWidget::initialize()
m_roll_widget->set_fixed_height(300);
(void)TRY(m_tab_widget->try_add_tab<SamplerWidget>("Sampler"_short_string, m_track_manager));
m_player_widget = TRY(try_add<PlayerWidget>(m_track_manager, m_audio_loop));
m_player_widget = TRY(try_add<PlayerWidget>(m_track_manager, *this, m_audio_loop));
m_keys_and_knobs_container = TRY(try_add<GUI::Widget>());
TRY(m_keys_and_knobs_container->try_set_layout<GUI::HorizontalBoxLayout>(GUI::Margins {}, 2));
@ -78,7 +79,11 @@ ErrorOr<void> MainWidget::initialize()
m_octave_value->set_text(String::number(new_octave).release_value_but_fixme_should_propagate_errors());
};
m_knobs_widget = TRY(m_keys_and_knobs_container->try_add<TrackControlsWidget>(m_track_manager, *this));
m_knobs_widget = TRY(m_keys_and_knobs_container->try_add<GUI::StackWidget>());
for (auto track : m_track_manager.tracks())
TRY(m_track_controls.try_append(TRY(m_knobs_widget->try_add<TrackControlsWidget>(TRY(track->try_make_weak_ptr())))));
update_selected_track();
m_roll_widget->set_keys_widget(m_keys_widget);
@ -100,6 +105,20 @@ ErrorOr<void> MainWidget::add_track_actions(GUI::Menu& menu)
return {};
}
void MainWidget::update_selected_track()
{
if (static_cast<size_t>(m_track_manager.track_count()) > m_track_controls.size())
MUST(add_controls_for_current_track());
m_knobs_widget->set_active_widget(m_track_controls.at(m_track_manager.current_track_index()).ptr());
}
ErrorOr<void> MainWidget::add_controls_for_current_track()
{
auto track = m_track_manager.current_track();
TRY(m_track_controls.try_append(TRY(m_knobs_widget->try_add<TrackControlsWidget>(TRY(track->try_make_weak_ptr())))));
return {};
}
// FIXME: There are some unnecessary calls to update() throughout this program,
// which are an easy target for optimization.