libui/zOLD_unix/colorbutton.c

81 lines
1.8 KiB
C

// 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;
}