Ardour  9.0-pre0-822-g12e3bc5c20
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 __gtk2_ardour_automation_line_base_h__
27 #define __gtk2_ardour_automation_line_base_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 #include "selectable.h"
49 
50 namespace ArdourCanvas {
51  class Rectangle;
52 }
53 
55 class ControlPoint;
56 class PointSelection;
57 class TimeAxisView;
59 class Selection;
60 class EditingContext;
61 
63 class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible, public SelectableOwner
64 {
65 public:
67  Line = 0x1,
70  };
71 
72  AutomationLine (const std::string& name,
73  EditingContext& ec,
74  ArdourCanvas::Item& parent,
76  std::shared_ptr<ARDOUR::AutomationList> al,
77  const ARDOUR::ParameterDescriptor& desc);
78 
79  virtual ~AutomationLine ();
80 
81  virtual Temporal::timepos_t get_origin () const;
82 
84 
85  void set_sensitive (bool);
86  bool sensitive() const { return _sensitive; }
87 
88  void queue_reset ();
89  void reset ();
90  void clear ();
91  void set_fill (bool f) { _fill = f; } // owner needs to call set_height
92 
94  void _get_selectables (Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list<Selectable*>&, bool within);
95  void get_inverted_selectables (Selection&, std::list<Selectable*>& results);
96 
97  virtual void remove_point (ControlPoint&);
98  bool control_points_adjacent (double xval, uint32_t& before, uint32_t& after);
99 
100  /* dragging API */
101  virtual void start_drag_single (ControlPoint*, double, float);
102  virtual void start_drag_line (uint32_t, uint32_t, float);
103  virtual void start_drag_multiple (std::list<ControlPoint*>, float, XMLNode *);
104  virtual std::pair<float, float> drag_motion (Temporal::timecnt_t const &, float, bool, bool with_push, uint32_t& final_index);
105  virtual void end_drag (bool with_push, uint32_t final_index);
106  virtual void end_draw_merge () {}
107 
108  ControlPoint* nth (uint32_t);
109  ControlPoint const * nth (uint32_t) const;
110  uint32_t npoints() const { return control_points.size(); }
111 
112  std::string name() const { return _name; }
113  bool visible() const { return _visible != VisibleAspects(0); }
114  guint32 height() const { return _height; }
115 
116  void set_line_color (std::string const & color, std::string color_mode = std::string());
118  uint32_t get_line_color() const;
119  uint32_t get_line_fill_color() const;
120  uint32_t get_line_selected_color() const;
123 
127 
128  void hide ();
129  void hide_all ();
130  void show ();
131  void set_height (guint32);
132 
133  bool get_uses_gain_mapping () const;
135 
138  ArdourCanvas::Item& grab_item() const { return *line; }
139 
140  virtual std::string get_verbose_cursor_string (double) const;
141  std::string get_verbose_cursor_relative_string (double, double) const;
142  std::string fraction_to_string (double) const;
143  std::string delta_to_string (double) const;
144  double string_to_fraction (std::string const &) const;
145 
146  void view_to_model_coord_y (double &) const;
147 
148  double model_to_view_coord_y (double) const;
150 
151  double compute_delta (double from, double to) const;
152  void apply_delta (double& val, double delta) const;
153 
154  void set_list(std::shared_ptr<ARDOUR::AutomationList> list);
155  std::shared_ptr<ARDOUR::AutomationList> the_list() const { return alist; }
156 
158  void track_exited();
159 
162 
163  XMLNode& get_state () const;
164  int set_state (const XMLNode&, int version);
165  void set_colors();
166 
167  void modify_points_y (std::vector<ControlPoint*> const&, double);
168 
170 
171  std::pair<Temporal::timepos_t, Temporal::timepos_t> get_point_x_range () const;
172 
175  return _maximum_time;
176  }
177 
181 
183  void dump (std::ostream&) const;
184 
186 
187  ARDOUR::ParameterDescriptor const & param() const { return _desc; }
189 
190  void add (std::shared_ptr<ARDOUR::AutomationControl>, GdkEvent*, Temporal::timepos_t const &, double y, bool with_guard_points);
191 
192 protected:
193 
194  std::string _name;
195  guint32 _height;
196  std::string _line_color_name;
197  std::string _line_color_mod;
200  std::shared_ptr<ARDOUR::AutomationList> alist;
201 
203 
207  bool no_draw;
210  bool did_push;
211 
217  ArdourCanvas::Points line_points; /* coordinates for canvas line */
218  std::vector<ControlPoint*> control_points; /* visible control points */
219 
220  class ContiguousControlPoints : public std::list<ControlPoint*> {
221  public:
224  void move (Temporal::timecnt_t const &, double dvalue);
226  private:
230  };
231 
233 
234  typedef std::shared_ptr<ContiguousControlPoints> CCP;
235  std::vector<CCP> contiguous_points;
236 
238  bool sync_model_with_view_points (std::list<ControlPoint*>);
239  void start_drag_common (double, float);
240 
242  void list_changed ();
243 
244  virtual bool event_handler (GdkEvent*) = 0;
245 
246 private:
247  std::list<ControlPoint*> _drag_points;
248  std::list<ControlPoint*> _push_points;
255 
256  bool is_stepped() const;
259  void add_visible_control_point (uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t);
263 
265 
268 
269  bool _fill;
270 
274 
275  friend class AudioRegionGainLine;
276  friend class RegionFxLine;
277 };
278 
279 #endif /* __gtk2_ardour_automation_line_base_h__ */
280 
void move(Temporal::timecnt_t const &, double dvalue)
ContiguousControlPoints(AutomationLine &al)
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)
ArdourCanvas::Rectangle * drag_base() const
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)
AutomationLine(const std::string &name, EditingContext &ec, ArdourCanvas::Item &parent, ArdourCanvas::Rectangle *drag_base, std::shared_ptr< ARDOUR::AutomationList > al, const ARDOUR::ParameterDescriptor &desc)
bool get_uses_gain_mapping() const
virtual ~AutomationLine()
int set_state(const XMLNode &, int version)
EditingContext & editing_context() const
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)
uint32_t get_line_fill_color() const
bool sync_model_with_view_point(ControlPoint &)
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
virtual bool event_handler(GdkEvent *)=0
void connect_to_list()
std::shared_ptr< ARDOUR::AutomationList > the_list() const
void set_insensitive_line_color(uint32_t color)
void dump(std::ostream &) const
bool control_points_inherit_color() 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
void set_line_color(std::string const &color, std::string color_mode=std::string())
bool sensitive() const
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
bool _control_points_inherit_color
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 &)
uint32_t get_line_selected_color() 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
std::shared_ptr< ARDOUR::AutomationList > alist
void set_control_points_inherit_color(bool)
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 _get_selectables(Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list< Selectable * > &, bool within)
EditingContext & _editing_context
void interpolation_changed(ARDOUR::AutomationList::InterpolationStyle)
void add(std::shared_ptr< ARDOUR::AutomationControl >, GdkEvent *, Temporal::timepos_t const &, double y, bool with_guard_points)
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
uint32_t get_line_color() const
void set_sensitive(bool)
uint32_t _insensitive_line_color
PBD::ScopedConnectionList _list_connections
ArdourCanvas::Rectangle * _drag_base
void tempo_map_changed()
ControlPoint * nth(uint32_t)
Temporal::timepos_t _maximum_time
void set_offset(Temporal::timepos_t const &)
std::string _line_color_name
ARDOUR::ParameterDescriptor const & param() const
uint32_t _view_index_offset
std::string _line_color_mod
bool terminal_points_can_slide
EventList::iterator iterator
Definition: ControlList.h:93
Lists of selected things.
Definition: xml++.h:114
PBD::PropertyDescriptor< uint32_t > color
std::vector< Duple > Points