pianoroll: if invisible, defer (expensive) ::set_region() till shown

This commit is contained in:
Paul Davis 2025-06-24 19:17:47 -06:00
parent 1fbd7c7124
commit bdf9dec411
2 changed files with 18 additions and 1 deletions

View file

@ -639,10 +639,19 @@ Pianoroll::build_canvas ()
_canvas->set_name ("MidiCueCanvas");
_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
_canvas->set_can_focus ();
_canvas->signal_show().connect (sigc::mem_fun (*this, &Pianoroll::catch_pending_show_region));
_toolbox.pack_start (*_canvas_viewport, true, true);
}
void
Pianoroll::catch_pending_show_region ()
{
if (_visible_pending_region) {
set_region (_visible_pending_region);
_visible_pending_region.reset ();
}
}
bool
Pianoroll::bbt_ruler_event (GdkEvent* ev)
{
@ -2603,6 +2612,11 @@ Pianoroll::update_solo_display ()
void
Pianoroll::set_region (std::shared_ptr<ARDOUR::MidiRegion> r)
{
if (!get_canvas()->is_visible()) {
_visible_pending_region = r;
return;
}
unset (false);
if (!r) {

View file

@ -352,4 +352,7 @@ class Pianoroll : public CueEditor
Gtk::Menu _region_context_menu;
void popup_region_context_menu (ArdourCanvas::Item* item, GdkEvent* event);
std::shared_ptr<ARDOUR::MidiRegion> _visible_pending_region;
void catch_pending_show_region ();
};