Show discrete/toggled automation as stepped line.

This commit is contained in:
David Robillard 2014-11-28 19:17:39 -05:00
parent e55b68298b
commit f190e630ab
4 changed files with 43 additions and 21 deletions

View file

@ -142,6 +142,13 @@ AutomationLine::event_handler (GdkEvent* event)
return PublicEditor::instance().canvas_line_event (event, line, this); return PublicEditor::instance().canvas_line_event (event, line, this);
} }
bool
AutomationLine::is_stepped() const
{
return (_desc.toggled ||
(alist && alist->interpolation() == AutomationList::Discrete));
}
void void
AutomationLine::update_visibility () 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 when automation points have been removed (the line will still follow the shape of the
old points). old points).
*/ */
if (alist->interpolation() != AutomationList::Discrete && control_points.size() >= 2) { if (control_points.size() >= 2) {
line->show(); line->show();
} else { } else {
line->hide (); line->hide ();
@ -200,11 +207,6 @@ AutomationLine::hide ()
double double
AutomationLine::control_point_box_size () 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)) { if (_height > TimeAxisView::preset_height (HeightLarger)) {
return 8.0; return 8.0;
} else if (_height > (guint32) TimeAxisView::preset_height (HeightNormal)) { } else if (_height > (guint32) TimeAxisView::preset_height (HeightNormal)) {
@ -287,7 +289,7 @@ AutomationLine::modify_point_y (ControlPoint& cp, double y)
reset_line_coords (cp); reset_line_coords (cp);
if (line_points.size() > 1) { if (line_points.size() > 1) {
line->set (line_points); line->set_steps (line_points, is_stepped());
} }
alist->freeze (); alist->freeze ();
@ -716,7 +718,7 @@ AutomationLine::drag_motion (double const x, float fraction, bool ignore_x, bool
*/ */
if (line_points.size() > 1) { 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_points[n].y = control_points[n]->get_y();
} }
line->set (line_points); line->set_steps (line_points, is_stepped());
update_visibility (); update_visibility ();
} }
@ -1132,17 +1134,13 @@ AutomationLine::remove_visibility (VisibleAspects va)
void void
AutomationLine::track_entered() AutomationLine::track_entered()
{ {
if (alist->interpolation() != AutomationList::Discrete) { add_visibility (ControlPoints);
add_visibility (ControlPoints);
}
} }
void void
AutomationLine::track_exited() AutomationLine::track_exited()
{ {
if (alist->interpolation() != AutomationList::Discrete) { remove_visibility (ControlPoints);
remove_visibility (ControlPoints);
}
} }
XMLNode & XMLNode &
@ -1182,7 +1180,7 @@ AutomationLine::view_to_model_coord_y (double& y) const
y = 2.0 * y - 1.0; y = 2.0 * y - 1.0;
} else { } else {
y = y * (double)(alist->get_max_y() - alist->get_min_y()) + alist->get_min_y(); 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); y = round(y);
} }
} }
@ -1211,11 +1209,8 @@ AutomationLine::model_to_view_coord (double& x, double& y) const
void void
AutomationLine::interpolation_changed (AutomationList::InterpolationStyle style) AutomationLine::interpolation_changed (AutomationList::InterpolationStyle style)
{ {
if (style == AutomationList::Discrete) { if (line_points.size() > 1) {
set_visibility (ControlPoints); line->set_steps(line_points, is_stepped());
line->hide();
} else {
set_visibility (Line);
} }
} }

View file

@ -224,6 +224,7 @@ private:
*/ */
ARDOUR::framecnt_t _offset; ARDOUR::framecnt_t _offset;
bool is_stepped() const;
void update_visibility (); void update_visibility ();
void reset_line_coords (ControlPoint&); void reset_line_coords (ControlPoint&);
void add_visible_control_point (uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t); void add_visible_control_point (uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t);

View file

@ -33,6 +33,8 @@ class LIBCANVAS_API PolyLine : public PolyItem
PolyLine (Item*); PolyLine (Item*);
void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
virtual void set_steps (Points const &, bool stepped);
bool covers (Duple const &) const; bool covers (Duple const &) const;
/** /**

View file

@ -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 bool
PolyLine::covers (Duple const & point) const PolyLine::covers (Duple const & point) const
{ {