diff --git a/gtk2_ardour/pianoroll.cc b/gtk2_ardour/pianoroll.cc index 77dcfeeda3..7226debfae 100644 --- a/gtk2_ardour/pianoroll.cc +++ b/gtk2_ardour/pianoroll.cc @@ -32,6 +32,8 @@ #include "canvas/rectangle.h" #include "canvas/widget.h" +#include "ytkmm/scrollbar.h" + #include "gtkmm2ext/actions.h" #include "widgets/ardour_button.h" @@ -268,6 +270,8 @@ Pianoroll::build_lower_toolbar () { ArdourButton::Element elements = ArdourButton::Element (ArdourButton::Text|ArdourButton::Indicator|ArdourButton::Edge|ArdourButton::Body); + _canvas_hscrollbar = manage (new Gtk::HScrollbar (horizontal_adjustment)); + velocity_button = new ArdourButton (_("Velocity"), elements); bender_button = new ArdourButton (_("Bender"), elements); pressure_button = new ArdourButton (_("Pressure"), elements); @@ -326,6 +330,7 @@ Pianoroll::build_lower_toolbar () cc_dropdown2->signal_led_clicked.connect (sigc::bind (sigc::mem_fun (*this, &Pianoroll::user_led_click), cc_dropdown2)); cc_dropdown3->signal_led_clicked.connect (sigc::bind (sigc::mem_fun (*this, &Pianoroll::user_led_click), cc_dropdown3)); + _toolbox.pack_start (*_canvas_hscrollbar, false, false); _toolbox.pack_start (button_bar, false, false); } @@ -834,6 +839,11 @@ Pianoroll::set_samples_per_pixel (samplecnt_t spp) bbt_ruler->set_range (0, current_page_samples()); compute_bbt_ruler_scale (0, current_page_samples()); bbt_metric.units_per_pixel = spp; + + horizontal_adjustment.set_upper (max_zoom_extent().second.samples() / samples_per_pixel); + horizontal_adjustment.set_page_size (current_page_samples()/ samples_per_pixel / 10); + horizontal_adjustment.set_page_increment (current_page_samples()/ samples_per_pixel / 20); + horizontal_adjustment.set_step_increment (current_page_samples() / samples_per_pixel / 100); } samplecnt_t @@ -2188,6 +2198,20 @@ Pianoroll::trigger_prop_change (PBD::PropertyChange const & what_changed) std::shared_ptr mr = std::dynamic_pointer_cast (ref.trigger()->the_region()); if (mr) { set_region (mr); + zoom_to_show (timecnt_t (timepos_t (max_extents_scale() * max_zoom_extent ().second.samples()))); + } + } +} + +void +Pianoroll::region_prop_change (PBD::PropertyChange const & what_changed) +{ + std::cerr << "region prop change " << what_changed << std::endl; + if (what_changed.contains (Properties::length)) { + std::shared_ptr mr = view->midi_region(); + if (mr) { + set_region (mr); + zoom_to_show (timecnt_t (timepos_t (max_extents_scale() * max_zoom_extent ().second.samples()))); } } } @@ -2512,8 +2536,9 @@ Pianoroll::update_solo_display () void Pianoroll::set_region (std::shared_ptr r) { + unset (); + if (!r) { - unset (); return; } @@ -2522,6 +2547,7 @@ Pianoroll::set_region (std::shared_ptr r) view->show_end (true); r->DropReferences.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::unset, this), gui_context()); + r->PropertyChanged.connect (object_connections, invalidator (*this), std::bind (&Pianoroll::region_prop_change, this, _1), gui_context()); bool provided = false; std::shared_ptr map; @@ -2540,7 +2566,6 @@ Pianoroll::set_region (std::shared_ptr r) EditingContext::TempoMapScope tms (*this, map); /* Compute zoom level to show entire source plus some margin if possible */ zoom_to_show (timecnt_t (timepos_t (max_extents_scale() * max_zoom_extent ().second.samples()))); - } _update_connection = Timers::rapid_connect (sigc::mem_fun (*this, &Pianoroll::maybe_update)); diff --git a/gtk2_ardour/pianoroll.h b/gtk2_ardour/pianoroll.h index 5ed317c1ed..b3aa7af092 100644 --- a/gtk2_ardour/pianoroll.h +++ b/gtk2_ardour/pianoroll.h @@ -30,6 +30,7 @@ namespace Gtk { class Widget; + class HScrollbar; } namespace ArdourCanvas { @@ -181,6 +182,8 @@ class Pianoroll : public CueEditor ArdourCanvas::GtkCanvasViewport* _canvas_viewport; ArdourCanvas::GtkCanvas* _canvas; + Gtk::HScrollbar* _canvas_hscrollbar; + /* The group containing all other groups that are scrolled vertically and horizontally. */ @@ -264,6 +267,7 @@ class Pianoroll : public CueEditor PBD::ScopedConnectionList view_connections; void maybe_update (); void trigger_prop_change (PBD::PropertyChange const &); + void region_prop_change (PBD::PropertyChange const &); void unset ();