X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_button.cc;h=56854880d851c69285d5008e4099cfc67c99c132;hb=fdf63ace6a655f772a46e73719de14f9dd6fb940;hp=a4f346a040ad2dd63ce23399931fbb4357bfe094;hpb=83b5bdbe95b2e3d236769d04f5ac2fac7401a9af;p=ardour.git diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index a4f346a040..56854880d8 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -39,7 +39,7 @@ #include "tooltips.h" #include "ui_config.h" -#include "i18n.h" +#include "pbd/i18n.h" #define BASELINESTRETCH (1.25) #define TRACKHEADERBTNW (3.10) @@ -102,6 +102,9 @@ ArdourButton::ArdourButton (Element e) ArdourButton::ArdourButton (const std::string& str, Element e) : _elements (e) , _tweaks (Tweaks (0)) + , _char_pixel_width (0) + , _char_pixel_height (0) + , _char_avg_pixel_width (0) , _text_width (0) , _text_height (0) , _diameter (0) @@ -169,6 +172,9 @@ ArdourButton::set_layout_font (const Pango::FontDescription& fd) void ArdourButton::set_text (const std::string& str) { + if (_text == str) { + return; + } _text = str; if (!is_realized()) { return; @@ -284,7 +290,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *) } //show the "convex" or "concave" gradient - if (!_flat_buttons) { + if (!_flat_buttons && (_elements & Body)==Body) { if ( active_state() == Gtkmm2ext::ExplicitActive && ( !((_elements & Indicator)==Indicator) || use_custom_led_color) ) { //concave cairo_set_source (cr, concave_pattern); @@ -535,12 +541,40 @@ ArdourButton::on_size_request (Gtk::Requisition* req) } } - if ((_elements & Text) && !_text.empty()) { - // if _layout does not exist, char_pixel_height() creates it, - req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0)); - _layout->get_pixel_size (_text_width, _text_height); - req->width += rint(1.75 * char_pixel_width()); // padding - req->width += _text_width; + if (_elements & Text) { + + if (_tweaks & OccasionalText) { + + /* size should not change based on presence or absence + * of text. + */ + + if (!_text.empty()) { + ensure_layout (); + _layout->set_text (_text); + _layout->get_pixel_size (_text_width, _text_height); + } + + } else if (!_text.empty()) { + + //if _layout does not exist, char_pixel_height() creates it, + + req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0)); + assert (_layout); + _layout->get_pixel_size (_text_width, _text_height); + req->width += rint(1.75 * char_pixel_width()); // padding + req->width += _text_width; + } + + /* XXX hack (surprise). Deal with two common rotation angles */ + + if (_angle == 90 || _angle == 270) { + /* do not swap text width or height because we rely on + these being the un-rotated values in ::render() + */ + swap (req->width, req->height); + } + } else { _text_width = 0; _text_height = 0; @@ -601,19 +635,26 @@ void ArdourButton::set_colors () { _update_colors = false; - if (_fixed_colors_set) { + + if (_fixed_colors_set == 0x3) { return; } + std::string name = get_name(); bool failed = false; - fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed); - if (failed) { - fill_active_color = UIConfiguration::instance().color ("generic button: fill active"); + if (!(_fixed_colors_set & 0x1)) { + fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed); + if (failed) { + fill_active_color = UIConfiguration::instance().color ("generic button: fill active"); + } } - fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed); - if (failed) { - fill_inactive_color = UIConfiguration::instance().color ("generic button: fill"); + + if (!(_fixed_colors_set & 0x2)) { + fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed); + if (failed) { + fill_inactive_color = UIConfiguration::instance().color ("generic button: fill"); + } } text_active_color = ArdourCanvas::contrasting_text_color (fill_active_color); @@ -641,13 +682,18 @@ ArdourButton::set_colors () */ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t color_inactive) { - _fixed_colors_set = true; + set_active_color (color_active); + set_inactive_color (color_inactive); +} + +void ArdourButton::set_active_color (const uint32_t color) +{ + _fixed_colors_set |= 0x1; - fill_active_color = color_active; - fill_inactive_color = color_inactive; + fill_active_color = color; unsigned char r, g, b, a; - UINT_TO_RGBA(color_active, &r, &g, &b, &a); + UINT_TO_RGBA(color, &r, &g, &b, &a); double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) + (max (double(g), 255.) - min (double(g), 255.)) + @@ -661,14 +707,24 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t RGBA_TO_UINT(255, 255, 255, 255) : /* use white */ RGBA_TO_UINT( 0, 0, 0, 255); /* use black */ + /* XXX what about led colors ? */ + CairoWidget::set_dirty (); +} + +void ArdourButton::set_inactive_color (const uint32_t color) +{ + _fixed_colors_set |= 0x2; - UINT_TO_RGBA(color_inactive, &r, &g, &b, &a); + fill_inactive_color = color; - white_contrast = (max (double(r), 255.) - min (double(r), 255.)) + + unsigned char r, g, b, a; + UINT_TO_RGBA(color, &r, &g, &b, &a); + + double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) + (max (double(g), 255.) - min (double(g), 255.)) + (max (double(b), 255.) - min (double(b), 255.)); - black_contrast = (max (double(r), 0.) - min (double(r), 0.)) + + double black_contrast = (max (double(r), 0.) - min (double(r), 0.)) + (max (double(g), 0.) - min (double(g), 0.)) + (max (double(b), 0.) - min (double(b), 0.)); @@ -724,7 +780,7 @@ ArdourButton::set_led_left (bool yn) bool ArdourButton::on_button_press_event (GdkEventButton *ev) { - focus_handler (); + focus_handler (this); if (ev->button == 1 && (_elements & Indicator) && _led_rect && _distinct_led_click) { if (ev->x >= _led_rect->x && ev->x < _led_rect->x + _led_rect->width &&