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)
, old_focus (0)
, selection_countdown (0)
, name_editable (0)
, name_editable (0)
, _redisplay_on_resume (false)
{
static const int column_width = 22;
@ -360,6 +361,13 @@ EditorRoutes::set_session (Session* s)
if (_session) {
_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());
/* 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
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;
}

View File

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