diff --git a/Userland/Applications/Piano/MainWidget.cpp b/Userland/Applications/Piano/MainWidget.cpp index db990ef11eb..e08423e269e 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 2ec91dfc7fa..197198b16aa 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 f1d904940ef..8479559e315 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 ff0fbdb5601..6076e8c2310 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 }; };