Merge remote-tracking branch 'remotes/origin/cairocanvas' into windows
[ardour.git] / gtk2_ardour / automation_line.h
index 73734bcd40fc0fbbf0d01eee91325b78543e08c7..816105b1e56b70c8333c5c6b2c0a775043200db4 100644 (file)
 #include <string>
 #include <sys/types.h>
 
-#include <libgnomecanvasmm/line.h>
 #include <sigc++/signal.h>
-#include "canvas.h"
-#include "simplerect.h"
 
 #include "evoral/TimeConverter.hpp"
 
 #include "ardour/automation_list.h"
 #include "ardour/types.h"
 
+#include "canvas/types.h"
+#include "canvas/group.h"
+#include "canvas/curve.h"
+
 class AutomationLine;
 class ControlPoint;
 class PointSelection;
@@ -47,11 +48,6 @@ class AutomationTimeAxisView;
 class Selectable;
 class Selection;
 
-namespace Gnome {
-       namespace Canvas {
-               class SimpleRect;
-       }
-}
 
 /** A GUI representation of an ARDOUR::AutomationList */
 class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
@@ -80,11 +76,11 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
        bool control_points_adjacent (double xval, uint32_t& before, uint32_t& after);
 
        /* dragging API */
-       virtual void start_drag_single (ControlPoint*, double, float);
-       virtual void start_drag_line (uint32_t, uint32_t, float);
-       virtual void start_drag_multiple (std::list<ControlPoint*>, float, XMLNode *);
-       virtual std::pair<double, float> drag_motion (double, float, bool, bool);
-       virtual void end_drag ();
+        virtual void start_drag_single (ControlPoint*, double, float);
+        virtual void start_drag_line (uint32_t, uint32_t, float);
+        virtual void start_drag_multiple (std::list<ControlPoint*>, float, XMLNode *);
+        virtual std::pair<double, float> drag_motion (double, float, bool, bool with_push, uint32_t& final_index);
+        virtual void end_drag (bool with_push, uint32_t final_index);
 
        ControlPoint* nth (uint32_t);
        ControlPoint const * nth (uint32_t) const;
@@ -178,13 +174,30 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
 
        ArdourCanvas::Group&        _parent_group;
        ArdourCanvas::Group*        group;
-       ArdourCanvas::Line*         line; /* line */
+       ArdourCanvas::Curve*        line; /* line */
        ArdourCanvas::Points        line_points; /* coordinates for canvas line */
        std::vector<ControlPoint*>  control_points; /* visible control points */
 
+        class ContiguousControlPoints : public std::list<ControlPoint*> {
+         public:
+           ContiguousControlPoints (AutomationLine& al);
+           double clamp_dx (double dx);
+           void move (double dx, double dy);
+           void compute_x_bounds ();
+         private:
+           AutomationLine& line;
+           double before_x;
+           double after_x;
+       };
+
+        friend class ContiguousControlPoints;
+
+       typedef boost::shared_ptr<ContiguousControlPoints> CCP;
+        std::vector<CCP> contiguous_points;
+
        void sync_model_with_view_point (ControlPoint&);
        void sync_model_with_view_points (std::list<ControlPoint*>);
-       void start_drag_common (double, float);
+        void start_drag_common (double, float);
 
        virtual void change_model (ARDOUR::AutomationList::iterator, double x, double y);