merge with master, including manual merge conflict resolution
[ardour.git] / gtk2_ardour / control_point.cc
index 7632642adc32ce80be91e7ff1bf04116c48a86c9..8e05ad0a0b1b57367489db43177a66012c6b86a9 100644 (file)
 */
 
 #include "control_point.h"
-#include "diamond.h"
 #include "automation_line.h"
 #include "ardour_ui.h"
 #include "public_editor.h"
 
+#include "canvas/rectangle.h"
+
 #include "i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
-using namespace Gnome; // for Canvas
+
+PBD::Signal1<void, ControlPoint *> ControlPoint::CatchDeletion;
 
 ControlPoint::ControlPoint (AutomationLine& al)
        : _line (al)
@@ -41,14 +43,14 @@ ControlPoint::ControlPoint (AutomationLine& al)
        _shape = Full;
        _size = 4.0;
 
-       _item = new Canvas::SimpleRect (_line.canvas_group());
+       _item = new ArdourCanvas::Rectangle (&_line.canvas_group());
        _item->property_draw() = true;
-       _item->property_fill() = false;
-       _item->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_ControlPointFill.get();
-       _item->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_ControlPointOutline.get();
-       _item->property_outline_pixels() = 1;
+       _item->set_fill (false);
+       _item->set_fill_color (ARDOUR_UI::config()->canvasvar_ControlPointFill.get());
+       _item->set_outline_color (ARDOUR_UI::config()->canvasvar_ControlPointOutline.get());
+       _item->set_outline_width (1);
        _item->set_data ("control_point", this);
-       _item->signal_event().connect (sigc::mem_fun (this, &ControlPoint::event_handler));
+       _item->Event.connect (sigc::mem_fun (this, &ControlPoint::event_handler));
 
        hide ();
        set_visible (false);
@@ -69,10 +71,10 @@ ControlPoint::ControlPoint (const ControlPoint& other, bool /*dummy_arg_to_force
        _shape = other._shape;
        _size = other._size;
 
-       _item = new Canvas::SimpleRect (_line.canvas_group());
-       _item->property_fill() = false;
-       _item->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_ControlPointOutline.get();
-       _item->property_outline_pixels() = 1;
+       _item = new ArdourCanvas::Rectangle (&_line.canvas_group());
+       _item->set_fill (false);
+       _item->set_outline_color (ARDOUR_UI::config()->canvasvar_ControlPointOutline.get());
+       _item->set_outline_width (1);
 
        /* NOTE: no event handling in copied ControlPoints */
 
@@ -82,6 +84,8 @@ ControlPoint::ControlPoint (const ControlPoint& other, bool /*dummy_arg_to_force
 
 ControlPoint::~ControlPoint ()
 {
+       CatchDeletion (this); /* EMIT SIGNAL */
+       
        delete _item;
 }
 
@@ -118,6 +122,14 @@ ControlPoint::visible () const
 void
 ControlPoint::reset (double x, double y, AutomationList::iterator mi, uint32_t vi, ShapeType shape)
 {
+       /* If this is too big, libart will confuse itself and segfault after it casts the bounding box
+          of this automation line to ints.  Sigh.
+       */
+
+       if (x > INT32_MAX) {
+               x = INT32_MAX;
+       }
+
        _model = mi;
        _view_index = vi;
        move_to (x, y, shape);
@@ -134,8 +146,8 @@ ControlPoint::set_color ()
                color = ARDOUR_UI::config()->canvasvar_ControlPointOutline.get();
        }
 
-       _item->property_outline_color_rgba() = color;
-       _item->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_ControlPointFill.get();
+       _item->set_outline_color (color);
+       _item->set_fill_color (ARDOUR_UI::config()->canvasvar_ControlPointFill.get());
 }
 
 void
@@ -167,10 +179,7 @@ ControlPoint::move_to (double x, double y, ShapeType shape)
                break;
        }
 
-       _item->property_x1() = x1;
-       _item->property_x2() = x2;
-       _item->property_y1() = y - half_size;
-       _item->property_y2() = y + half_size;
+       _item->set (ArdourCanvas::Rect (x1, y - half_size, x2, y + half_size));
 
        _x = x;
        _y = y;
@@ -180,5 +189,5 @@ ControlPoint::move_to (double x, double y, ShapeType shape)
 void
 ControlPoint::i2w (double& x, double& y) const
 {
-       _item->i2w (x, y);
+       _item->item_to_canvas (x, y);
 }