From 561f0579f01e6e017ce05869cdeebf91512e5284 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 18 Dec 2024 18:30:15 +0100 Subject: [PATCH] Round to bars when mouse scroll/dragging BBT bars --- gtk2_ardour/ardour_ui2.cc | 4 ++-- gtk2_ardour/audio_clock.cc | 19 +++++++++++++------ gtk2_ardour/audio_clock.h | 2 +- gtk2_ardour/big_clock_window.cc | 2 +- gtk2_ardour/main_clock.cc | 2 +- gtk2_ardour/main_clock.h | 2 +- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 030e67c562..ccfd577884 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -179,8 +179,8 @@ ARDOUR_UI::setup_transport () trigger_page_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-trigger-visibility"))); /* connect signals */ - ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (primary_clock, &MainClock::set), false)); - ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (secondary_clock, &MainClock::set), false)); + ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (primary_clock, &MainClock::set), false, false)); + ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (secondary_clock, &MainClock::set), false, false)); editor_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), editor)); mixer_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), mixer)); diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 0f79fc2e76..bf6faf43c0 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -931,7 +931,7 @@ AudioClock::set_duration (Temporal::timecnt_t const & dur, bool force) } void -AudioClock::set (timepos_t const & w, bool force) +AudioClock::set (timepos_t const & w, bool force, bool round_to_beat) { is_duration = false; @@ -961,6 +961,11 @@ AudioClock::set (timepos_t const & w, bool force) break; case BBT: + if (round_to_beat) { + TempoMap::SharedPtr tmap (TempoMap::use()); + Temporal::BBT_Argument BBT = tmap->round_to_bar (tmap->bbt_at (when)); + when = Temporal::timepos_t::from_superclock (tmap->superclock_at(BBT)); + } set_bbt (timecnt_t (when)); btn_en = true; break; @@ -1825,6 +1830,7 @@ AudioClock::on_scroll_event (GdkEventScroll *ev) Field f = index_to_field (index); timepos_t step; + timecnt_t beat = timecnt_t (Temporal::Beats (1, 0)); switch (ev->direction) { @@ -1837,7 +1843,7 @@ AudioClock::on_scroll_event (GdkEventScroll *ev) if (is_duration) { AudioClock::set_duration (current_duration() + step, true); // XXX step is too small ?! } else { - AudioClock::set (last_when() + step, true); + AudioClock::set (last_when() + step, true, step > beat); } ValueChanged (); /* EMIT_SIGNAL */ } @@ -1856,7 +1862,7 @@ AudioClock::on_scroll_event (GdkEventScroll *ev) } else if (!_negative_allowed && last_when() < step) { AudioClock::set (timepos_t (), true); } else { - AudioClock::set (last_when().earlier (step), true); + AudioClock::set (last_when().earlier (step), true, step > beat); } ValueChanged (); /* EMIT_SIGNAL */ @@ -1888,6 +1894,7 @@ AudioClock::on_motion_notify_event (GdkEventMotion *ev) timepos_t pos = last_when (); timepos_t step = get_incremental_step (drag_field, pos); + timecnt_t beat = timecnt_t (Temporal::Beats (1, 0)); step *= fabs (drag_accum); @@ -1898,9 +1905,9 @@ AudioClock::on_motion_notify_event (GdkEventMotion *ev) AudioClock::set_duration (current_duration () - step, false); } } else if (!step.is_zero () && (step < pos)) { - AudioClock::set (pos.earlier (step), false); + AudioClock::set (pos.earlier (step), false, step > beat); } else { - AudioClock::set (timepos_t () , false); + AudioClock::set (timepos_t (), false); } } else if (is_duration) { @@ -1908,7 +1915,7 @@ AudioClock::on_motion_notify_event (GdkEventMotion *ev) AudioClock::set_duration (current_duration () + step, false); } else { /* negative so upward motion .. increment clock */ - AudioClock::set (pos + step, false); + AudioClock::set (pos + step, false, step > beat); } diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h index ac4ee42f7d..6f8b9741a1 100644 --- a/gtk2_ardour/audio_clock.h +++ b/gtk2_ardour/audio_clock.h @@ -73,7 +73,7 @@ public: void focus (); /* overridden by MainClock */ - virtual void set (Temporal::timepos_t const &, bool force = false); + virtual void set (Temporal::timepos_t const &, bool force = false, bool round_to_beat = false); void set_duration (Temporal::timecnt_t const &, bool force = false); virtual void set_mode (Mode); diff --git a/gtk2_ardour/big_clock_window.cc b/gtk2_ardour/big_clock_window.cc index dfabc440f7..6411fb5c5e 100644 --- a/gtk2_ardour/big_clock_window.cc +++ b/gtk2_ardour/big_clock_window.cc @@ -39,7 +39,7 @@ BigClockWindow::BigClockWindow (AudioClock& c) : ArdourWindow (_("Big Clock")) , clock (c) { - ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (clock, &AudioClock::set), false)); + ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (clock, &AudioClock::set), false, false)); clock.set_corner_radius (0.0); diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index a7919e0a23..234fa60833 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -117,7 +117,7 @@ MainClock::build_ops_menu () } void -MainClock::set (timepos_t const & when, bool force) +MainClock::set (timepos_t const & when, bool force, bool round_to_beat) { if (!AudioEngine::instance()->session()) { _delta_mode = NoDelta; diff --git a/gtk2_ardour/main_clock.h b/gtk2_ardour/main_clock.h index bc213c9e07..a186d54cbd 100644 --- a/gtk2_ardour/main_clock.h +++ b/gtk2_ardour/main_clock.h @@ -38,7 +38,7 @@ public: ARDOUR::ClockDeltaMode display_delta_mode () {return _delta_mode;} void set_display_delta_mode (ARDOUR::ClockDeltaMode m); - void set (Temporal::timepos_t const &, bool force = false); + void set (Temporal::timepos_t const &, bool force = false, bool round_to_beat = false); sigc::signal change_display_delta_mode_signal; sigc::signal CanonicalClockChanged;