patch from brian to get consistent menu behaviour
[ardour.git] / gtk2_ardour / automation_line.h
index dbb920f52a84a08940b39aee9406a2e6a8c93796..b73a1c548ab840f3787a5080cb62a1e052fd80ef 100644 (file)
 #include <string>
 #include <sys/types.h>
 
-#include <gtkmm.h>
-#include <libgnomecanvasmm/libgnomecanvasmm.h>
+#include <libgnomecanvasmm/line.h>
 #include <sigc++/signal.h>
+#include "canvas.h"
+#include "simplerect.h"
 
 #include <pbd/undo.h>
+#include <pbd/statefuldestructible.h> 
 
 #include <ardour/automation_event.h>
 
@@ -55,9 +57,9 @@ namespace Gnome {
 class ControlPoint 
 {
   public:
-        ControlPoint (AutomationLine& al, sigc::slot<bool,GdkEvent*,ControlPoint*>);
+        ControlPoint (AutomationLine& al);
        ControlPoint (const ControlPoint&, bool dummy_arg_to_force_special_copy_constructor);
-       ~ControlPoint ();
+       virtual ~ControlPoint ();
 
        enum ShapeType {
                Full,
@@ -77,13 +79,16 @@ class ControlPoint
        void set_size (double);
        void set_visible (bool);
 
-       Gnome::Canvas::SimpleRect* item;
+       ArdourCanvas::SimpleRect* item;
        AutomationLine& line;
        uint32_t view_index;
        ARDOUR::AutomationList::iterator model;
        bool can_slide;
        bool selected;
        
+  protected:
+       virtual bool event_handler (GdkEvent*);
+
   private:
        double _x;
        double _y;
@@ -91,12 +96,10 @@ class ControlPoint
        ShapeType _shape;
 };
 
-class AutomationLine : public sigc::trackable
+class AutomationLine : public sigc::trackable, public PBD::StatefulThingWithGoingAway
 {
   public:
-        AutomationLine (string name, TimeAxisView&, Gnome::Canvas::Group&, ARDOUR::AutomationList&,
-                       sigc::slot<bool,GdkEvent*,ControlPoint*>, sigc::slot<bool,GdkEvent*,AutomationLine*>);
-
+        AutomationLine (const string & name, TimeAxisView&, ArdourCanvas::Group&, ARDOUR::AutomationList&);
        virtual ~AutomationLine ();
 
        void queue_reset ();
@@ -104,7 +107,7 @@ class AutomationLine : public sigc::trackable
        void clear();
 
        void set_selected_points (PointSelection&);
-       void get_selectables (jack_nframes_t& start, jack_nframes_t& end,
+       void get_selectables (nframes_t& start, nframes_t& end,
                              double botfrac, double topfrac, 
                              list<Selectable*>& results);
        void get_inverted_selectables (Selection&, list<Selectable*>& results);
@@ -115,7 +118,7 @@ class AutomationLine : public sigc::trackable
        /* dragging API */
 
        virtual void start_drag (ControlPoint*, float fraction);
-       virtual void point_drag(ControlPoint&, jack_nframes_t x, float, bool with_push);
+       virtual void point_drag(ControlPoint&, nframes_t x, float, bool with_push);
        virtual void end_drag (ControlPoint*);
        virtual void line_drag(uint32_t i1, uint32_t i2, float, bool with_push);
 
@@ -136,15 +139,13 @@ class AutomationLine : public sigc::trackable
 
        TimeAxisView& trackview;
 
-       Gnome::Canvas::Group& canvas_group() const { return *group; }
-       Gnome::Canvas::Item&  parent_group() const { return _parent_group; }
-       Gnome::Canvas::Item&  grab_item() const { return *line; }
+       ArdourCanvas::Group& canvas_group() const { return *group; }
+       ArdourCanvas::Item&  parent_group() const { return _parent_group; }
+       ArdourCanvas::Item&  grab_item() const { return *line; }
 
        void show_selection();
        void hide_selection ();
 
-       void set_point_size (double size);
-
        virtual string  get_verbose_cursor_string (float);
        virtual void view_to_model_y (double&) = 0;
        virtual void model_to_view_y (double&) = 0;
@@ -157,7 +158,11 @@ class AutomationLine : public sigc::trackable
        bool is_last_point (ControlPoint &);
        bool is_first_point (ControlPoint &);
 
+       XMLNode& get_state (void);
+       int set_state (const XMLNode&);
+
   protected:
+
        string _name;
        guint32 _height;
        uint32_t _line_color;
@@ -170,14 +175,12 @@ class AutomationLine : public sigc::trackable
        bool    no_draw : 1;
        bool    points_visible : 1;
        
-       Gnome::Canvas::Group&  _parent_group;
-       Gnome::Canvas::Group*   group;
-       Gnome::Canvas::Line*   line; /* line */
-       Gnome::Canvas::Points  line_points; /* coordinates for canvas line */
+       ArdourCanvas::Group&  _parent_group;
+       ArdourCanvas::Group*   group;
+       ArdourCanvas::Line*   line; /* line */
+       ArdourCanvas::Points  line_points; /* coordinates for canvas line */
        vector<ControlPoint*>  control_points; /* visible control points */
 
-       sigc::slot<bool,GdkEvent*,ControlPoint*> point_slot;
-
        struct ALPoint {
            double x;
            double y;
@@ -199,9 +202,9 @@ class AutomationLine : public sigc::trackable
        virtual void change_model_range (ARDOUR::AutomationList::iterator,ARDOUR::AutomationList::iterator, double delta, float ydelta);
 
        void reset_callback (const ARDOUR::AutomationList&);
-       void list_changed (ARDOUR::Change);
+       void list_changed ();
 
-       UndoAction get_memento();
+       virtual bool event_handler (GdkEvent*);
        
   private:
        uint32_t drags;
@@ -214,16 +217,18 @@ class AutomationLine : public sigc::trackable
        void reset_line_coords (ControlPoint&);
        void update_line ();
 
+       double control_point_box_size ();
+
        struct ModelRepresentation {
            ARDOUR::AutomationList::iterator start;
            ARDOUR::AutomationList::iterator end;
-           jack_nframes_t xpos;
+           nframes_t xpos;
            double ypos;
-           jack_nframes_t xmin;
+           nframes_t xmin;
            double ymin;
-           jack_nframes_t xmax;
+           nframes_t xmax;
            double ymax;
-           jack_nframes_t xval;
+           nframes_t xval;
            double yval;
        };