suspend editor redisplay during batch changes

(major speed-up when changing all meters)
This commit is contained in:
Robin Gareus
2015-04-30 18:01:30 +02:00
parent ae38128f88
commit e3375c309a
2 changed files with 21 additions and 3 deletions

View File

@@ -77,7 +77,8 @@ EditorRoutes::EditorRoutes (Editor* e)
, _menu (0) , _menu (0)
, old_focus (0) , old_focus (0)
, selection_countdown (0) , selection_countdown (0)
, name_editable (0) , name_editable (0)
, _redisplay_on_resume (false)
{ {
static const int column_width = 22; static const int column_width = 22;
@@ -360,6 +361,13 @@ EditorRoutes::set_session (Session* s)
if (_session) { if (_session) {
_session->SoloChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::solo_changed_so_update_mute, this), gui_context()); _session->SoloChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::solo_changed_so_update_mute, this), gui_context());
_session->RecordStateChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context()); _session->RecordStateChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
/* TODO: check if these needs to be tied in with DisplaySuspender
* Given that the UI is single-threaded and DisplaySuspender is only used
* in loops in the UI thread all should be fine.
*/
_session->BatchUpdateStart.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::suspend_redisplay, this), gui_context());
_session->BatchUpdateEnd.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::resume_redisplay, this), gui_context());
} }
} }
@@ -549,7 +557,12 @@ EditorRoutes::redisplay_real ()
void void
EditorRoutes::redisplay () EditorRoutes::redisplay ()
{ {
if (_no_redisplay || !_session || _session->deletion_in_progress()) { if (!_session || _session->deletion_in_progress()) {
return;
}
if (_no_redisplay) {
_redisplay_on_resume = true;
return; return;
} }

View File

@@ -38,13 +38,18 @@ public:
void move_selected_tracks (bool); void move_selected_tracks (bool);
void show_track_in_display (TimeAxisView &); void show_track_in_display (TimeAxisView &);
bool _redisplay_on_resume;
void suspend_redisplay () { void suspend_redisplay () {
_redisplay_on_resume = false;
_no_redisplay = true; _no_redisplay = true;
} }
void resume_redisplay () { void resume_redisplay () {
_no_redisplay = false; _no_redisplay = false;
redisplay (); if (_redisplay_on_resume) {
redisplay ();
}
} }
void redisplay (); void redisplay ();