diff options
-rw-r--r-- | gtk2_ardour/automation_line.cc | 37 | ||||
-rw-r--r-- | gtk2_ardour/automation_line.h | 1 | ||||
-rw-r--r-- | libs/canvas/canvas/poly_line.h | 2 | ||||
-rw-r--r-- | libs/canvas/poly_line.cc | 24 |
4 files changed, 43 insertions, 21 deletions
diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index 7b84e686f0..4d39ff9b87 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -142,6 +142,13 @@ AutomationLine::event_handler (GdkEvent* event) return PublicEditor::instance().canvas_line_event (event, line, this); } +bool +AutomationLine::is_stepped() const +{ + return (_desc.toggled || + (alist && alist->interpolation() == AutomationList::Discrete)); +} + void AutomationLine::update_visibility () { @@ -150,7 +157,7 @@ AutomationLine::update_visibility () when automation points have been removed (the line will still follow the shape of the old points). */ - if (alist->interpolation() != AutomationList::Discrete && control_points.size() >= 2) { + if (control_points.size() >= 2) { line->show(); } else { line->hide (); @@ -200,11 +207,6 @@ AutomationLine::hide () double AutomationLine::control_point_box_size () { - if (alist->interpolation() == AutomationList::Discrete) { - return max((_height*4.0) / (double)(alist->parameter().max() - alist->parameter().min()), - 4.0); - } - if (_height > TimeAxisView::preset_height (HeightLarger)) { return 8.0; } else if (_height > (guint32) TimeAxisView::preset_height (HeightNormal)) { @@ -287,7 +289,7 @@ AutomationLine::modify_point_y (ControlPoint& cp, double y) reset_line_coords (cp); if (line_points.size() > 1) { - line->set (line_points); + line->set_steps (line_points, is_stepped()); } alist->freeze (); @@ -716,7 +718,7 @@ AutomationLine::drag_motion (double const x, float fraction, bool ignore_x, bool */ if (line_points.size() > 1) { - line->set (line_points); + line->set_steps (line_points, is_stepped()); } } @@ -1029,7 +1031,7 @@ AutomationLine::reset_callback (const Evoral::ControlList& events) line_points[n].y = control_points[n]->get_y(); } - line->set (line_points); + line->set_steps (line_points, is_stepped()); update_visibility (); } @@ -1132,17 +1134,13 @@ AutomationLine::remove_visibility (VisibleAspects va) void AutomationLine::track_entered() { - if (alist->interpolation() != AutomationList::Discrete) { - add_visibility (ControlPoints); - } + add_visibility (ControlPoints); } void AutomationLine::track_exited() { - if (alist->interpolation() != AutomationList::Discrete) { - remove_visibility (ControlPoints); - } + remove_visibility (ControlPoints); } XMLNode & @@ -1182,7 +1180,7 @@ AutomationLine::view_to_model_coord_y (double& y) const y = 2.0 * y - 1.0; } else { y = y * (double)(alist->get_max_y() - alist->get_min_y()) + alist->get_min_y(); - if (ARDOUR::parameter_is_midi((ARDOUR::AutomationType)alist->parameter().type())) { + if (_desc.toggled || _desc.integer_step) { y = round(y); } } @@ -1211,11 +1209,8 @@ AutomationLine::model_to_view_coord (double& x, double& y) const void AutomationLine::interpolation_changed (AutomationList::InterpolationStyle style) { - if (style == AutomationList::Discrete) { - set_visibility (ControlPoints); - line->hide(); - } else { - set_visibility (Line); + if (line_points.size() > 1) { + line->set_steps(line_points, is_stepped()); } } diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h index a18f93d9ae..cf940df5be 100644 --- a/gtk2_ardour/automation_line.h +++ b/gtk2_ardour/automation_line.h @@ -224,6 +224,7 @@ private: */ ARDOUR::framecnt_t _offset; + bool is_stepped() const; void update_visibility (); void reset_line_coords (ControlPoint&); void add_visible_control_point (uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t); diff --git a/libs/canvas/canvas/poly_line.h b/libs/canvas/canvas/poly_line.h index 16db9a69e2..04b05f5df1 100644 --- a/libs/canvas/canvas/poly_line.h +++ b/libs/canvas/canvas/poly_line.h @@ -33,6 +33,8 @@ class LIBCANVAS_API PolyLine : public PolyItem PolyLine (Item*); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; + + virtual void set_steps (Points const &, bool stepped); bool covers (Duple const &) const; /** diff --git a/libs/canvas/poly_line.cc b/libs/canvas/poly_line.cc index 60bca6bccf..3150907db6 100644 --- a/libs/canvas/poly_line.cc +++ b/libs/canvas/poly_line.cc @@ -47,6 +47,30 @@ PolyLine::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons } } +void +PolyLine::set_steps (Points const & points, bool stepped) +{ + if (!stepped) { + PolyItem::set(points); + return; + } + + Points copy; + for (Points::const_iterator p = points.begin(); p != points.end();) { + Points::const_iterator next = p; + ++next; + + copy.push_back(*p); + if (next != points.end() && next->x != p->x) { + copy.push_back(Duple(next->x, p->y)); + } + + p = next; + } + + PolyItem::set(copy); +} + bool PolyLine::covers (Duple const & point) const { |