From b47689090e60611f93d10759cd1cbde28db26269 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 15 May 2016 23:18:11 -0400 Subject: [PATCH] Implemented uiColorButton on GTK+. --- unix/GNUfiles.mk | 1 + unix/colorbutton.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 unix/colorbutton.c diff --git a/unix/GNUfiles.mk b/unix/GNUfiles.mk index ef83c13f..7b35e890 100644 --- a/unix/GNUfiles.mk +++ b/unix/GNUfiles.mk @@ -7,6 +7,7 @@ CFILES += \ unix/button.c \ unix/checkbox.c \ unix/child.c \ + unix/colorbutton.c \ unix/combobox.c \ unix/control.c \ unix/datetimepicker.c \ diff --git a/unix/colorbutton.c b/unix/colorbutton.c new file mode 100644 index 00000000..393b16f1 --- /dev/null +++ b/unix/colorbutton.c @@ -0,0 +1,80 @@ +// 15 may 2016 +#include "uipriv_unix.h" + +struct uiColorButton { + uiUnixControl c; + GtkWidget *widget; + GtkButton *button; + GtkColorButton *cb; + GtkColorChooser *cc; + void (*onChanged)(uiColorButton *, void *); + void *onChangedData; +}; + +uiUnixControlAllDefaults(uiColorButton) + +static void onColorSet(GtkColorButton *button, gpointer data) +{ + uiColorButton *b = uiColorButton(data); + + (*(b->onChanged))(b, b->onChangedData); +} + +static void defaultOnChanged(uiColorButton *b, void *data) +{ + // do nothing +} + +void uiColorButtonColor(uiColorButton *b, double *r, double *g, double *bl, double *a) +{ + GdkRGBA rgba; + + gtk_color_chooser_get_rgba(b->cc, &rgba); + *r = rgba.red; + *g = rgba.green; + *bl = rgba.blue; + *a = rgba.alpha; +} + +void uiColorButtonSetColor(uiColorButton *b, double r, double g, double bl, double a) +{ + GdkRGBA rgba; + + rgba.red = r; + rgba.green = g; + rgba.blue = bl; + rgba.alpha = a; + // no need to inhibit the signal; color-set is documented as only being sent when the user changes the color + gtk_color_chooser_set_rgba(b->cc, &rgba); +} + +void uiColorButtonOnChanged(uiColorButton *b, void (*f)(uiColorButton *, void *), void *data) +{ + b->onChanged = f; + b->onChangedData = data; +} + +uiColorButton *uiNewColorButton(void) +{ + uiColorButton *b; + GdkRGBA black; + + uiUnixNewControl(uiColorButton, b); + + // I'm not sure what the initial color is; set up a real one + black.red = 0.0; + black.green = 0.0; + black.blue = 0.0; + black.alpha = 1.0; + b->widget = gtk_color_button_new_with_rgba(&black); + b->button = GTK_BUTTON(b->widget); + b->cb = GTK_COLOR_BUTTON(b->widget); + b->cc = GTK_COLOR_CHOOSER(b->widget); + + gtk_color_chooser_set_use_alpha(b->cc, TRUE); + + g_signal_connect(b->widget, "color-set", G_CALLBACK(onColorSet), b); + uiColorButtonOnChanged(b, defaultOnChanged, NULL); + + return b; +}