X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fflag.cc;h=87c3cc281c86043fdf075f21497d67b2df8d9974;hb=289078f7f8224ec72fb23d81b0e2b53a09611cfa;hp=8eb320e74b6824f71a88a1c4469feed0bfac211d;hpb=e2f0c5f91e2579c41d8efc9495b6ebac31a61ba3;p=ardour.git diff --git a/libs/canvas/flag.cc b/libs/canvas/flag.cc index 8eb320e74b..87c3cc281c 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,14 +76,39 @@ 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); + 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, 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 +Flag::covers (Duple const & point) const { - _line->set (Duple (0, 0), Duple (0, _height)); + if (_rectangle) { + return _rectangle->covers (point); + } + + return false; }