show tempo information for MIDI files in preview pane; start to offer choice about...
[ardour.git] / gtk2_ardour / ardour_button.cc
index e817882a5d114118bfa2916acbfbef73f5b758b4..5ebddc23cc292e3c252d3fa40daecad898a2cd87 100644 (file)
@@ -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