globally remove all trailing whitespace from ardour code base.
[ardour.git] / libs / canvas / flag.cc
index 8eb320e74b6824f71a88a1c4469feed0bfac211d..e3e9e409a2029ef7f5eb20dfe13ee3a110d430ee 100644 (file)
 using namespace std;
 using namespace ArdourCanvas;
 
-Flag::Flag (Group* parent, Distance height, Color outline_color, Color fill_color, Duple position)
-       : Group (parent)
-       , _height (height)
+Flag::Flag (Canvas* canvas, Distance height, Color outline_color, Color fill_color, Duple position, bool invert)
+       : Container (canvas)
        , _outline_color (outline_color)
        , _fill_color (fill_color)
+       , _invert (invert)
+{
+       setup (height, position);
+}
+
+Flag::Flag (Item* parent, Distance height, Color outline_color, Color fill_color, Duple position, bool invert)
+       : Container (parent)
+       , _outline_color (outline_color)
+       , _fill_color (fill_color)
+       , _invert (invert)
+{
+       setup (height, position);
+}
+
+void
+Flag::setup (Distance height, Duple position)
 {
        _text = new Text (this);
        _text->set_alignment (Pango::ALIGN_CENTER);
@@ -37,7 +52,6 @@ Flag::Flag (Group* parent, Distance height, Color outline_color, Color fill_colo
 
        _line = new Line (this);
        _line->set_outline_color (_outline_color);
-       set_height (_height);
 
        _rectangle = new Rectangle (this);
        _rectangle->set_outline_color (_outline_color);
@@ -45,9 +59,16 @@ Flag::Flag (Group* parent, Distance height, Color outline_color, Color fill_colo
 
        _text->raise_to_top ();
 
+       set_height (height);
        set_position (position);
 }
 
+void
+Flag::set_font_description (Pango::FontDescription font_description)
+{
+       _text->set_font_description (font_description);
+}
+
 void
 Flag::set_text (string const & text)
 {
@@ -55,14 +76,39 @@ Flag::set_text (string const & text)
        boost::optional<Rect> bbox = _text->bounding_box ();
        assert (bbox);
 
-       Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 3);
+       Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 4);
        
-       _text->set_position (flag_size / 2);
-       _rectangle->set (Rect (0, 0, flag_size.x, flag_size.y));
+       if (_invert) {
+               const Distance h = fabs(_line->y1() - _line->y0());
+               _text->set_position (Duple (5, h - flag_size.y + 2));
+               _rectangle->set (Rect (0, h - flag_size.y, flag_size.x, h));
+       } else {
+               _text->set_position (Duple (5, 2));
+               _rectangle->set (Rect (0, 0, flag_size.x, flag_size.y));
+       }
 }
 
 void
-Flag::set_height (Distance)
+Flag::set_height (Distance h)
 {
-       _line->set (Duple (0, 0), Duple (0, _height));
+       _line->set (Duple (0, 0), Duple (0, h));
+
+       if (_invert) {
+               boost::optional<Rect> bbox = _text->bounding_box ();
+               if (bbox) {
+                       Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 4);
+                       _rectangle->set (Rect (0, h - flag_size.y, flag_size.x, h));
+                       _text->set_position (Duple (5, h - flag_size.y + 2));
+               }
+       }
+}
+
+bool
+Flag::covers (Duple const & point) const
+{
+       if (_rectangle) {
+               return _rectangle->covers (point);
+       }
+
+       return false;
 }