13
0

extend ArdourButton API to allow independently setting fixed active/inactive colors

This commit is contained in:
Paul Davis 2016-06-09 15:35:37 -04:00
parent 37aed5715b
commit ef6f0de5a3
2 changed files with 40 additions and 16 deletions

View File

@ -619,20 +619,27 @@ void
ArdourButton::set_colors () ArdourButton::set_colors ()
{ {
_update_colors = false; _update_colors = false;
if (_fixed_colors_set) {
if (_fixed_colors_set == 0x3) {
return; return;
} }
std::string name = get_name(); std::string name = get_name();
bool failed = false; bool failed = false;
if (!(_fixed_colors_set & 0x1)) {
fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed); fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
if (failed) { if (failed) {
fill_active_color = UIConfiguration::instance().color ("generic button: fill active"); fill_active_color = UIConfiguration::instance().color ("generic button: fill active");
} }
}
if (!(_fixed_colors_set & 0x2)) {
fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed); fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed);
if (failed) { if (failed) {
fill_inactive_color = UIConfiguration::instance().color ("generic button: fill"); fill_inactive_color = UIConfiguration::instance().color ("generic button: fill");
} }
}
text_active_color = ArdourCanvas::contrasting_text_color (fill_active_color); text_active_color = ArdourCanvas::contrasting_text_color (fill_active_color);
text_inactive_color = ArdourCanvas::contrasting_text_color (fill_inactive_color); text_inactive_color = ArdourCanvas::contrasting_text_color (fill_inactive_color);
@ -659,13 +666,18 @@ ArdourButton::set_colors ()
*/ */
void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t color_inactive) 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);
}
fill_active_color = color_active; void ArdourButton::set_active_color (const uint32_t color)
fill_inactive_color = color_inactive; {
_fixed_colors_set |= 0x1;
fill_active_color = color;
unsigned char r, g, b, a; 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.)) + double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
(max (double(g), 255.) - min (double(g), 255.)) + (max (double(g), 255.) - min (double(g), 255.)) +
@ -679,14 +691,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(255, 255, 255, 255) : /* use white */
RGBA_TO_UINT( 0, 0, 0, 255); /* use black */ RGBA_TO_UINT( 0, 0, 0, 255); /* use black */
/* XXX what about led colors ? */
CairoWidget::set_dirty ();
}
UINT_TO_RGBA(color_inactive, &r, &g, &b, &a); void ArdourButton::set_inactive_color (const uint32_t color)
{
_fixed_colors_set |= 0x2;
white_contrast = (max (double(r), 255.) - min (double(r), 255.)) + fill_inactive_color = color;
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(g), 255.) - min (double(g), 255.)) +
(max (double(b), 255.) - min (double(b), 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(g), 0.) - min (double(g), 0.)) +
(max (double(b), 0.) - min (double(b), 0.)); (max (double(b), 0.) - min (double(b), 0.));

View File

@ -105,6 +105,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
void set_image (const Glib::RefPtr<Gdk::Pixbuf>&); void set_image (const Glib::RefPtr<Gdk::Pixbuf>&);
void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color); void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color);
void set_active_color (const uint32_t active_color);
void set_inactive_color (const uint32_t inactive_color);
void set_fallthrough_to_parent(bool fall) { _fallthrough_to_parent = fall; } void set_fallthrough_to_parent(bool fall) { _fallthrough_to_parent = fall; }
@ -172,7 +174,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
bool _distinct_led_click; bool _distinct_led_click;
bool _hovering; bool _hovering;
bool _focused; bool _focused;
bool _fixed_colors_set; int _fixed_colors_set;
bool _fallthrough_to_parent; bool _fallthrough_to_parent;
int _layout_ellipsize_width; int _layout_ellipsize_width;
Pango::EllipsizeMode _ellipsis; Pango::EllipsizeMode _ellipsis;