From 29b1e706ddaeaec5a330cf6643816ec43024b545 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 14 Feb 2014 15:32:30 -0500 Subject: [PATCH] some changes to ArdourButton to allow custom colors to be set (e.g. based on track colors), via Valeriy --- gtk2_ardour/ardour_button.cc | 117 +++++++++++++++++++++++++++-------- gtk2_ardour/ardour_button.h | 15 ++++- 2 files changed, 104 insertions(+), 28 deletions(-) diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index f1f45e90c3..c79a27264f 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -66,7 +66,14 @@ ArdourButton::ArdourButton (Element e) , _yalign(.5) , border_color (0) , fill_color_active (0) - , fill_color_inactive (0) + , fill_color_active_start(0) + , fill_color_active_end(0) + , fill_color_inactive_start(0) + , fill_color_inactive_end(0) + , text_color_inactive(0) + , text_color_active(0) + , led_color_inactive(0) + , led_color_active(0) , fill_pattern (0) , fill_pattern_active (0) , shine_pattern (0) @@ -95,7 +102,14 @@ ArdourButton::ArdourButton (const std::string& str, Element e) , _yalign(.5) , border_color (0) , fill_color_active (0) - , fill_color_inactive (0) + , fill_color_active_start(0) + , fill_color_active_end(0) + , fill_color_inactive_start(0) + , fill_color_inactive_end(0) + , text_color_inactive(0) + , text_color_active(0) + , led_color_inactive(0) + , led_color_active(0) , fill_pattern (0) , fill_pattern_active (0) , shine_pattern (0) @@ -271,7 +285,7 @@ ArdourButton::render (cairo_t* cr) } else { - UINT_TO_RGBA (fill_color_inactive, &r, &g, &b, &a); + UINT_TO_RGBA (fill_color_inactive_end, &r, &g, &b, &a); cairo_set_line_width (cr, 2.0); rounded_function (cr, 2, 2, get_width()-4, get_height()-4, _corner_radius - 2.0); cairo_set_source_rgba (cr, r/255.0, g/255.0, b/255.0, a/255.0); @@ -480,6 +494,57 @@ ArdourButton::on_size_request (Gtk::Requisition* req) void ArdourButton::set_colors () +{ + Glib::ustring button_name = get_name(); + + if (button_name == "") { + return; + } + + border_color = ARDOUR_UI::config()->color_by_name ("button border"); + + fill_color_active_start = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start active", button_name)); + fill_color_active_end = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end active", button_name)); + + fill_color_inactive_start = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start", button_name)); + fill_color_inactive_end = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end", button_name)); + + text_color_active = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text active", button_name)); + text_color_inactive = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text", button_name)); + + led_color_active = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led active", button_name)); + led_color_inactive = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led", button_name)); +} + +void ArdourButton::set_bg_colors (const uint32_t color_active, const uint32_t color_inactive) +{ + set_colors (); + set_name (""); + fill_color_active_start = fill_color_active_end = color_active; + + unsigned char r, g, b, a; + UINT_TO_RGBA(color_active, &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.)); + + 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.)); + + text_color_active = + text_color_inactive = (white_contrast > black_contrast) ? + RGBA_TO_UINT(255, 255, 255, 255) : /* use white */ + RGBA_TO_UINT( 0, 0, 0, 255); /* use black */ + + fill_color_inactive_start = fill_color_inactive_end = color_inactive; + + build_patterns (); +} + +void +ArdourButton::build_patterns() { uint32_t start_color; uint32_t end_color; @@ -488,12 +553,10 @@ ArdourButton::set_colors () uint32_t led_color; if (active_state() == Gtkmm2ext::ImplicitActive && (_tweaks & ImplicitUsesSolidColor)) { - fill_color_active = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led active", get_name())); + fill_color_active = led_color_active; } else { - fill_color_active = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end active", get_name())); + fill_color_active = fill_color_active_end; } - fill_color_inactive = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end", get_name())); - border_color = ARDOUR_UI::config()->color_by_name ( "button border" ); if (shine_pattern) { cairo_pattern_destroy (shine_pattern); @@ -513,6 +576,7 @@ ArdourButton::set_colors () if (_elements & Body) { start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start active", get_name())); + start_color = fill_color_active_start; if (_flat_buttons) { end_color = start_color; @@ -534,10 +598,10 @@ ArdourButton::set_colors () fill_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height()-3); if (_flat_buttons) { - end_color = start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end", get_name())); + end_color = start_color = fill_color_inactive_end; } else { - start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start", get_name())); - end_color = fill_color_inactive; + start_color = fill_color_inactive_start; + end_color = fill_color_inactive_end; } UINT_TO_RGBA (start_color, &r, &g, &b, &a); cairo_pattern_add_color_stop_rgba (fill_pattern, 0, r/255.0,g/255.0,b/255.0, a/255.0); @@ -547,17 +611,17 @@ ArdourButton::set_colors () fill_pattern_active = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height()-3); if (_flat_buttons) { if (active_state() == Gtkmm2ext::ImplicitActive && (_tweaks & ImplicitUsesSolidColor)) { - end_color = start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led active", get_name())); + end_color = start_color = led_color_active; } else { - end_color = start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end active", get_name())); + end_color = start_color = fill_color_active_end; } } else { if (active_state() == Gtkmm2ext::ImplicitActive && (_tweaks & ImplicitUsesSolidColor)) { - start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led", get_name())); - end_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led active", get_name())); + start_color = led_color_inactive; + end_color = led_color_active; } else { - start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start active", get_name())); - end_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end active", get_name())); + start_color = fill_color_active_start; + end_color = fill_color_active_end; } } UINT_TO_RGBA (start_color, &r, &g, &b, &a); @@ -587,11 +651,11 @@ ArdourButton::set_colors () /* text and LED colors */ if (active_state() == Gtkmm2ext::ExplicitActive || ((_tweaks & ImplicitUsesSolidColor) && active_state() == Gtkmm2ext::ImplicitActive)) { - text_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text active", get_name())); - led_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led active", get_name())); + text_color = text_color_active; + led_color = led_color_active; } else { - text_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text", get_name())); - led_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led", get_name())); + text_color = text_color_inactive; + led_color = led_color_inactive; } UINT_TO_RGBA (text_color, &r, &g, &b, &a); @@ -681,6 +745,7 @@ void ArdourButton::color_handler () { set_colors (); + build_patterns (); set_dirty (); } @@ -689,7 +754,7 @@ ArdourButton::on_size_allocate (Allocation& alloc) { CairoWidget::on_size_allocate (alloc); setup_led_rect (); - set_colors (); + build_patterns (); } void @@ -763,6 +828,7 @@ void ArdourButton::on_style_changed (const RefPtr&) { set_colors (); + build_patterns (); } void @@ -813,7 +879,7 @@ ArdourButton::set_active_state (Gtkmm2ext::ActiveState s) bool changed = (_active_state != s); CairoWidget::set_active_state (s); if (changed) { - set_colors (); + build_patterns (); } } @@ -823,7 +889,7 @@ ArdourButton::set_visual_state (Gtkmm2ext::VisualState s) bool changed = (_visual_state != s); CairoWidget::set_visual_state (s); if (changed) { - set_colors (); + build_patterns (); } } @@ -871,7 +937,6 @@ ArdourButton::action_sensitivity_changed () } - void ArdourButton::action_visibility_changed () { @@ -900,14 +965,14 @@ void ArdourButton::set_elements (Element e) { _elements = e; - set_colors (); + build_patterns (); } void ArdourButton::add_elements (Element e) { _elements = (ArdourButton::Element) (_elements | e); - set_colors (); + build_patterns (); } void diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h index 65ea10b201..48aa056849 100644 --- a/gtk2_ardour/ardour_button.h +++ b/gtk2_ardour/ardour_button.h @@ -95,6 +95,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable bool on_button_release_event (GdkEventButton*); void set_image (const Glib::RefPtr&); + void set_bg_colors (uint32_t color_active, uint32_t color_inactive); protected: void render (cairo_t *); @@ -126,8 +127,17 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable uint32_t bg_color; uint32_t border_color; - uint32_t fill_color_active; - uint32_t fill_color_inactive; + + uint32_t fill_color_active; + uint32_t fill_color_active_start; + uint32_t fill_color_active_end; + uint32_t fill_color_inactive_start; + uint32_t fill_color_inactive_end; + uint32_t text_color_inactive; + uint32_t text_color_active; + uint32_t led_color_inactive; + uint32_t led_color_active; + cairo_pattern_t* fill_pattern; cairo_pattern_t* fill_pattern_active; cairo_pattern_t* shine_pattern; @@ -161,6 +171,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable void setup_led_rect (); void set_colors (); + void build_patterns (); void color_handler (); void action_toggled ();