Ardour  8.12
automation_line.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2017 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2005 Karsten Wiese <fzuuzf@googlemail.com>
4  * Copyright (C) 2005 Nick Mainsbridge <mainsbridge@gmail.com>
5  * Copyright (C) 2005 Taybin Rutkin <taybin@taybin.com>
6  * Copyright (C) 2006 Hans Fugal <hans@fugal.net>
7  * Copyright (C) 2007-2012 Carl Hetherington <carl@carlh.net>
8  * Copyright (C) 2007-2015 David Robillard <d@drobilla.net>
9  * Copyright (C) 2014-2017 Robin Gareus <robin@gareus.org>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License along
22  * with this program; if not, write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25 
26 #ifndef __ardour_automation_line_h__
27 #define __ardour_automation_line_h__
28 
29 #include <vector>
30 #include <list>
31 #include <string>
32 #include <sys/types.h>
33 
34 #include <sigc++/signal.h>
35 
36 #include "pbd/undo.h"
38 #include "pbd/memento_command.h"
39 
40 #include "ardour/automation_list.h"
42 #include "ardour/types.h"
43 
44 #include "canvas/types.h"
45 #include "canvas/container.h"
46 #include "canvas/poly_line.h"
47 
48 class AutomationLine;
49 class ControlPoint;
50 class PointSelection;
51 class TimeAxisView;
53 class Selectable;
54 class Selection;
55 class PublicEditor;
56 
57 
59 class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
60 {
61 public:
63  Line = 0x1,
66  };
67 
68  AutomationLine (const std::string& name,
69  TimeAxisView& tv,
70  ArdourCanvas::Item& parent,
71  std::shared_ptr<ARDOUR::AutomationList> al,
72  const ARDOUR::ParameterDescriptor& desc);
73 
74 
75  virtual ~AutomationLine ();
76 
77  virtual Temporal::timepos_t get_origin () const;
78 
79  void queue_reset ();
80  void reset ();
81  void clear ();
82  void set_fill (bool f) { _fill = f; } // owner needs to call set_height
83 
85  void get_selectables (Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list<Selectable*>&);
86  void get_inverted_selectables (Selection&, std::list<Selectable*>& results);
87 
88  virtual void remove_point (ControlPoint&);
89  bool control_points_adjacent (double xval, uint32_t& before, uint32_t& after);
90 
91  /* dragging API */
92  virtual void start_drag_single (ControlPoint*, double, float);
93  virtual void start_drag_line (uint32_t, uint32_t, float);
94  virtual void start_drag_multiple (std::list<ControlPoint*>, float, XMLNode *);
95  virtual std::pair<float, float> drag_motion (Temporal::timecnt_t const &, float, bool, bool with_push, uint32_t& final_index);
96  virtual void end_drag (bool with_push, uint32_t final_index);
97  virtual void end_draw_merge () {}
98 
99  ControlPoint* nth (uint32_t);
100  ControlPoint const * nth (uint32_t) const;
101  uint32_t npoints() const { return control_points.size(); }
102 
103  std::string name() const { return _name; }
104  bool visible() const { return _visible != VisibleAspects(0); }
105  guint32 height() const { return _height; }
106 
107  void set_line_color (std::string color, std::string mod = "");
108  uint32_t get_line_color() const;
109 
113 
114  void hide ();
115  void set_height (guint32);
116 
117  bool get_uses_gain_mapping () const;
119 
121 
124  ArdourCanvas::Item& grab_item() const { return *line; }
125 
126  virtual std::string get_verbose_cursor_string (double) const;
127  std::string get_verbose_cursor_relative_string (double, double) const;
128  std::string fraction_to_string (double) const;
129  std::string delta_to_string (double) const;
130  double string_to_fraction (std::string const &) const;
131 
132  void view_to_model_coord_y (double &) const;
133 
134  double model_to_view_coord_y (double) const;
136 
137  double compute_delta (double from, double to) const;
138  void apply_delta (double& val, double delta) const;
139 
140  void set_list(std::shared_ptr<ARDOUR::AutomationList> list);
141  std::shared_ptr<ARDOUR::AutomationList> the_list() const { return alist; }
142 
144  void track_exited();
145 
148 
149  XMLNode& get_state () const;
150  int set_state (const XMLNode&, int version);
151  void set_colors();
152 
153  void modify_points_y (std::vector<ControlPoint*> const&, double);
154 
156 
157  std::pair<Temporal::timepos_t, Temporal::timepos_t> get_point_x_range () const;
158 
161  return _maximum_time;
162  }
163 
167 
169  void dump (std::ostream&) const;
170 
172 
173 protected:
174 
175  std::string _name;
176  guint32 _height;
177  std::string _line_color;
178  std::string _line_color_mod;
180  std::shared_ptr<ARDOUR::AutomationList> alist;
181 
183 
187  bool no_draw;
190  bool did_push;
191 
195  ArdourCanvas::Points line_points; /* coordinates for canvas line */
196  std::vector<ControlPoint*> control_points; /* visible control points */
197 
198  class ContiguousControlPoints : public std::list<ControlPoint*> {
199 public:
202  void move (Temporal::timecnt_t const &, double dvalue);
204 private:
208  };
209 
211 
212  typedef std::shared_ptr<ContiguousControlPoints> CCP;
213  std::vector<CCP> contiguous_points;
214 
216  bool sync_model_with_view_points (std::list<ControlPoint*>);
217  void start_drag_common (double, float);
218 
220  void list_changed ();
221 
222  virtual bool event_handler (GdkEvent*);
223 
224 private:
225  std::list<ControlPoint*> _drag_points;
226  std::list<ControlPoint*> _push_points;
233 
234  bool is_stepped() const;
237  void add_visible_control_point (uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t);
241 
243 
246 
247  bool _fill;
248 
250 
251  friend class AudioRegionGainLine;
252  friend class RegionFxLine;
253 };
254 
255 #endif /* __ardour_automation_line_h__ */
256 
void move(Temporal::timecnt_t const &, double dvalue)
ContiguousControlPoints(AutomationLine &al)
void compute_x_bounds(PublicEditor &e)
Temporal::timecnt_t clamp_dt(Temporal::timecnt_t const &dx, Temporal::timepos_t const &region_limit)
virtual MementoCommandBinder< ARDOUR::AutomationList > * memento_command_binder()
guint32 height() const
void start_drag_common(double, float)
std::string delta_to_string(double) const
std::list< ControlPoint * > _drag_points
points we are dragging
void track_exited()
virtual void end_drag(bool with_push, uint32_t final_index)
bool sync_model_with_view_points(std::list< ControlPoint * >)
void reset_callback(const Evoral::ControlList &)
void add_visible_control_point(uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t)
void set_width(Temporal::timecnt_t const &)
void set_list(std::shared_ptr< ARDOUR::AutomationList > list)
bool get_uses_gain_mapping() const
virtual ~AutomationLine()
void set_line_color(std::string color, std::string mod="")
int set_state(const XMLNode &, int version)
double model_to_view_coord_y(double) const
ArdourCanvas::Points line_points
std::string fraction_to_string(double) const
bool visible() const
std::string name() const
double _last_drag_fraction
last y position of the drag, as a fraction
void remove_visibility(VisibleAspects)
bool sync_model_with_view_point(ControlPoint &)
virtual bool event_handler(GdkEvent *)
ArdourCanvas::Item & grab_item() const
bool is_first_point(ControlPoint &)
virtual void start_drag_single(ControlPoint *, double, float)
void track_entered()
double compute_delta(double from, double to) const
void get_inverted_selectables(Selection &, std::list< Selectable * > &results)
virtual void start_drag_multiple(std::list< ControlPoint * >, float, XMLNode *)
const ARDOUR::ParameterDescriptor _desc
VisibleAspects _visible
void connect_to_list()
std::shared_ptr< ARDOUR::AutomationList > the_list() const
void dump(std::ostream &) const
std::pair< Temporal::timepos_t, Temporal::timepos_t > get_point_x_range() const
ArdourCanvas::PolyLine * line
virtual Temporal::timepos_t get_origin() const
std::vector< CCP > contiguous_points
void set_visibility(VisibleAspects)
void modify_points_y(std::vector< ControlPoint * > const &, double)
void add_visibility(VisibleAspects)
bool is_stepped() const
AutomationLine(const std::string &name, TimeAxisView &tv, ArdourCanvas::Item &parent, std::shared_ptr< ARDOUR::AutomationList > al, const ARDOUR::ParameterDescriptor &desc)
void set_maximum_time(Temporal::timepos_t const &)
double string_to_fraction(std::string const &) const
void list_changed()
Temporal::timepos_t session_position(Temporal::timepos_t const &) const
Temporal::timepos_t maximum_time() const
Temporal::timecnt_t model_to_view_coord_x(Temporal::timepos_t const &) const
bool _drag_had_movement
true if the drag has seen movement, otherwise false
void queue_reset()
void set_selected_points(PointSelection const &)
ArdourCanvas::Item & _parent_group
virtual std::pair< float, float > drag_motion(Temporal::timecnt_t const &, float, bool, bool with_push, uint32_t &final_index)
virtual void end_draw_merge()
ArdourCanvas::Container & canvas_group() const
void set_height(guint32)
std::list< ControlPoint * > _push_points
additional points we are dragging if "push" is enabled
Temporal::timepos_t offset()
std::string get_verbose_cursor_relative_string(double, double) const
ArdourCanvas::Container * group
void set_fill(bool f)
void update_visibility()
double control_point_box_size()
virtual void remove_point(ControlPoint &)
ArdourCanvas::Item & parent_group() const
std::shared_ptr< ContiguousControlPoints > CCP
std::string _name
TimeAxisView & trackview
std::shared_ptr< ARDOUR::AutomationList > alist
virtual void start_drag_line(uint32_t, uint32_t, float)
Temporal::timepos_t _offset
void reset_line_coords(ControlPoint &)
ControlPoint const * nth(uint32_t) const
double dt_to_dx(Temporal::timepos_t const &, Temporal::timecnt_t const &)
void view_to_model_coord_y(double &) const
void interpolation_changed(ARDOUR::AutomationList::InterpolationStyle)
std::vector< ControlPoint * > control_points
void apply_delta(double &val, double delta) const
bool control_points_adjacent(double xval, uint32_t &before, uint32_t &after)
uint32_t npoints() const
XMLNode & get_state() const
bool is_last_point(ControlPoint &)
virtual std::string get_verbose_cursor_string(double) const
void get_selectables(Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list< Selectable * > &)
uint32_t get_line_color() const
PBD::ScopedConnectionList _list_connections
void tempo_map_changed()
ControlPoint * nth(uint32_t)
std::string _line_color
Temporal::timepos_t _maximum_time
void set_offset(Temporal::timepos_t const &)
uint32_t _view_index_offset
std::string _line_color_mod
bool terminal_points_can_slide
EventList::iterator iterator
Definition: ControlList.h:93
Representation of the interface of the Editor class.
Lists of selected things.
Definition: xml++.h:114
PBD::PropertyDescriptor< uint32_t > color
std::vector< Duple > Points