ArdourButton::ArdourButton (Element e)
: _sizing_text("")
+ , _markup (false)
, _elements (e)
, _icon (Gtkmm2ext::ArdourIcon::NoIcon)
, _tweaks (Tweaks (0))
, _text_width (0)
, _text_height (0)
, _diameter (0)
- , _corner_radius (2.5)
+ , _corner_radius (3.5)
, _corner_mask (0xf)
, _angle(0)
, _xalign(.5)
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)
, _text_width (0)
, _text_height (0)
, _diameter (0)
- , _corner_radius (2.5)
+ , _corner_radius (3.5)
, _corner_mask (0xf)
, _angle(0)
, _xalign(.5)
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 ();
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
ensure_layout ();
if (_layout) {
if (_layout->get_text() != _text) {
- _layout->set_text (_text);
+ set_text_internal ();
+ queue_resize ();
}
- queue_resize ();
}
}
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);
req->width += sizing_text_width;
if (!_sizing_text.empty()) {
- _layout->set_text (_text); /* restore display text */
+ set_text_internal (); /* restore display text */
}
}
req->width = req->height;
if (req->height < req->width)
req->height = req->width;
- } else if (_sizing_text.empty() && _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; }
// 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);
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