refactor horizontal scrolling to use same code/modifiers in Editor and PianorollMidiView

This commit is contained in:
Paul Davis 2025-11-24 11:22:50 -07:00
parent 3a337b97ea
commit 71ff8ba3e0
5 changed files with 69 additions and 60 deletions

View file

@ -3918,3 +3918,50 @@ EditingContext::set_minsec_ruler_scale (samplepos_t lower, samplepos_t upper)
minsec_ruler_scale = minsec_show_many_hours; minsec_ruler_scale = minsec_show_many_hours;
} }
} }
void
EditingContext::scroll_left_step ()
{
samplepos_t xdelta = (current_page_samples() / 8);
if (_leftmost_sample > xdelta) {
reset_x_origin (_leftmost_sample - xdelta);
} else {
reset_x_origin (0);
}
}
void
EditingContext::scroll_right_step ()
{
samplepos_t xdelta = (current_page_samples() / 8);
if (max_samplepos - xdelta > _leftmost_sample) {
reset_x_origin (_leftmost_sample + xdelta);
} else {
reset_x_origin (max_samplepos - current_page_samples());
}
}
void
EditingContext::scroll_left_half_page ()
{
samplepos_t xdelta = (current_page_samples() / 2);
if (_leftmost_sample > xdelta) {
reset_x_origin (_leftmost_sample - xdelta);
} else {
reset_x_origin (0);
}
}
void
EditingContext::scroll_right_half_page ()
{
samplepos_t xdelta = (current_page_samples() / 2);
if (max_samplepos - xdelta > _leftmost_sample) {
reset_x_origin (_leftmost_sample + xdelta);
} else {
reset_x_origin (max_samplepos - current_page_samples());
}
}

View file

@ -123,6 +123,11 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
virtual void stop_canvas_autoscroll () = 0; virtual void stop_canvas_autoscroll () = 0;
virtual bool autoscroll_active() const = 0; virtual bool autoscroll_active() const = 0;
void scroll_left_step ();
void scroll_right_step ();
void scroll_left_half_page ();
void scroll_right_half_page ();
virtual void redisplay_grid (bool immediate_redraw) = 0; virtual void redisplay_grid (bool immediate_redraw) = 0;
virtual Temporal::timecnt_t get_nudge_distance (Temporal::timepos_t const & pos, Temporal::timecnt_t& next) const = 0; virtual Temporal::timecnt_t get_nudge_distance (Temporal::timepos_t const & pos, Temporal::timecnt_t& next) const = 0;

View file

@ -344,12 +344,6 @@ public:
bool scroll_up_one_track (bool skip_child_views = false); bool scroll_up_one_track (bool skip_child_views = false);
bool scroll_down_one_track (bool skip_child_views = false); bool scroll_down_one_track (bool skip_child_views = false);
void scroll_left_step ();
void scroll_right_step ();
void scroll_left_half_page ();
void scroll_right_half_page ();
void select_topmost_track (); void select_topmost_track ();
void cleanup_regions (); void cleanup_regions ();

View file

@ -1766,53 +1766,6 @@ Editor::scroll_up_one_track (bool skip_child_views)
return false; return false;
} }
void
Editor::scroll_left_step ()
{
samplepos_t xdelta = (current_page_samples() / 8);
if (_leftmost_sample > xdelta) {
reset_x_origin (_leftmost_sample - xdelta);
} else {
reset_x_origin (0);
}
}
void
Editor::scroll_right_step ()
{
samplepos_t xdelta = (current_page_samples() / 8);
if (max_samplepos - xdelta > _leftmost_sample) {
reset_x_origin (_leftmost_sample + xdelta);
} else {
reset_x_origin (max_samplepos - current_page_samples());
}
}
void
Editor::scroll_left_half_page ()
{
samplepos_t xdelta = (current_page_samples() / 2);
if (_leftmost_sample > xdelta) {
reset_x_origin (_leftmost_sample - xdelta);
} else {
reset_x_origin (0);
}
}
void
Editor::scroll_right_half_page ()
{
samplepos_t xdelta = (current_page_samples() / 2);
if (max_samplepos - xdelta > _leftmost_sample) {
reset_x_origin (_leftmost_sample + xdelta);
} else {
reset_x_origin (max_samplepos - current_page_samples());
}
}
/* ZOOM */ /* ZOOM */
void void

View file

@ -196,19 +196,29 @@ PianorollMidiView::scroll (GdkEventScroll* ev)
return false; return false;
} }
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
switch (ev->direction) { switch (ev->direction) {
case GDK_SCROLL_UP: case GDK_SCROLL_UP:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
_editing_context.scroll_left_step ();
return true;
}
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_editing_context.reset_zoom (_editing_context.get_current_zoom() / 2); _editing_context.reset_zoom (_editing_context.get_current_zoom() / 2);
return true; return true;
}
case GDK_SCROLL_DOWN: case GDK_SCROLL_DOWN:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
_editing_context.scroll_right_step ();
return true;
}
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_editing_context.reset_zoom (_editing_context.get_current_zoom() * 2); _editing_context.reset_zoom (_editing_context.get_current_zoom() * 2);
return true; return true;
}
break;
default: default:
break; break;
} }
}
return MidiView::scroll (ev); return MidiView::scroll (ev);
} }