suspend route redisplay for (rec-en, solo, mute and monitor) batch changes
authorRobin Gareus <robin@gareus.org>
Sun, 29 Jun 2014 00:52:56 +0000 (02:52 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 29 Jun 2014 00:52:56 +0000 (02:52 +0200)
gtk2_ardour/ardour_ui.cc
gtk2_ardour/editor.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/editor_routes.cc
gtk2_ardour/editor_routes.h
gtk2_ardour/route_ui.cc

index a8d883422bb2cb66aa1c8602ab98243b3d31cb25..cde9d0d9eeb1a13754f7a19e0cc03c6d0bb0d9bf 100644 (file)
@@ -3393,6 +3393,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
        setup_order_hint();
 
        string template_path = add_route_dialog->track_template();
+       DisplaySuspender ds;
 
        if (!template_path.empty()) {
                if (add_route_dialog->name_template_is_default())  {
index e3d1bc03982b1bd7a4e086391ac66379c69a0e85..ea586405d83b5bbf20f158fb8c964b170a5a7400 100644 (file)
@@ -4168,8 +4168,7 @@ void
 Editor::use_visual_state (VisualState& vs)
 {
        PBD::Unwinder<bool> nsv (no_save_visual, true);
-
-       _routes->suspend_redisplay ();
+       DisplaySuspender ds;
 
        vertical_adjustment.set_value (vs.y_position);
 
@@ -4185,7 +4184,6 @@ Editor::use_visual_state (VisualState& vs)
        }
 
        _routes->update_visibility ();
-       _routes->resume_redisplay ();
 }
 
 /** This is the core function that controls the zoom level of the canvas. It is called
index aa386e634057efe2d9dac5aa4d4ad9adb6d9a82e..4882ac1fc39e836bba6d1ff25c328dfd7f2886a7 100644 (file)
@@ -1402,7 +1402,7 @@ Editor::scroll_up_one_track ()
 void
 Editor::tav_zoom_step (bool coarser)
 {
-       _routes->suspend_redisplay ();
+       DisplaySuspender ds;
 
        TrackViewList* ts;
 
@@ -1416,14 +1416,12 @@ Editor::tav_zoom_step (bool coarser)
                TimeAxisView *tv = (static_cast<TimeAxisView*>(*i));
                        tv->step_height (coarser);
        }
-
-       _routes->resume_redisplay ();
 }
 
 void
 Editor::tav_zoom_smooth (bool coarser, bool force_all)
 {
-       _routes->suspend_redisplay ();
+       DisplaySuspender ds;
 
        TrackViewList* ts;
 
@@ -1448,8 +1446,6 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all)
                        tv->set_height (h + 5);
                }
        }
-
-       _routes->resume_redisplay ();
 }
 
 bool
@@ -1709,7 +1705,7 @@ Editor::temporal_zoom_region (bool both_axes)
 
                /* hide irrelevant tracks */
 
-               _routes->suspend_redisplay ();
+               DisplaySuspender ds;
 
                for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                        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);
        }
 
index 605f90486cbf37ea97908a30dae1e79943f901f6..025633b0909af55e7cf73aaf7dcc50ec99ae313a 100644 (file)
@@ -562,15 +562,8 @@ EditorRoutes::row_deleted (Gtk::TreeModel::Path const &)
 
        DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n");
 
-        if (_route_deletion_in_progress) {
-                suspend_redisplay ();
-        }
-
+       DisplaySuspender ds;
        sync_order_keys_from_treeview ();
-
-        if (_route_deletion_in_progress) {
-                resume_redisplay ();
-        }
 }
 
 void
@@ -591,6 +584,7 @@ EditorRoutes::visible_changed (std::string const & path)
                return;
        }
 
+       DisplaySuspender ds;
        TreeIter iter;
 
        if ((iter = _model->get_iter (path))) {
@@ -639,7 +633,7 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
                _editor->selection->tracks.clear();
        } 
 
-       suspend_redisplay ();
+       DisplaySuspender ds;
 
        _display.set_model (Glib::RefPtr<ListStore>());
 
@@ -708,7 +702,6 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
        update_input_active_display ();
        update_active_display ();
 
-       resume_redisplay ();
        _display.set_model (_model);
 
        /* 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::iterator i;
 
-       suspend_redisplay ();
+       DisplaySuspender ds ();
 
        for (i = rows.begin(); i != rows.end(); ++i) {
                TimeAxisView *tv = (*i)[_columns.tv];
@@ -814,8 +807,6 @@ EditorRoutes::update_visibility ()
         */
 
        sync_order_keys_from_treeview ();
-
-       resume_redisplay ();
 }
 
 void
@@ -1033,7 +1024,7 @@ EditorRoutes::hide_all_tracks (bool /*with_select*/)
        TreeModel::Children rows = _model->children();
        TreeModel::Children::iterator i;
 
-       suspend_redisplay ();
+       DisplaySuspender ds;
 
        for (i = rows.begin(); i != rows.end(); ++i) {
 
@@ -1046,8 +1037,6 @@ EditorRoutes::hide_all_tracks (bool /*with_select*/)
 
                row[_columns.visible] = false;
        }
-
-       resume_redisplay ();
 }
 
 void
@@ -1056,7 +1045,7 @@ EditorRoutes::set_all_tracks_visibility (bool yn)
        TreeModel::Children rows = _model->children();
        TreeModel::Children::iterator i;
 
-       suspend_redisplay ();
+       DisplaySuspender ds;
 
        for (i = rows.begin(); i != rows.end(); ++i) {
 
@@ -1075,8 +1064,6 @@ EditorRoutes::set_all_tracks_visibility (bool yn)
         */
 
        sync_order_keys_from_treeview ();
-
-       resume_redisplay ();
 }
 
 void
@@ -1085,7 +1072,7 @@ EditorRoutes::set_all_audio_midi_visibility (int tracks, bool yn)
        TreeModel::Children rows = _model->children();
        TreeModel::Children::iterator i;
 
-       suspend_redisplay ();
+       DisplaySuspender ds;
 
        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 ();
-
-       resume_redisplay ();
 }
 
 void
@@ -1383,11 +1368,10 @@ struct EditorOrderRouteSorter {
 void
 EditorRoutes::initial_display ()
 {
-       suspend_redisplay ();
+       DisplaySuspender ds;
        _model->clear ();
 
        if (!_session) {
-               resume_redisplay ();
                return;
        }
 
@@ -1414,8 +1398,6 @@ EditorRoutes::initial_display ()
                _editor->add_routes (r);
                
        }
-
-       resume_redisplay ();
 }
 
 void
@@ -1724,14 +1706,11 @@ EditorRoutes::show_tracks_with_regions_at_playhead ()
                }
        }
 
-       suspend_redisplay ();
+       DisplaySuspender ds;
 
        TreeModel::Children rows = _model->children ();
        for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
                TimeAxisView* tv = (*i)[_columns.tv];
                (*i)[_columns.visible] = (show.find (tv) != show.end());
        }
-
-       resume_redisplay ();
 }
-
index dea8da6cc08b17d2676c30b37fc149a1e82768d3..21a92fc423746252be3d1cf9423ec8f513e3d0f0 100644 (file)
@@ -42,10 +42,6 @@ public:
                _no_redisplay = true;
        }
 
-        void allow_redisplay () { 
-               _no_redisplay = false;
-       }
-
        void resume_redisplay () {
                _no_redisplay = false;
                redisplay ();
index 529842d02d2f949eda95ba96491bf3264f1c0ce0..01b2182e628efe033728899e7233c1642ba322c6 100644 (file)
@@ -349,6 +349,7 @@ RouteUI::mute_press (GdkEventButton* ev)
                                                _mute_release->routes = copy;
                                        }
 
+                                       DisplaySuspender ds;
                                        _session->set_mute (copy, !_route->muted());
 
                                } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
@@ -373,6 +374,7 @@ RouteUI::mute_press (GdkEventButton* ev)
                                                        rl->push_back (_route);
                                                }
 
+                                               DisplaySuspender ds;
                                                _session->set_mute (rl, !_route->muted(), Session::rt_cleanup, true);
                                        }
 
@@ -403,6 +405,7 @@ RouteUI::mute_release (GdkEventButton*)
 {
        if (!_i_am_the_modifier) {
                if (_mute_release){
+                       DisplaySuspender ds;
                        _session->set_mute (_mute_release->routes, _mute_release->active, Session::rt_cleanup, true);
                        delete _mute_release;
                        _mute_release = 0;
@@ -461,6 +464,7 @@ RouteUI::solo_press(GdkEventButton* ev)
                                                _solo_release->routes = _session->get_routes ();
                                        }
 
+                                       DisplaySuspender ds;
                                        if (Config->get_solo_control_is_listen_control()) {
                                                _session->set_listen (_session->get_routes(), !_route->listening_via_monitor(),  Session::rt_cleanup, true);
                                        } else {
@@ -488,6 +492,7 @@ RouteUI::solo_press(GdkEventButton* ev)
                                        if (Config->get_solo_control_is_listen_control()) {
                                                /* ??? we need a just_one_listen() method */
                                        } else {
+                                               DisplaySuspender ds;
                                                _session->set_just_one_solo (_route, true);
                                        }
 
@@ -525,6 +530,7 @@ RouteUI::solo_press(GdkEventButton* ev)
                                                        rl->push_back (_route);
                                                }
 
+                                               DisplaySuspender ds;
                                                if (Config->get_solo_control_is_listen_control()) {
                                                        _session->set_listen (rl, !_route->listening_via_monitor(),  Session::rt_cleanup, true);
                                                } else {
@@ -543,6 +549,7 @@ RouteUI::solo_press(GdkEventButton* ev)
                                                _solo_release->routes = rl;
                                        }
 
+                                       DisplaySuspender ds;
                                        if (Config->get_solo_control_is_listen_control()) {
                                                _session->set_listen (rl, !_route->listening_via_monitor());
                                        } else {
@@ -566,11 +573,12 @@ RouteUI::solo_release (GdkEventButton*)
                        if (_solo_release->exclusive) {
 
                        } else {
-                                if (Config->get_solo_control_is_listen_control()) {
-                                        _session->set_listen (_solo_release->routes, _solo_release->active, Session::rt_cleanup, true);
-                                } else {
-                                        _session->set_solo (_solo_release->routes, _solo_release->active, Session::rt_cleanup, true);
-                                }
+                               DisplaySuspender ds;
+                               if (Config->get_solo_control_is_listen_control()) {
+                                       _session->set_listen (_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;
@@ -613,6 +621,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
 
                } 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());
 
                } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
@@ -633,7 +642,8 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
                                        rl.reset (new RouteList);
                                        rl->push_back (_route);
                                }
-                               
+
+                               DisplaySuspender ds;
                                _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);
                        rl->push_back (route());
+                       DisplaySuspender ds;
                        _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());
        }
 
+       DisplaySuspender ds;
        _session->set_monitoring (rl, mc, Session::rt_cleanup, true);           
 
        return true;
@@ -1320,36 +1332,38 @@ RouteUI::muting_change ()
 bool
 RouteUI::solo_isolate_button_release (GdkEventButton* ev)
 {
-        if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) {
-                return true;
-        }
+       if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) {
+               return true;
+       }
 
-        bool view = solo_isolated_led->active_state();
-        bool model = _route->solo_isolated();
+       bool view = solo_isolated_led->active_state();
+       bool model = _route->solo_isolated();
 
-        /* called BEFORE the view has changed */
+       /* called BEFORE the view has changed */
 
-        if (ev->button == 1) {
-                if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
+       if (ev->button == 1) {
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
 
-                        if (model) {
-                                /* disable isolate for all routes */
-                                _session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, true);
-                        }
+                       if (model) {
+                               /* disable isolate for all routes */
+                               DisplaySuspender ds;
+                               _session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, true);
+                       }
 
-                } else {
-                        if (model == view) {
+               } else {
+                       if (model == view) {
 
-                                /* flip just this route */
+                               /* flip just this route */
 
-                                boost::shared_ptr<RouteList> rl (new RouteList);
-                                rl->push_back (_route);
-                                _session->set_solo_isolated (rl, !view, Session::rt_cleanup, true);
-                        }
-                }
-        }
+                               boost::shared_ptr<RouteList> rl (new RouteList);
+                               rl->push_back (_route);
+                               DisplaySuspender ds;
+                               _session->set_solo_isolated (rl, !view, Session::rt_cleanup, true);
+                       }
+               }
+       }
 
-        return true;
+       return true;
 }
 
 bool