X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fflag.cc;h=b00426ff9220a91281c02a6c02858682834a5d5d;hb=86ac64d5288baf2ad5d020b2b872598b7ee84d62;hp=243e71cd170e822735a278a8695d1efe81b3f7ca;hpb=23e7cf10191270d70357ccf0ed9294f020c7b7ab;p=ardour.git diff --git a/libs/canvas/flag.cc b/libs/canvas/flag.cc index 243e71cd17..b00426ff92 100644 --- a/libs/canvas/flag.cc +++ b/libs/canvas/flag.cc @@ -25,23 +25,25 @@ using namespace std; using namespace ArdourCanvas; -Flag::Flag (Canvas* canvas, Distance height, Color outline_color, Color fill_color, Duple position) +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) +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,26 +59,55 @@ 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) { - _text->set (text); - boost::optional bbox = _text->bounding_box (); + if (text == _text->text()) { + return; + } else if (text.empty ()) { + _text->set (" "); + } else { + _text->set (text); + } + + Rect bbox = _text->bounding_box (); assert (bbox); - 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)); + Duple flag_size (bbox.width() + 10, bbox.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 h) { _line->set (Duple (0, 0), Duple (0, h)); + + if (_invert) { + Rect bbox = _text->bounding_box (); + if (bbox) { + Duple flag_size (bbox.width() + 10, bbox.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 +115,16 @@ Flag::covers (Duple const & point) const { if (_rectangle) { return _rectangle->covers (point); - } + } return false; } + +double +Flag::width () const +{ + Rect bbox = _text->bounding_box (); + assert (bbox); + + return bbox.width() + 10; +}