vtl: query video-monitor-state on explicit session save
[ardour.git] / gtk2_ardour / control_point.cc
index 047417d82a6c226017f467f9378f052eca79deb5..d869e094aad16ffc3fd52494b35244165d97814c 100644 (file)
 #include "i18n.h"
 
 using namespace std;
-using namespace sigc;
 using namespace ARDOUR;
 using namespace PBD;
 using namespace Gnome; // for Canvas
 
+PBD::Signal1<void, ControlPoint *> ControlPoint::CatchDeletion;
+
 ControlPoint::ControlPoint (AutomationLine& al)
        : _line (al)
 {
@@ -41,16 +42,15 @@ ControlPoint::ControlPoint (AutomationLine& al)
        _y = 0;
        _shape = Full;
        _size = 4.0;
-       _selected = false;
 
        _item = new Canvas::SimpleRect (_line.canvas_group());
        _item->property_draw() = true;
        _item->property_fill() = false;
-       _item->property_fill_color_rgba() =  ARDOUR_UI::config()->canvasvar_ControlPointFill.get();
+       _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_data ("control_point", this);
-       _item->signal_event().connect (mem_fun (this, &ControlPoint::event_handler));
+       _item->signal_event().connect (sigc::mem_fun (this, &ControlPoint::event_handler));
 
        hide ();
        set_visible (false);
@@ -70,7 +70,6 @@ ControlPoint::ControlPoint (const ControlPoint& other, bool /*dummy_arg_to_force
        _y = other._y;
        _shape = other._shape;
        _size = other._size;
-       _selected = false;
 
        _item = new Canvas::SimpleRect (_line.canvas_group());
        _item->property_fill() = false;
@@ -85,6 +84,8 @@ ControlPoint::ControlPoint (const ControlPoint& other, bool /*dummy_arg_to_force
 
 ControlPoint::~ControlPoint ()
 {
+       CatchDeletion (this); /* EMIT SIGNAL */
+       
        delete _item;
 }
 
@@ -112,40 +113,37 @@ ControlPoint::set_visible (bool yn)
        _item->property_draw() = (gboolean) yn;
 }
 
+bool
+ControlPoint::visible () const
+{
+       return _item->property_draw ();
+}
+
 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);
 }
 
 void
-ControlPoint::show_color (bool entered, bool hide_too)
+ControlPoint::set_color ()
 {
        uint32_t color = 0;
 
-       if (entered) {
-               if (_selected) {
-                       color = ARDOUR_UI::config()->canvasvar_EnteredControlPointSelected.get();
-                       set_visible(true);
-               } else {
-                       color = ARDOUR_UI::config()->canvasvar_EnteredControlPointOutline.get();
-                       if (hide_too) {
-                               set_visible(false);
-                       }
-               }
-
+       if (_selected) {
+               color = ARDOUR_UI::config()->canvasvar_ControlPointSelected.get();
        } else {
-               if (_selected) {
-                       color = ARDOUR_UI::config()->canvasvar_ControlPointSelected.get();
-                       set_visible(true);
-               } else {
-                       color = ARDOUR_UI::config()->canvasvar_ControlPointOutline.get();
-                       if (hide_too) {
-                               set_visible(false);
-                       }
-               }
+               color = ARDOUR_UI::config()->canvasvar_ControlPointOutline.get();
        }
 
        _item->property_outline_color_rgba() = color;
@@ -156,15 +154,6 @@ void
 ControlPoint::set_size (double sz)
 {
        _size = sz;
-
-#if 0
-       if (_size > 6.0) {
-               item->property_fill() = (gboolean) TRUE;
-       } else {
-               item->property_fill() = (gboolean) FALSE;
-       }
-#endif
-
        move_to (_x, _y, _shape);
 }
 
@@ -200,3 +189,8 @@ ControlPoint::move_to (double x, double y, ShapeType shape)
        _shape = shape;
 }
 
+void
+ControlPoint::i2w (double& x, double& y) const
+{
+       _item->i2w (x, y);
+}