81 lines
1.8 KiB
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;
|
|
}
|