From 7b3b743f888b57e9bb07867e7fe41fd1eb5a737a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Thu, 9 Feb 2023 15:26:26 +0100 Subject: [PATCH] Piano: Move octave controls into main widget This is not related to the track controls and it may move into another separate widget in the future. The move also allows to simplify the octave slider callback logic. --- Userland/Applications/Piano/MainWidget.cpp | 36 ++++++++++++++----- Userland/Applications/Piano/MainWidget.h | 9 +++-- .../Piano/TrackControlsWidget.cpp | 33 +---------------- .../Applications/Piano/TrackControlsWidget.h | 8 ----- 4 files changed, 36 insertions(+), 50 deletions(-) diff --git a/Userland/Applications/Piano/MainWidget.cpp b/Userland/Applications/Piano/MainWidget.cpp index db990ef11e..e08423e269 100644 --- a/Userland/Applications/Piano/MainWidget.cpp +++ b/Userland/Applications/Piano/MainWidget.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include ErrorOr> MainWidget::try_create(TrackManager& manager, AudioPlayerLoop& loop) @@ -55,6 +56,28 @@ ErrorOr MainWidget::initialize() m_keys_widget = TRY(m_keys_and_knobs_container->try_add(m_track_manager.keyboard())); + m_octave_container = TRY(m_keys_and_knobs_container->try_add()); + m_octave_container->set_preferred_width(GUI::SpecialDimension::Fit); + TRY(m_octave_container->try_set_layout()); + auto octave_label = TRY(m_octave_container->try_add("Octave")); + octave_label->set_preferred_width(GUI::SpecialDimension::Fit); + m_octave_value = TRY(m_octave_container->try_add(DeprecatedString::number(m_track_manager.keyboard()->virtual_keyboard_octave()))); + m_octave_value->set_preferred_width(GUI::SpecialDimension::Fit); + + // FIXME: Implement vertical flipping in GUI::Slider, not here. + m_octave_knob = TRY(m_octave_container->try_add()); + m_octave_knob->set_preferred_width(GUI::SpecialDimension::Fit); + m_octave_knob->set_tooltip("Z: octave down, X: octave up"); + m_octave_knob->set_range(octave_min - 1, octave_max - 1); + m_octave_knob->set_value((octave_max - 1) - (m_track_manager.keyboard()->virtual_keyboard_octave() - 1)); + m_octave_knob->set_step(1); + m_octave_knob->on_change = [this](int value) { + int new_octave = octave_max - value; + set_octave_via_slider(new_octave); + VERIFY(new_octave == m_track_manager.keyboard()->virtual_keyboard_octave()); + m_octave_value->set_text(DeprecatedString::number(new_octave)); + }; + m_knobs_widget = TRY(m_keys_and_knobs_container->try_add(m_track_manager, *this)); m_roll_widget->set_keys_widget(m_keys_widget); @@ -72,8 +95,6 @@ ErrorOr MainWidget::add_track_actions(GUI::Menu& menu) turn_off_pressed_keys(); m_player_widget->next_track(); turn_on_pressed_keys(); - - m_knobs_widget->update_knobs(); }))); return {}; @@ -131,10 +152,10 @@ bool MainWidget::special_key_action(int key_code) { switch (key_code) { case Key_Z: - set_octave_and_ensure_note_change(DSP::Keyboard::Direction::Down); + change_octave_via_keys(DSP::Keyboard::Direction::Down); return true; case Key_X: - set_octave_and_ensure_note_change(DSP::Keyboard::Direction::Up); + change_octave_via_keys(DSP::Keyboard::Direction::Up); return true; case Key_Space: m_player_widget->toggle_paused(); @@ -164,22 +185,21 @@ void MainWidget::turn_on_pressed_keys() } } -void MainWidget::set_octave_and_ensure_note_change(int octave) +void MainWidget::set_octave_via_slider(int octave) { turn_off_pressed_keys(); MUST(m_track_manager.keyboard()->set_virtual_keyboard_octave(octave)); turn_on_pressed_keys(); - m_knobs_widget->update_knobs(); m_keys_widget->update(); } -void MainWidget::set_octave_and_ensure_note_change(DSP::Keyboard::Direction direction) +void MainWidget::change_octave_via_keys(DSP::Keyboard::Direction direction) { turn_off_pressed_keys(); m_track_manager.keyboard()->change_virtual_keyboard_octave(direction); turn_on_pressed_keys(); - m_knobs_widget->update_knobs(); + m_octave_knob->set_value(octave_max - m_track_manager.keyboard()->virtual_keyboard_octave()); m_keys_widget->update(); } diff --git a/Userland/Applications/Piano/MainWidget.h b/Userland/Applications/Piano/MainWidget.h index 2ec91dfc7f..197198b16a 100644 --- a/Userland/Applications/Piano/MainWidget.h +++ b/Userland/Applications/Piano/MainWidget.h @@ -30,8 +30,8 @@ public: ErrorOr add_track_actions(GUI::Menu&); - void set_octave_and_ensure_note_change(DSP::Keyboard::Direction); - void set_octave_and_ensure_note_change(int); + void change_octave_via_keys(DSP::Keyboard::Direction); + void set_octave_via_slider(int octave); private: explicit MainWidget(TrackManager&, AudioPlayerLoop&); @@ -60,6 +60,11 @@ private: RefPtr m_knobs_widget; RefPtr m_player_widget; + RefPtr m_octave_container; + RefPtr m_octave_knob; + RefPtr m_octave_value; + bool m_octave_change_in_progress { false }; + // Not the piano keys, but the computer keyboard keys! bool m_keys_pressed[key_code_count] { false }; }; diff --git a/Userland/Applications/Piano/TrackControlsWidget.cpp b/Userland/Applications/Piano/TrackControlsWidget.cpp index f1d904940e..8479559e31 100644 --- a/Userland/Applications/Piano/TrackControlsWidget.cpp +++ b/Userland/Applications/Piano/TrackControlsWidget.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include TrackControlsWidget::TrackControlsWidget(TrackManager& track_manager, MainWidget& main_widget) @@ -21,27 +20,9 @@ TrackControlsWidget::TrackControlsWidget(TrackManager& track_manager, MainWidget , m_main_widget(main_widget) { set_layout(); + set_preferred_width(GUI::SpecialDimension::Grow); set_fill_with_background_color(true); - m_octave_container = add(); - m_octave_container->set_layout(); - m_octave_container->add("Octave"); - m_octave_value = m_octave_container->add(DeprecatedString::number(m_track_manager.keyboard()->virtual_keyboard_octave())); - - // FIXME: Implement vertical flipping in GUI::Slider, not here. - m_octave_knob = m_octave_container->add(); - m_octave_knob->set_tooltip("Z: octave down, X: octave up"); - m_octave_knob->set_range(octave_min - 1, octave_max - 1); - m_octave_knob->set_value((octave_max - 1) - (m_track_manager.keyboard()->virtual_keyboard_octave() - 1)); - m_octave_knob->set_step(1); - m_octave_knob->on_change = [this](int value) { - int new_octave = octave_max - value; - if (m_change_underlying) - m_main_widget.set_octave_and_ensure_note_change(new_octave); - VERIFY(new_octave == m_track_manager.keyboard()->virtual_keyboard_octave()); - m_octave_value->set_text(DeprecatedString::number(new_octave)); - }; - for (auto& parameter : m_track_manager.current_track()->track_mastering()->parameters()) m_parameter_widgets.append(add(parameter)); @@ -51,15 +32,3 @@ TrackControlsWidget::TrackControlsWidget(TrackManager& track_manager, MainWidget for (auto& parameter : m_track_manager.current_track()->delay()->parameters()) m_parameter_widgets.append(add(parameter)); } - -void TrackControlsWidget::update_knobs() -{ - // FIXME: This is needed because when the slider is changed normally, we - // need to change the underlying value, but if the keyboard was used, we - // need to change the slider without changing the underlying value. - m_change_underlying = false; - - m_octave_knob->set_value(octave_max - m_track_manager.keyboard()->virtual_keyboard_octave()); - - m_change_underlying = true; -} diff --git a/Userland/Applications/Piano/TrackControlsWidget.h b/Userland/Applications/Piano/TrackControlsWidget.h index ff0fbdb560..6076e8c231 100644 --- a/Userland/Applications/Piano/TrackControlsWidget.h +++ b/Userland/Applications/Piano/TrackControlsWidget.h @@ -24,19 +24,11 @@ class TrackControlsWidget final : public GUI::Frame { public: virtual ~TrackControlsWidget() override = default; - void update_knobs(); - private: TrackControlsWidget(TrackManager&, MainWidget&); TrackManager& m_track_manager; MainWidget& m_main_widget; - RefPtr m_octave_container; - RefPtr m_octave_knob; - RefPtr m_octave_value; - NonnullRefPtrVector m_parameter_widgets; - - bool m_change_underlying { true }; };