Add an option to disable editor update during drags of the
authorCarl Hetherington <carl@carlh.net>
Tue, 1 Nov 2011 12:19:11 +0000 (12:19 +0000)
committerCarl Hetherington <carl@carlh.net>
Tue, 1 Nov 2011 12:19:11 +0000 (12:19 +0000)
summary (#4407).

git-svn-id: svn://localhost/ardour2/branches/3.0@10377 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_summary.cc
gtk2_ardour/editor_summary.h
gtk2_ardour/rc_option_editor.cc
libs/ardour/ardour/rc_configuration_vars.h

index 1bbe5899d530d17845f375f4cac0e4f0c55052b9..dfbeccabfca0e09b85290890d0c75cbe7e47a664 100644 (file)
@@ -323,6 +323,11 @@ EditorSummary::on_button_press_event (GdkEventButton* ev)
                        _old_follow_playhead = _editor->follow_playhead ();
                        _editor->set_follow_playhead (false);
 
+                       if (suspending_editor_updates ()) {
+                               get_editor (&_pending_editor_x, &_pending_editor_y);
+                               _pending_editor_changed = false;
+                       }
+                       
                } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
 
                        /* secondary-modifier-click: locate playhead */
@@ -338,6 +343,10 @@ EditorSummary::on_button_press_event (GdkEventButton* ev)
 
                        /* start a move drag */
 
+                       /* get the editor's state in case we are suspending updates */
+                       get_editor (&_pending_editor_x, &_pending_editor_y);
+                       _pending_editor_changed = false;
+
                        _move_dragging = true;
                        _moved = false;
                        _editor->_dragging_playhead = true;
@@ -349,6 +358,15 @@ EditorSummary::on_button_press_event (GdkEventButton* ev)
        return true;
 }
 
+/** @return true if we are currently suspending updates to the editor's viewport,
+ *  which we do if configured to do so, and if in a drag of some kind.
+ */
+bool
+EditorSummary::suspending_editor_updates () const
+{
+       return (!Config->get_update_editor_during_summary_drag () && (_zoom_dragging || _move_dragging));
+}
+
 /** Fill in x and y with the editor's current viewable area in summary coordinates */
 void
 EditorSummary::get_editor (pair<double, double>* x, pair<double, double>* y) const
@@ -356,11 +374,25 @@ EditorSummary::get_editor (pair<double, double>* x, pair<double, double>* y) con
        assert (x);
        assert (y);
 
-       x->first = (_editor->leftmost_position () - _start) * _x_scale;
-       x->second = x->first + _editor->current_page_frames() * _x_scale;
+       if (suspending_editor_updates ()) {
+
+               /* We are dragging, and configured not to update the editor window during drags,
+                  so just return where the editor will be when the drag finishes.
+               */
+                  
+               *x = _pending_editor_x;
+               *y = _pending_editor_y;
+
+       } else {
+
+               /* Otherwise query the editor for its actual position */
 
-       y->first = editor_y_to_summary (_editor->vertical_adjustment.get_value ());
-       y->second = editor_y_to_summary (_editor->vertical_adjustment.get_value () + _editor->canvas_height() - _editor->get_canvas_timebars_vsize());
+               x->first = (_editor->leftmost_position () - _start) * _x_scale;
+               x->second = x->first + _editor->current_page_frames() * _x_scale;
+               
+               y->first = editor_y_to_summary (_editor->vertical_adjustment.get_value ());
+               y->second = editor_y_to_summary (_editor->vertical_adjustment.get_value () + _editor->canvas_height() - _editor->get_canvas_timebars_vsize());
+       }
 }
 
 /** Get an expression of the position of a point with respect to the view rectangle */
@@ -521,11 +553,17 @@ EditorSummary::on_motion_notify_event (GdkEventMotion* ev)
 bool
 EditorSummary::on_button_release_event (GdkEventButton*)
 {
+       bool const was_suspended = suspending_editor_updates ();
+       
        _move_dragging = false;
        _zoom_dragging = false;
        _editor->_dragging_playhead = false;
        _editor->set_follow_playhead (_old_follow_playhead, false);
 
+       if (was_suspended && _pending_editor_changed) {
+               set_editor (_pending_editor_x, _pending_editor_y);
+       }
+               
        return true;
 }
 
@@ -645,8 +683,16 @@ EditorSummary::set_editor_x (double x)
        if (x < 0) {
                x = 0;
        }
-       
-       _editor->reset_x_origin (x / _x_scale + _start);
+
+       if (suspending_editor_updates ()) {
+               double const w = _pending_editor_x.second - _pending_editor_x.first;
+               _pending_editor_x.first = x;
+               _pending_editor_x.second = x + w;
+               _pending_editor_changed = true;
+               set_dirty ();
+       } else {
+               _editor->reset_x_origin (x / _x_scale + _start);
+       }
 }
 
 /** Set the x range visible in the editor.
@@ -663,16 +709,22 @@ EditorSummary::set_editor_x (pair<double, double> x)
        if (x.second < 0) {
                x.second = x.first + 1;
        }
-       
-       _editor->reset_x_origin (x.first / _x_scale + _start);
-
-       double const nx = (
-               ((x.second - x.first) / _x_scale) /
-               _editor->frame_to_unit (_editor->current_page_frames())
-               );
 
-       if (nx != _editor->get_current_zoom ()) {
-               _editor->reset_zoom (nx);
+       if (suspending_editor_updates ()) {
+               _pending_editor_x = x;
+               _pending_editor_changed = true;
+               set_dirty ();
+       } else {
+               _editor->reset_x_origin (x.first / _x_scale + _start);
+               
+               double const nx = (
+                       ((x.second - x.first) / _x_scale) /
+                       _editor->frame_to_unit (_editor->current_page_frames())
+                       );
+               
+               if (nx != _editor->get_current_zoom ()) {
+                       _editor->reset_zoom (nx);
+               }
        }
 }
 
@@ -697,7 +749,15 @@ EditorSummary::set_editor_y (double const y)
                y1 = 0;
        }
 
-       _editor->reset_y_origin (y1);
+       if (suspending_editor_updates ()) {
+               double const h = _pending_editor_y.second - _pending_editor_y.first;
+               _pending_editor_y.first = y;
+               _pending_editor_y.second = y + h;
+               _pending_editor_changed = true;
+               set_dirty ();
+       } else {
+               _editor->reset_y_origin (y1);
+       }
 }
 
 /** Set the y range visible in the editor.  This is achieved by scaling track heights,
@@ -708,6 +768,13 @@ EditorSummary::set_editor_y (double const y)
 void
 EditorSummary::set_editor_y (pair<double, double> const y)
 {
+       if (suspending_editor_updates ()) {
+               _pending_editor_y = y;
+               _pending_editor_changed = true;
+               set_dirty ();
+               return;
+       }
+       
        /* Compute current height of tracks between y.first and y.second.  We add up
           the total height into `total_height' and the height of complete tracks into
           `scale height'.
index b465709100a5fdeffd433b7663f2e49ac2b9aebf..4da49d6e11c8d9b049498a37e3f2b9ae2cc1021c 100644 (file)
@@ -82,6 +82,7 @@ private:
        Position get_position (double, double) const;
        void set_cursor (Position);
        void route_gui_changed (std::string);
+       bool suspending_editor_updates () const;
 
        framepos_t _start; ///< start frame of the overview
        framepos_t _end; ///< end frame of the overview
@@ -105,6 +106,10 @@ private:
        std::pair<double, double> _view_rectangle_x;
        std::pair<double, double> _view_rectangle_y;
 
+       std::pair<double, double> _pending_editor_x;
+       std::pair<double, double> _pending_editor_y;
+       bool _pending_editor_changed;
+
        bool _zoom_dragging;
        Position _zoom_position;
 
index 5ee94a64505d034490dc65ee8b12ad4860543faf..e702ffbff6c2b1c1ffad74162331bbff17ddaa99 100644 (file)
@@ -1146,6 +1146,14 @@ RCOptionEditor::RCOptionEditor ()
                            sigc::mem_fun (*_rc_config, &RCConfiguration::set_color_regions_using_track_color)
                            ));
 
+       add_option (_("Editor"),
+                   new BoolOption (
+                           "update-editor-during-summary-drag",
+                           _("Update editor window during drags of the summary"),
+                           sigc::mem_fun (*_rc_config, &RCConfiguration::get_update_editor_during_summary_drag),
+                           sigc::mem_fun (*_rc_config, &RCConfiguration::set_update_editor_during_summary_drag)
+                           ));
+
        /* AUDIO */
 
        add_option (_("Audio"), new OptionEditorHeading (_("Buffering")));
index 513722a31990724b6f74c35ce7ab04d3eb59b563..a56a3f9efd43cd3589be157a47182ed028c76395 100644 (file)
@@ -167,6 +167,7 @@ CONFIG_VARIABLE (bool, allow_special_bus_removal, "allow-special-bus-removal", f
 CONFIG_VARIABLE (int32_t, processor_usage, "processor-usage", -1)
 CONFIG_VARIABLE (bool, color_regions_using_track_color, "color-regions-using-track-color", false)
 CONFIG_VARIABLE (gain_t, max_gain, "max-gain", 2.0) /* +6.0dB */
+CONFIG_VARIABLE (bool, update_editor_during_summary_drag, "update-editor-during-summary-drag", true)
 
 /* denormal management */