suspend route redisplay for (rec-en, solo, mute and monitor) batch changes

This commit is contained in:
Robin Gareus 2014-06-29 02:52:56 +02:00
parent 77216ac468
commit c52cb37bf2
6 changed files with 56 additions and 74 deletions

View file

@ -3393,6 +3393,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
setup_order_hint(); setup_order_hint();
string template_path = add_route_dialog->track_template(); string template_path = add_route_dialog->track_template();
DisplaySuspender ds;
if (!template_path.empty()) { if (!template_path.empty()) {
if (add_route_dialog->name_template_is_default()) { if (add_route_dialog->name_template_is_default()) {

View file

@ -4168,8 +4168,7 @@ void
Editor::use_visual_state (VisualState& vs) Editor::use_visual_state (VisualState& vs)
{ {
PBD::Unwinder<bool> nsv (no_save_visual, true); PBD::Unwinder<bool> nsv (no_save_visual, true);
DisplaySuspender ds;
_routes->suspend_redisplay ();
vertical_adjustment.set_value (vs.y_position); vertical_adjustment.set_value (vs.y_position);
@ -4185,7 +4184,6 @@ Editor::use_visual_state (VisualState& vs)
} }
_routes->update_visibility (); _routes->update_visibility ();
_routes->resume_redisplay ();
} }
/** This is the core function that controls the zoom level of the canvas. It is called /** This is the core function that controls the zoom level of the canvas. It is called

View file

@ -1402,7 +1402,7 @@ Editor::scroll_up_one_track ()
void void
Editor::tav_zoom_step (bool coarser) Editor::tav_zoom_step (bool coarser)
{ {
_routes->suspend_redisplay (); DisplaySuspender ds;
TrackViewList* ts; TrackViewList* ts;
@ -1416,14 +1416,12 @@ Editor::tav_zoom_step (bool coarser)
TimeAxisView *tv = (static_cast<TimeAxisView*>(*i)); TimeAxisView *tv = (static_cast<TimeAxisView*>(*i));
tv->step_height (coarser); tv->step_height (coarser);
} }
_routes->resume_redisplay ();
} }
void void
Editor::tav_zoom_smooth (bool coarser, bool force_all) Editor::tav_zoom_smooth (bool coarser, bool force_all)
{ {
_routes->suspend_redisplay (); DisplaySuspender ds;
TrackViewList* ts; TrackViewList* ts;
@ -1448,8 +1446,6 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all)
tv->set_height (h + 5); tv->set_height (h + 5);
} }
} }
_routes->resume_redisplay ();
} }
bool bool
@ -1709,7 +1705,7 @@ Editor::temporal_zoom_region (bool both_axes)
/* hide irrelevant tracks */ /* hide irrelevant tracks */
_routes->suspend_redisplay (); DisplaySuspender ds;
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) { if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) {
@ -1717,8 +1713,6 @@ Editor::temporal_zoom_region (bool both_axes)
} }
} }
_routes->resume_redisplay ();
vertical_adjustment.set_value (0.0); vertical_adjustment.set_value (0.0);
} }

View file

@ -562,15 +562,8 @@ EditorRoutes::row_deleted (Gtk::TreeModel::Path const &)
DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n"); DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n");
if (_route_deletion_in_progress) { DisplaySuspender ds;
suspend_redisplay ();
}
sync_order_keys_from_treeview (); sync_order_keys_from_treeview ();
if (_route_deletion_in_progress) {
resume_redisplay ();
}
} }
void void
@ -591,6 +584,7 @@ EditorRoutes::visible_changed (std::string const & path)
return; return;
} }
DisplaySuspender ds;
TreeIter iter; TreeIter iter;
if ((iter = _model->get_iter (path))) { if ((iter = _model->get_iter (path))) {
@ -639,7 +633,7 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
_editor->selection->tracks.clear(); _editor->selection->tracks.clear();
} }
suspend_redisplay (); DisplaySuspender ds;
_display.set_model (Glib::RefPtr<ListStore>()); _display.set_model (Glib::RefPtr<ListStore>());
@ -708,7 +702,6 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
update_input_active_display (); update_input_active_display ();
update_active_display (); update_active_display ();
resume_redisplay ();
_display.set_model (_model); _display.set_model (_model);
/* now update route order keys from the treeview/track display order */ /* now update route order keys from the treeview/track display order */
@ -803,7 +796,7 @@ EditorRoutes::update_visibility ()
TreeModel::Children rows = _model->children(); TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i; TreeModel::Children::iterator i;
suspend_redisplay (); DisplaySuspender ds ();
for (i = rows.begin(); i != rows.end(); ++i) { for (i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[_columns.tv]; TimeAxisView *tv = (*i)[_columns.tv];
@ -814,8 +807,6 @@ EditorRoutes::update_visibility ()
*/ */
sync_order_keys_from_treeview (); sync_order_keys_from_treeview ();
resume_redisplay ();
} }
void void
@ -1033,7 +1024,7 @@ EditorRoutes::hide_all_tracks (bool /*with_select*/)
TreeModel::Children rows = _model->children(); TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i; TreeModel::Children::iterator i;
suspend_redisplay (); DisplaySuspender ds;
for (i = rows.begin(); i != rows.end(); ++i) { for (i = rows.begin(); i != rows.end(); ++i) {
@ -1046,8 +1037,6 @@ EditorRoutes::hide_all_tracks (bool /*with_select*/)
row[_columns.visible] = false; row[_columns.visible] = false;
} }
resume_redisplay ();
} }
void void
@ -1056,7 +1045,7 @@ EditorRoutes::set_all_tracks_visibility (bool yn)
TreeModel::Children rows = _model->children(); TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i; TreeModel::Children::iterator i;
suspend_redisplay (); DisplaySuspender ds;
for (i = rows.begin(); i != rows.end(); ++i) { for (i = rows.begin(); i != rows.end(); ++i) {
@ -1075,8 +1064,6 @@ EditorRoutes::set_all_tracks_visibility (bool yn)
*/ */
sync_order_keys_from_treeview (); sync_order_keys_from_treeview ();
resume_redisplay ();
} }
void void
@ -1085,7 +1072,7 @@ EditorRoutes::set_all_audio_midi_visibility (int tracks, bool yn)
TreeModel::Children rows = _model->children(); TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i; TreeModel::Children::iterator i;
suspend_redisplay (); DisplaySuspender ds;
for (i = rows.begin(); i != rows.end(); ++i) { for (i = rows.begin(); i != rows.end(); ++i) {
@ -1137,8 +1124,6 @@ EditorRoutes::set_all_audio_midi_visibility (int tracks, bool yn)
*/ */
sync_order_keys_from_treeview (); sync_order_keys_from_treeview ();
resume_redisplay ();
} }
void void
@ -1383,11 +1368,10 @@ struct EditorOrderRouteSorter {
void void
EditorRoutes::initial_display () EditorRoutes::initial_display ()
{ {
suspend_redisplay (); DisplaySuspender ds;
_model->clear (); _model->clear ();
if (!_session) { if (!_session) {
resume_redisplay ();
return; return;
} }
@ -1414,8 +1398,6 @@ EditorRoutes::initial_display ()
_editor->add_routes (r); _editor->add_routes (r);
} }
resume_redisplay ();
} }
void void
@ -1724,14 +1706,11 @@ EditorRoutes::show_tracks_with_regions_at_playhead ()
} }
} }
suspend_redisplay (); DisplaySuspender ds;
TreeModel::Children rows = _model->children (); TreeModel::Children rows = _model->children ();
for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) { for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView* tv = (*i)[_columns.tv]; TimeAxisView* tv = (*i)[_columns.tv];
(*i)[_columns.visible] = (show.find (tv) != show.end()); (*i)[_columns.visible] = (show.find (tv) != show.end());
} }
resume_redisplay ();
} }

View file

@ -42,10 +42,6 @@ public:
_no_redisplay = true; _no_redisplay = true;
} }
void allow_redisplay () {
_no_redisplay = false;
}
void resume_redisplay () { void resume_redisplay () {
_no_redisplay = false; _no_redisplay = false;
redisplay (); redisplay ();

View file

@ -349,6 +349,7 @@ RouteUI::mute_press (GdkEventButton* ev)
_mute_release->routes = copy; _mute_release->routes = copy;
} }
DisplaySuspender ds;
_session->set_mute (copy, !_route->muted()); _session->set_mute (copy, !_route->muted());
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
@ -373,6 +374,7 @@ RouteUI::mute_press (GdkEventButton* ev)
rl->push_back (_route); rl->push_back (_route);
} }
DisplaySuspender ds;
_session->set_mute (rl, !_route->muted(), Session::rt_cleanup, true); _session->set_mute (rl, !_route->muted(), Session::rt_cleanup, true);
} }
@ -403,6 +405,7 @@ RouteUI::mute_release (GdkEventButton*)
{ {
if (!_i_am_the_modifier) { if (!_i_am_the_modifier) {
if (_mute_release){ if (_mute_release){
DisplaySuspender ds;
_session->set_mute (_mute_release->routes, _mute_release->active, Session::rt_cleanup, true); _session->set_mute (_mute_release->routes, _mute_release->active, Session::rt_cleanup, true);
delete _mute_release; delete _mute_release;
_mute_release = 0; _mute_release = 0;
@ -461,6 +464,7 @@ RouteUI::solo_press(GdkEventButton* ev)
_solo_release->routes = _session->get_routes (); _solo_release->routes = _session->get_routes ();
} }
DisplaySuspender ds;
if (Config->get_solo_control_is_listen_control()) { if (Config->get_solo_control_is_listen_control()) {
_session->set_listen (_session->get_routes(), !_route->listening_via_monitor(), Session::rt_cleanup, true); _session->set_listen (_session->get_routes(), !_route->listening_via_monitor(), Session::rt_cleanup, true);
} else { } else {
@ -488,6 +492,7 @@ RouteUI::solo_press(GdkEventButton* ev)
if (Config->get_solo_control_is_listen_control()) { if (Config->get_solo_control_is_listen_control()) {
/* ??? we need a just_one_listen() method */ /* ??? we need a just_one_listen() method */
} else { } else {
DisplaySuspender ds;
_session->set_just_one_solo (_route, true); _session->set_just_one_solo (_route, true);
} }
@ -525,6 +530,7 @@ RouteUI::solo_press(GdkEventButton* ev)
rl->push_back (_route); rl->push_back (_route);
} }
DisplaySuspender ds;
if (Config->get_solo_control_is_listen_control()) { if (Config->get_solo_control_is_listen_control()) {
_session->set_listen (rl, !_route->listening_via_monitor(), Session::rt_cleanup, true); _session->set_listen (rl, !_route->listening_via_monitor(), Session::rt_cleanup, true);
} else { } else {
@ -543,6 +549,7 @@ RouteUI::solo_press(GdkEventButton* ev)
_solo_release->routes = rl; _solo_release->routes = rl;
} }
DisplaySuspender ds;
if (Config->get_solo_control_is_listen_control()) { if (Config->get_solo_control_is_listen_control()) {
_session->set_listen (rl, !_route->listening_via_monitor()); _session->set_listen (rl, !_route->listening_via_monitor());
} else { } else {
@ -566,11 +573,12 @@ RouteUI::solo_release (GdkEventButton*)
if (_solo_release->exclusive) { if (_solo_release->exclusive) {
} else { } else {
if (Config->get_solo_control_is_listen_control()) { DisplaySuspender ds;
_session->set_listen (_solo_release->routes, _solo_release->active, Session::rt_cleanup, true); if (Config->get_solo_control_is_listen_control()) {
} else { _session->set_listen (_solo_release->routes, _solo_release->active, Session::rt_cleanup, true);
_session->set_solo (_solo_release->routes, _solo_release->active, Session::rt_cleanup, true); } else {
} _session->set_solo (_solo_release->routes, _solo_release->active, Session::rt_cleanup, true);
}
} }
delete _solo_release; delete _solo_release;
@ -613,6 +621,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) { } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
DisplaySuspender ds;
_session->set_record_enabled (_session->get_routes(), !rec_enable_button->active_state()); _session->set_record_enabled (_session->get_routes(), !rec_enable_button->active_state());
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
@ -634,6 +643,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
rl->push_back (_route); rl->push_back (_route);
} }
DisplaySuspender ds;
_session->set_record_enabled (rl, !rec_enable_button->active_state(), Session::rt_cleanup, true); _session->set_record_enabled (rl, !rec_enable_button->active_state(), Session::rt_cleanup, true);
} }
@ -645,6 +655,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
boost::shared_ptr<RouteList> rl (new RouteList); boost::shared_ptr<RouteList> rl (new RouteList);
rl->push_back (route()); rl->push_back (route());
DisplaySuspender ds;
_session->set_record_enabled (rl, !rec_enable_button->active_state()); _session->set_record_enabled (rl, !rec_enable_button->active_state());
} }
} }
@ -762,6 +773,7 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
rl->push_back (route()); rl->push_back (route());
} }
DisplaySuspender ds;
_session->set_monitoring (rl, mc, Session::rt_cleanup, true); _session->set_monitoring (rl, mc, Session::rt_cleanup, true);
return true; return true;
@ -1320,36 +1332,38 @@ RouteUI::muting_change ()
bool bool
RouteUI::solo_isolate_button_release (GdkEventButton* ev) RouteUI::solo_isolate_button_release (GdkEventButton* ev)
{ {
if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) { if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) {
return true; return true;
} }
bool view = solo_isolated_led->active_state(); bool view = solo_isolated_led->active_state();
bool model = _route->solo_isolated(); bool model = _route->solo_isolated();
/* called BEFORE the view has changed */ /* called BEFORE the view has changed */
if (ev->button == 1) { if (ev->button == 1) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) { if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
if (model) { if (model) {
/* disable isolate for all routes */ /* disable isolate for all routes */
_session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, true); DisplaySuspender ds;
} _session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, true);
}
} else { } else {
if (model == view) { if (model == view) {
/* flip just this route */ /* flip just this route */
boost::shared_ptr<RouteList> rl (new RouteList); boost::shared_ptr<RouteList> rl (new RouteList);
rl->push_back (_route); rl->push_back (_route);
_session->set_solo_isolated (rl, !view, Session::rt_cleanup, true); DisplaySuspender ds;
} _session->set_solo_isolated (rl, !view, Session::rt_cleanup, true);
} }
} }
}
return true; return true;
} }
bool bool