globally remove all trailing whitespace from ardour code base.
[ardour.git] / libs / canvas / flag.cc
index b6532d7fd260872302757521cbb6f06dc4ff87cd..e3e9e409a2029ef7f5eb20dfe13ee3a110d430ee 100644 (file)
 using namespace std;
 using namespace ArdourCanvas;
 
-Flag::Flag (Canvas* canvas, Distance height, Color outline_color, Color fill_color, Duple position)
-       : Layout (canvas)
+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)
-       : Layout (parent)
+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 
+void
 Flag::setup (Distance height, Duple position)
 {
        _text = new Text (this);
@@ -50,7 +52,6 @@ Flag::setup (Distance height, Duple position)
 
        _line = new Line (this);
        _line->set_outline_color (_outline_color);
-       set_height (height);
 
        _rectangle = new Rectangle (this);
        _rectangle->set_outline_color (_outline_color);
@@ -58,9 +59,16 @@ Flag::setup (Distance height, Duple position)
 
        _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)
 {
@@ -70,14 +78,29 @@ Flag::set_text (string const & text)
 
        Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 4);
        
-       _text->set_position (Duple (5, 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 h)
 {
        _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
@@ -85,7 +108,7 @@ Flag::covers (Duple const & point) const
 {
        if (_rectangle) {
                return _rectangle->covers (point);
-       } 
+       }
 
        return false;
 }