-void
-AutomationLine::sync_model_from (ControlPoint& cp)
-{
- ControlPoint* p;
- uint32_t lasti;
-
- sync_model_with_view_point (cp);
-
- /* we might have moved all points after `cp' by some amount
- if we pressed the with_push modifyer some of the time during the drag
- so all subsequent points have to be resynced
- */
-
- lasti = control_points.size() - 1;
- p = nth (lasti);
-
- update_pending = true;
-
- while (p != &cp && lasti) {
- sync_model_with_view_point (*p);
- --lasti;
- p = nth (lasti);
- }
-}
-
-void
-AutomationLine::sync_model_with_view_point (ControlPoint& cp)
-{
- ModelRepresentation mr;
- double ydelta;
-
- model_representation (cp, mr);
-
- /* part 4: how much are we changing the central point by */
-
- ydelta = mr.yval - mr.ypos;
-
- /* IMPORTANT: changing the model when the x-coordinate changes
- may invalidate the iterators that we are using. this means that we have
- to change the points before+after the one corresponding to the visual CP
- first (their x-coordinate doesn't change). then we change the
- "main" point.
-
- apply the full change to the central point, and interpolate
- in each direction to cover all model points represented
- by the control point.
- */
-
- /* part 5: change all points before the primary point */
-
- for (AutomationList::iterator i = mr.start; i != cp.model; ++i) {
-
- double delta;
-
- delta = ydelta * ((*i)->when - mr.xmin) / (mr.xpos - mr.xmin);
-
- /* x-coordinate (generally time) stays where it is,
- y-coordinate moves by a certain amount.
- */
-
- update_pending = true;
- change_model (i, (*i)->when, mr.yval + delta);
- }
-
- /* part 6: change later points */
-
- AutomationList::iterator i = cp.model;
-
- ++i;
-
- while (i != mr.end) {
-
- double delta;
-
- delta = ydelta * (mr.xmax - (*i)->when) / (mr.xmax - mr.xpos);
-
- /* x-coordinate (generally time) stays where it is,
- y-coordinate moves by a certain amount.
- */
-
- update_pending = true;
- change_model (i, (*i)->when, (*i)->value + delta);
-
- ++i;
- }
-
- /* part 7: change the primary point */
-
- update_pending = true;
- change_model (cp.model, mr.xval, mr.yval);
-}
-