fix a cast warning (as recommended in GTK+ docs
[ardour.git] / libs / canvas / arrow.cc
index 86d4e33ca97b7de567c59c14e4710eca78d8f5be..f95c6ecc8ff81bab6b035cfab60cb1622b066b6b 100644 (file)
@@ -1,22 +1,23 @@
 /*
-    Copyright (C) 2011 Paul Davis
-    Author: Carl Hetherington <cth@carlh.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2012 Carl Hetherington <carl@carlh.net>
+ * Copyright (C) 2013-2014 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2015-2017 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2015 David Robillard <d@drobilla.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 
 /** @file  canvas/arrow.cc
  *  @brief Implementation of the Arrow canvas object.
@@ -35,13 +36,13 @@ using namespace ArdourCanvas;
  *  @param parent Parent canvas group.
  */
 Arrow::Arrow (Canvas* c)
-       : Group (c)
+       : Container (c)
 {
        setup ();
 }
 
-Arrow::Arrow (Group* g)
-       : Group (g)
+Arrow::Arrow (Item* parent)
+       : Container (parent)
 {
        setup ();
 }
@@ -58,11 +59,28 @@ Arrow::setup ()
                setup_polygon (i);
                CANVAS_DEBUG_NAME (_heads[i].polygon, string_compose ("arrow head %1", i));
        }
-       
+
        _line = new Line (this);
        CANVAS_DEBUG_NAME (_line, "arrow line");
 }
 
+void
+Arrow::compute_bounding_box () const
+{
+       /* Compute our bounding box manually rather than using the default
+          container algorithm, since having the bounding box with origin other
+          than zero causes strange problems for mysterious reasons. */
+
+       const double outline_pad = 0.5 + (_line->outline_width() / 2.0);
+       const double head_width  = std::max(_heads[0].width, _heads[1].width);
+
+       _bounding_box = Rect(0,
+                            0,
+                            _line->x1() + (head_width / 2.0) + outline_pad,
+                            _line->y1());
+
+       _bounding_box_dirty = false;
+}
 
 /** Set whether to show an arrow head at one end or other
  *  of the line.
@@ -73,9 +91,9 @@ void
 Arrow::set_show_head (int which, bool show)
 {
        assert (which == 0 || which == 1);
-       
+
        begin_change ();
-       
+
        if (!show) {
                delete _heads[which].polygon;
                _heads[which].polygon = 0;
@@ -97,7 +115,7 @@ void
 Arrow::set_head_outward (int which, bool outward)
 {
        assert (which == 0 || which == 1);
-       
+
        begin_change ();
 
        _heads[which].outward = outward;
@@ -115,9 +133,9 @@ void
 Arrow::set_head_height (int which, Distance height)
 {
        assert (which == 0 || which == 1);
-       
+
        begin_change ();
-       
+
        _heads[which].height = height;
 
        setup_polygon (which);
@@ -133,9 +151,9 @@ void
 Arrow::set_head_width (int which, Distance width)
 {
        assert (which == 0 || which == 1);
-       
+
        begin_change ();
-       
+
        _heads[which].width = width;
 
        setup_polygon (which);
@@ -156,6 +174,7 @@ Arrow::set_outline_width (Distance width)
        if (_heads[1].polygon) {
                _heads[1].polygon->set_outline_width (width);
        }
+       _bounding_box_dirty = true;
 }
 
 /** Set the x position of our line.
@@ -171,7 +190,7 @@ Arrow::set_x (Coord x)
                        _heads[i].polygon->set_x_position (x - _heads[i].width / 2);
                }
        }
-               
+       _bounding_box_dirty = true;
 }
 
 /** Set the y position of end 0 of our line.
@@ -184,6 +203,7 @@ Arrow::set_y0 (Coord y0)
        if (_heads[0].polygon) {
                _heads[0].polygon->set_y_position (y0);
        }
+       _bounding_box_dirty = true;
 }
 
 /** Set the y position of end 1 of our line.
@@ -196,6 +216,7 @@ Arrow::set_y1 (Coord y1)
        if (_heads[1].polygon) {
                _heads[1].polygon->set_y_position (y1 - _heads[1].height);
        }
+       _bounding_box_dirty = true;
 }
 
 /** @return x position of our line in pixels (in our coordinate system) */
@@ -219,7 +240,7 @@ void
 Arrow::setup_polygon (int which)
 {
        assert (which == 0 || which == 1);
-       
+
        Points points;
 
        if ((which == 0 && _heads[which].outward) || (which == 1 && !_heads[which].outward)) {
@@ -242,7 +263,7 @@ Arrow::setup_polygon (int which)
  *  @param color New color.
  */
 void
-Arrow::set_color (Color color)
+Arrow::set_color (Gtkmm2ext::Color color)
 {
        _line->set_outline_color (color);
        for (int i = 0; i < 2; ++i) {