Round to bars when mouse scroll/dragging BBT bars

This commit is contained in:
Robin Gareus
2024-12-18 18:30:15 +01:00
parent d34213d7f3
commit 561f0579f0
6 changed files with 19 additions and 12 deletions

View File

@@ -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));

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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<bool, ARDOUR::ClockDeltaMode> change_display_delta_mode_signal;
sigc::signal<void> CanonicalClockChanged;