From 75bc3ec77ef378a11e3dbf763fe6c315c05a7c10 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 15 Mar 2025 15:47:43 -0600 Subject: [PATCH] transport state tracking for pianoroll transport controls --- gtk2_ardour/pianoroll.cc | 53 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/pianoroll.h | 2 ++ 2 files changed, 55 insertions(+) diff --git a/gtk2_ardour/pianoroll.cc b/gtk2_ardour/pianoroll.cc index 7705f15fad..03e463fece 100644 --- a/gtk2_ardour/pianoroll.cc +++ b/gtk2_ardour/pianoroll.cc @@ -388,7 +388,9 @@ Pianoroll::build_upper_toolbar () play_button.set_icon (ArdourIcon::TransportPlay); + play_button.set_name ("transport button"); loop_button.set_icon (ArdourIcon::TransportLoop); + loop_button.set_name ("transport button"); solo_button.set_name ("solo button"); @@ -2724,3 +2726,54 @@ Pianoroll::select_all_within (Temporal::timepos_t const & start, Temporal::timep commit_reversible_selection_op (); } + +void +Pianoroll::set_session (ARDOUR::Session* s) +{ + CueEditor::set_session (s); + + if (_session) { + _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, std::bind (&Pianoroll::map_transport_state, this), gui_context()); + } else { + _session_connections.drop_connections(); + } + + map_transport_state (); +} + +void +Pianoroll::map_transport_state () +{ + if (!_session) { + loop_button.unset_active_state (); + play_button.unset_active_state (); + return; + } + + if (_session->transport_rolling()) { + + /* we're rolling */ + + if (_session->get_play_loop ()) { + + loop_button.set_active (true); + + if (Config->get_loop_is_mode()) { + play_button.set_active (true); + } else { + play_button.set_active (false); + } + } else { + play_button.set_active (true); + loop_button.set_active (false); + } + } else { + play_button.set_active (false); + + if (Config->get_loop_is_mode()) { + loop_button.set_active (true); + } else { + loop_button.set_active (false); + } + } +} diff --git a/gtk2_ardour/pianoroll.h b/gtk2_ardour/pianoroll.h index 827836dd64..1b525fc28b 100644 --- a/gtk2_ardour/pianoroll.h +++ b/gtk2_ardour/pianoroll.h @@ -137,6 +137,7 @@ class Pianoroll : public CueEditor void cut_copy (Editing::CutCopyOp); PianorollMidiView* midi_view() const { return view; } + void set_session (ARDOUR::Session*); protected: void load_bindings (); @@ -318,4 +319,5 @@ class Pianoroll : public CueEditor void visible_channel_changed (); void update_solo_display (); + void map_transport_state (); };