X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fflag.cc;h=87c3cc281c86043fdf075f21497d67b2df8d9974;hb=94e4e2f55f79fc025dad17a72dcd7217869a3d91;hp=756b54545fd0d547a93f5d8a53f5802e41b263b0;hpb=6fc1f270137a06115a79c6089004174c5cab5ed7;p=ardour.git diff --git a/libs/canvas/flag.cc b/libs/canvas/flag.cc index 756b54545f..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,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); + 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 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