Fix confusion between model and view points when dragging ranges. Clamp both top...
authorCarl Hetherington <carl@carlh.net>
Sat, 2 Jan 2010 02:10:49 +0000 (02:10 +0000)
committerCarl Hetherington <carl@carlh.net>
Sat, 2 Jan 2010 02:10:49 +0000 (02:10 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6436 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/automation_line.cc
gtk2_ardour/editor_drag.cc

index ac50ac44dbe48ec48d47aa611803303fe75297f1..7286b20bdf837f24784786050ba9acdff372fead 100644 (file)
@@ -770,12 +770,17 @@ AutomationLine::drag_motion (nframes_t x, float fraction, bool with_push)
        double dy = fraction - _last_drag_fraction;
        _last_drag_fraction = fraction;
 
-       /* clamp y so that the "lowest" point hits the bottom but goes no further */
+       /* clamp y so that the "lowest" point hits the bottom but goes no further
+          and similarly with the "highest" and the top
+       */
        for (list<ControlPoint*>::iterator i = _drag_points.begin(); i != _drag_points.end(); ++i) {
                double const y = ((_height - (*i)->get_y()) / _height) + dy;
                if (y < 0) {
                        dy -= y;
                }
+               if (y > 1) {
+                       dy -= (y - 1);
+               }
        }
 
        for (list<ControlPoint*>::iterator i = _drag_points.begin(); i != _drag_points.end(); ++i) {
@@ -1072,8 +1077,9 @@ AutomationLine::set_selected_points (PointSelection& points)
 
 }
 
-void AutomationLine::set_colors() {
-       set_line_color( ARDOUR_UI::config()->canvasvar_AutomationLine.get() );
+void AutomationLine::set_colors()
+{
+       set_line_color (ARDOUR_UI::config()->canvasvar_AutomationLine.get());
        for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
                (*i)->show_color (false, !points_visible);
        }
index 5920e08afafbec73002d75b8ee5a07cae898d2e8..ca2468cd2c94d7ea2e8b114e7bb105c2e4c21022 100644 (file)
@@ -3577,21 +3577,18 @@ AutomationRangeDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
                }
 
                uint32_t const N = _line->npoints ();
-               AutomationList::const_iterator j = the_list->begin ();
                for (uint32_t i = 0; i < N; ++i) {
 
                        ControlPoint* p = _line->nth (i);
 
-                       list<AudioRange>::const_iterator k = _ranges.begin ();
-                       while (k != _ranges.end() && (k->start >= (*j)->when || k->end <= (*j)->when)) {
-                               ++k;
+                       list<AudioRange>::const_iterator j = _ranges.begin ();
+                       while (j != _ranges.end() && (j->start >= (*p->model())->when || j->end <= (*p->model())->when)) {
+                               ++j;
                        }
 
-                       if (k != _ranges.end()) {
+                       if (j != _ranges.end()) {
                                points.push_back (p);
                        }
-
-                       ++j;
                }
        }