13
0

redesign (MIDI)RegionView display disabling around an RAII model

This commit is contained in:
Paul Davis 2022-03-30 16:44:04 -06:00
parent 1d10408bd1
commit b8a6b97b49
9 changed files with 68 additions and 59 deletions

View File

@ -144,6 +144,8 @@ public:
return _end_xfade_visible; return _end_xfade_visible;
} }
void redisplay () {}
protected: protected:
/* this constructor allows derived types /* this constructor allows derived types

View File

@ -79,6 +79,8 @@ AutomationRegionView::~AutomationRegionView ()
void void
AutomationRegionView::init (bool /*wfd*/) AutomationRegionView::init (bool /*wfd*/)
{ {
DisplaySuspender (*this);
RegionView::init (false); RegionView::init (false);
reset_width_dependent_items ((double) _region->length_samples() / samples_per_pixel); reset_width_dependent_items ((double) _region->length_samples() / samples_per_pixel);
@ -87,8 +89,6 @@ AutomationRegionView::init (bool /*wfd*/)
fill_color_name = "midi frame base"; fill_color_name = "midi frame base";
set_colors (); set_colors ();
enable_display ();
} }
void void

View File

@ -67,6 +67,7 @@ public:
void set_height (double); void set_height (double);
void reset_width_dependent_items(double pixel_width); void reset_width_dependent_items(double pixel_width);
void redisplay () {}
protected: protected:
void create_line(boost::shared_ptr<ARDOUR::AutomationList> list); void create_line(boost::shared_ptr<ARDOUR::AutomationList> list);

View File

@ -105,8 +105,7 @@ AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region
arv->line()->set_list (list); arv->line()->set_list (list);
} }
(*i)->set_valid (true); (*i)->set_valid (true);
(*i)->enable_display (); display_region (arv);
display_region(arv);
return 0; return 0;
} }
@ -123,7 +122,6 @@ AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region
/* follow global waveform setting */ /* follow global waveform setting */
region_view->enable_display();
display_region (region_view); display_region (region_view);
/* catch regionview going away */ /* catch regionview going away */
@ -167,10 +165,12 @@ AutomationStreamView::set_automation_state (AutoState state)
void void
AutomationStreamView::redisplay_track () AutomationStreamView::redisplay_track ()
{ {
vector<RegionView::DisplaySuspender> vds;
// Flag region views as invalid and disable drawing // Flag region views as invalid and disable drawing
for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) { for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_valid (false); (*i)->set_valid (false);
(*i)->disable_display (); vds.push_back (RegionView::DisplaySuspender (**i));
} }
// Add and display region views, and flag them as valid // Add and display region views, and flag them as valid

View File

@ -255,6 +255,8 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
void void
MidiRegionView::init (bool /*wfd*/) MidiRegionView::init (bool /*wfd*/)
{ {
DisplaySuspender ds (*this);
PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys)); PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
_model = midi_region()->midi_source(0)->model(); _model = midi_region()->midi_source(0)->model();
@ -271,10 +273,8 @@ MidiRegionView::init (bool /*wfd*/)
region_resized (ARDOUR::bounds_change); region_resized (ARDOUR::bounds_change);
//region_locked (); //region_locked ();
disable_display ();
set_colors (); set_colors ();
reset_width_dependent_items (_pixel_width); reset_width_dependent_items (_pixel_width);
enable_display ();
display_model (_model); display_model (_model);
@ -1078,9 +1078,21 @@ MidiRegionView::get_events (Events& e, Evoral::Sequence<Temporal::Beats>::NoteOp
} }
} }
void
MidiRegionView::redisplay ()
{
redisplay_model ();
}
void void
MidiRegionView::redisplay_model() MidiRegionView::redisplay_model()
{ {
if (!display_enabled()) {
return;
}
// CALLGRIND_START_INSTRUMENTATION;
group->canvas()->freeze_queue_draw (); group->canvas()->freeze_queue_draw ();
if (_active_notes) { if (_active_notes) {
@ -1195,7 +1207,7 @@ MidiRegionView::redisplay_model()
for (set<Evoral::event_id_t>::iterator it = _pending_note_selection.begin(); it != _pending_note_selection.end(); ++it) { for (set<Evoral::event_id_t>::iterator it = _pending_note_selection.begin(); it != _pending_note_selection.end(); ++it) {
if ((*it) == note->id()) { if ((*it) == note->id()) {
add_to_selection (cne); // add_to_selection (cne);
} }
} }
} }
@ -1215,6 +1227,9 @@ MidiRegionView::redisplay_model()
_pending_note_selection.clear (); _pending_note_selection.clear ();
group->canvas()->thaw_queue_draw (); group->canvas()->thaw_queue_draw ();
// CALLGRIND_STOP_INSTRUMENTATION;
// CALLGRIND_DUMP_STATS;
} }
void void
@ -1372,17 +1387,6 @@ void
MidiRegionView::region_resized (const PropertyChange& what_changed) MidiRegionView::region_resized (const PropertyChange& what_changed)
{ {
RegionView::region_resized(what_changed); // calls RegionView::set_duration() RegionView::region_resized(what_changed); // calls RegionView::set_duration()
#if 0
/* catch end and start trim so we can update the view*/
if (!what_changed.contains (ARDOUR::Properties::start) &&
what_changed.contains (ARDOUR::Properties::length)) {
enable_display ();
} else if (what_changed.contains (ARDOUR::Properties::start) &&
what_changed.contains (ARDOUR::Properties::length)) {
enable_display ();
}
#endif
} }
void void
@ -4011,18 +4015,6 @@ MidiRegionView::color_handler ()
/* XXX probably more to do here */ /* XXX probably more to do here */
} }
void
MidiRegionView::enable_display ()
{
bool was_disabled = !display_enabled();
RegionView::enable_display ();
if (was_disabled && display_enabled()) {
redisplay_model ();
}
}
void void
MidiRegionView::show_step_edit_cursor (Temporal::Beats pos) MidiRegionView::show_step_edit_cursor (Temporal::Beats pos)
{ {

View File

@ -120,6 +120,7 @@ public:
void hide_step_edit_cursor (); void hide_step_edit_cursor ();
void set_step_edit_cursor_width (Temporal::Beats beats); void set_step_edit_cursor_width (Temporal::Beats beats);
virtual void redisplay ();
void redisplay_model(); void redisplay_model();
GhostRegion* add_ghost (TimeAxisView&); GhostRegion* add_ghost (TimeAxisView&);
@ -297,8 +298,6 @@ public:
void selection_as_notelist (Notes& selected, bool allow_all_if_none_selected = false); void selection_as_notelist (Notes& selected, bool allow_all_if_none_selected = false);
void enable_display ();
void set_channel_selector_scoped_note(NoteBase* note){ _channel_selection_scoped_note = note; } void set_channel_selector_scoped_note(NoteBase* note){ _channel_selection_scoped_note = note; }
NoteBase* channel_selector_scoped_note(){ return _channel_selection_scoped_note; } NoteBase* channel_selector_scoped_note(){ return _channel_selection_scoped_note; }

View File

@ -158,19 +158,18 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait
} }
region_views.push_front (region_view); region_views.push_front (region_view);
region_view->disable_display ();
{
RegionView::DisplaySuspender ds (*region_view);
display_region (region_view, wait_for_data); display_region (region_view, wait_for_data);
/* fit note range if we are importing */ /* fit note range if we are importing */
if (_trackview.session()->operation_in_progress (Operations::insert_file)) { if (_trackview.session()->operation_in_progress (Operations::insert_file)) {
/* this will call display_region() */ /* this will call display_region() */
set_note_range (ContentsRange); set_note_range (ContentsRange);
} else {
/* display events and find note range */
region_view->redisplay_model ();
} }
}
region_view->enable_display ();
/* catch regionview going away */ /* catch regionview going away */
boost::weak_ptr<Region> wr (region); // make this explicit boost::weak_ptr<Region> wr (region); // make this explicit
@ -188,7 +187,8 @@ MidiStreamView::display_region (MidiRegionView* region_view, bool load_model)
return; return;
} }
region_view->disable_display (); RegionView::DisplaySuspender ds (*region_view);
region_view->set_height (child_height()); region_view->set_height (child_height());
boost::shared_ptr<MidiSource> source (region_view->midi_region()->midi_source(0)); boost::shared_ptr<MidiSource> source (region_view->midi_region()->midi_source(0));
@ -206,7 +206,6 @@ MidiStreamView::display_region (MidiRegionView* region_view, bool load_model)
_range_dirty = update_data_note_range (source->model()->lowest_note(), source->model()->highest_note()); _range_dirty = update_data_note_range (source->model()->lowest_note(), source->model()->highest_note());
// Display region contents // Display region contents
region_view->enable_display ();
region_view->display_model (source->model()); region_view->display_model (source->model());
} }
@ -281,10 +280,12 @@ MidiStreamView::redisplay_track ()
_data_note_max = 71; _data_note_max = 71;
} }
vector<RegionView::DisplaySuspender> vds;
// Flag region views as invalid and disable drawing // Flag region views as invalid and disable drawing
for (i = region_views.begin(); i != region_views.end(); ++i) { for (i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_valid(false); (*i)->set_valid (false);
(*i)->disable_display (); vds.push_back (RegionView::DisplaySuspender (**i));
} }
// Add and display region views, and flag them as valid // Add and display region views, and flag them as valid
@ -294,7 +295,7 @@ MidiStreamView::redisplay_track ()
layer_regions(); layer_regions();
// Update note range (not regions which are correct) and draw note lines // Update note range (not regions which are correct) and draw note lines
apply_note_range(_lowest_note, _highest_note, false); apply_note_range (_lowest_note, _highest_note, false);
} }
void void

View File

@ -89,7 +89,7 @@ RegionView::RegionView (ArdourCanvas::Container* parent,
, editor(0) , editor(0)
, current_visible_sync_position(0.0) , current_visible_sync_position(0.0)
, valid(false) , valid(false)
, _disable_display (1) , _disable_display (0)
, _pixel_width(1.0) , _pixel_width(1.0)
, in_destructor(false) , in_destructor(false)
, wait_for_data(false) , wait_for_data(false)
@ -170,7 +170,7 @@ RegionView::RegionView (ArdourCanvas::Container* parent,
, editor(0) , editor(0)
, current_visible_sync_position(0.0) , current_visible_sync_position(0.0)
, valid(false) , valid(false)
, _disable_display (1) , _disable_display (0)
, _pixel_width(1.0) , _pixel_width(1.0)
, in_destructor(false) , in_destructor(false)
, wait_for_data(false) , wait_for_data(false)
@ -238,10 +238,6 @@ RegionView::init (bool wfd)
_cue_markers_visible = false; _cue_markers_visible = false;
update_cue_markers (); update_cue_markers ();
if (wfd) {
enable_display ();
}
/* derived class calls set_height () including RegionView::set_height() in ::init() */ /* derived class calls set_height () including RegionView::set_height() in ::init() */
//set_height (trackview.current_height()); //set_height (trackview.current_height());
@ -1263,6 +1259,9 @@ RegionView::enable_display ()
std::cerr << "EnableDisplay " << this << " currently " << _disable_display << std::endl; std::cerr << "EnableDisplay " << this << " currently " << _disable_display << std::endl;
if (_disable_display) { if (_disable_display) {
_disable_display--; _disable_display--;
if (_disable_display == 0) {
redisplay ();
}
} }
} }

View File

@ -101,9 +101,19 @@ public:
virtual void entered () {} virtual void entered () {}
virtual void exited () {} virtual void exited () {}
virtual void enable_display();
virtual void disable_display();
bool display_enabled() const; bool display_enabled() const;
virtual void redisplay() = 0;
struct DisplaySuspender {
DisplaySuspender (RegionView& rv) : region_view (rv) {
region_view.disable_display ();
}
~DisplaySuspender () {
region_view.enable_display ();
}
RegionView& region_view;
};
virtual void update_coverage_frame (LayerDisplay); virtual void update_coverage_frame (LayerDisplay);
static PBD::Signal1<void,RegionView*> RegionViewGoingAway; static PBD::Signal1<void,RegionView*> RegionViewGoingAway;
@ -228,6 +238,11 @@ private:
typedef std::list<ViewCueMarker*> ViewCueMarkers; typedef std::list<ViewCueMarker*> ViewCueMarkers;
ViewCueMarkers _cue_markers; ViewCueMarkers _cue_markers;
bool _cue_markers_visible; bool _cue_markers_visible;
private:
friend class DisplaySuspender;
void enable_display();
void disable_display();
}; };
#endif /* __gtk_ardour_region_view_h__ */ #endif /* __gtk_ardour_region_view_h__ */