X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_button.cc;h=5ebddc23cc292e3c252d3fa40daecad898a2cd87;hb=7bf10eda75914efae36205cd87e17a93d74ff221;hp=e817882a5d114118bfa2916acbfbef73f5b758b4;hpb=6588da09b393dc671ab6906f74f7a05b93581d8d;p=ardour.git diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index e817882a5d..5ebddc23cc 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -59,6 +59,7 @@ ArdourButton::Element ArdourButton::just_led_default_elements = ArdourButton::El ArdourButton::ArdourButton (Element e) : _sizing_text("") + , _markup (false) , _elements (e) , _icon (Gtkmm2ext::ArdourIcon::NoIcon) , _tweaks (Tweaks (0)) @@ -68,7 +69,7 @@ ArdourButton::ArdourButton (Element e) , _text_width (0) , _text_height (0) , _diameter (0) - , _corner_radius (2.5) + , _corner_radius (3.5) , _corner_mask (0xf) , _angle(0) , _xalign(.5) @@ -104,7 +105,9 @@ ArdourButton::ArdourButton (Element e) ArdourButton::ArdourButton (const std::string& str, Element e) : _sizing_text("") + , _markup (false) , _elements (e) + , _icon (Gtkmm2ext::ArdourIcon::NoIcon) , _tweaks (Tweaks (0)) , _char_pixel_width (0) , _char_pixel_height (0) @@ -112,7 +115,7 @@ ArdourButton::ArdourButton (const std::string& str, Element e) , _text_width (0) , _text_height (0) , _diameter (0) - , _corner_radius (2.5) + , _corner_radius (3.5) , _corner_mask (0xf) , _angle(0) , _xalign(.5) @@ -172,22 +175,35 @@ ArdourButton::set_layout_font (const Pango::FontDescription& fd) if (_layout) { _layout->set_font_description (fd); queue_resize (); + _char_pixel_width = 0; + _char_pixel_height = 0; + } +} + +void +ArdourButton::set_text_internal () { + assert (_layout); + if (_markup) { + _layout->set_markup (_text); + } else { + _layout->set_text (_text); } } void -ArdourButton::set_text (const std::string& str) +ArdourButton::set_text (const std::string& str, bool markup) { - if (_text == str) { + if (_text == str && _markup == markup) { return; } _text = str; + _markup = markup; if (!is_realized()) { return; } ensure_layout (); if (_layout && _layout->get_text() != _text) { - _layout->set_text (_text); + set_text_internal (); /* on_size_request() will fill in _text_width/height * so queue it even if _sizing_text != "" */ queue_resize (); @@ -406,7 +422,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *) cairo_save (cr); cairo_rotate(cr, _angle * M_PI / 180.0); cairo_device_to_user(cr, &ww, &wh); - xa = (ww - _text_width) * _xalign; + xa = text_margin + (ww - _text_width - 2 * text_margin) * _xalign; ya = (wh - _text_height) * _yalign; /* quick hack for left/bottom alignment at -90deg @@ -547,9 +563,9 @@ ArdourButton::on_realize() ensure_layout (); if (_layout) { if (_layout->get_text() != _text) { - _layout->set_text (_text); + set_text_internal (); + queue_resize (); } - queue_resize (); } } @@ -570,7 +586,8 @@ ArdourButton::on_size_request (Gtk::Requisition* req) if (_elements & Text) { ensure_layout(); - _layout->set_text (_text); + set_text_internal (); + /* render() needs the size of the displayed text */ _layout->get_pixel_size (_text_width, _text_height); @@ -595,7 +612,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req) req->width += sizing_text_width; if (!_sizing_text.empty()) { - _layout->set_text (_text); /* restore display text */ + set_text_internal (); /* restore display text */ } } @@ -649,7 +666,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req) req->width = req->height; if (req->height < req->width) req->height = req->width; - } else if (_text_width > 0 && !(_elements & (Menu | Indicator))) { + } else if (_sizing_text.empty() && _text_width > 0 && !(_elements & Menu)) { // properly centered text for those elements that are centered // (no sub-pixel offset) if ((req->width - _text_width) & 1) { ++req->width; } @@ -1189,7 +1206,7 @@ ArdourButton::recalc_char_pixel_geometry () // NB. this is not static, since the geometry is different // depending on the font used. int w, h; - std::string x = _("ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); + std::string x = _("@ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); _layout->set_text (x); _layout->get_pixel_size (w, h); _char_pixel_height = std::max(4, h); @@ -1198,7 +1215,7 @@ ArdourButton::recalc_char_pixel_geometry () Glib::ustring gx(x); _char_avg_pixel_width = w / (float)gx.size(); _char_pixel_width = std::max(4, (int) ceil (_char_avg_pixel_width)); - _layout->set_text (_text); + set_text_internal (); /* restore display text */ } void