X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fflag.cc;h=2d0bdb28305bb764a6215a60977c5627da8eff92;hb=c8c6bca6587450ff64303dbc994a4cd28d6ce7aa;hp=756b54545fd0d547a93f5d8a53f5802e41b263b0;hpb=59da788793186d90c30b10654bcfd4d20a7d6eb3;p=ardour.git diff --git a/libs/canvas/flag.cc b/libs/canvas/flag.cc index 756b54545f..2d0bdb2830 100644 --- a/libs/canvas/flag.cc +++ b/libs/canvas/flag.cc @@ -25,11 +25,26 @@ 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,16 +76,31 @@ Flag::set_text (string const & text) boost::optional bbox = _text->bounding_box (); assert (bbox); - Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 3); - - _text->set_position (flag_size / 2); - _rectangle->set (Rect (0, 0, flag_size.x, flag_size.y)); + Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 4); + + 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 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 @@ -72,7 +108,7 @@ Flag::covers (Duple const & point) const { if (_rectangle) { return _rectangle->covers (point); - } + } return false; }