diff options
Diffstat (limited to 'filter')
-rw-r--r-- | filter/ChangeLog | 20 | ||||
-rw-r--r-- | filter/filter-colour.c | 108 | ||||
-rw-r--r-- | filter/filter-colour.h | 2 | ||||
-rw-r--r-- | filter/filter-element.c | 8 |
4 files changed, 74 insertions, 64 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog index 95e4d1da52..70bc1a371c 100644 --- a/filter/ChangeLog +++ b/filter/ChangeLog @@ -1,3 +1,23 @@ +2007-04-01 Matthew Barnes <mbarnes@redhat.com> + + ** Fixes part of bug #373116 + + * filter-colour.h: + Store color as a GdkColor instead of separate RGBA components. + + * filter-colour.c (color_eq): + Use gdk_color_equal() to compare colors. + + * filter-colour.c (xml_encode): + Encode color as a single property ("spec"). + + * filter-colour.c (xml_decode): + Read the color from a single property ("spec"). + Provide a migration path for old XML files. + + * filter-colour.c (get_widget): + Migrate from GnomeColorPicker to GtkColorButton. + 2007-03-20 Matthew Barnes <mbarnes@redhat.com> ** Fixes part of bug #419524 diff --git a/filter/filter-colour.c b/filter/filter-colour.c index 78db9d848c..97a343bc63 100644 --- a/filter/filter-colour.c +++ b/filter/filter-colour.c @@ -26,7 +26,7 @@ #endif #include <gtk/gtksignal.h> -#include <libgnomeui/gnome-color-picker.h> +#include <gtk/gtkcolorbutton.h> #include "libedataserver/e-sexp.h" #include "filter-colour.h" @@ -120,13 +120,11 @@ filter_colour_new (void) static int colour_eq (FilterElement *fe, FilterElement *cm) { - FilterColour *fc = (FilterColour *)fe, *cc = (FilterColour *)cm; - - return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm) - && fc->r == cc->r - && fc->g == cc->g - && fc->b == cc->b - && fc->a == cc->a; + FilterColour *fc = (FilterColour *) fe; + FilterColour *cc = (FilterColour *) cm; + + return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm) + && gdk_color_equal (&fc->color, &cc->color); } static void @@ -139,76 +137,70 @@ xml_create (FilterElement *fe, xmlNodePtr node) static xmlNodePtr xml_encode (FilterElement *fe) { - xmlNodePtr value; FilterColour *fc = (FilterColour *)fe; - char hex[16]; - - d(printf("Encoding colour as xml\n")); + xmlNodePtr value; + gchar spec[16]; + + g_snprintf (spec, sizeof (spec), "#%04x%04x%04x", + fc->color.red, fc->color.green, fc->color.blue); + value = xmlNewNode(NULL, "value"); xmlSetProp(value, "name", fe->name); xmlSetProp(value, "type", "colour"); - - sprintf(hex, "%04x", fc->r); - xmlSetProp(value, "red", hex); - sprintf(hex, "%04x", fc->g); - xmlSetProp(value, "green", hex); - sprintf(hex, "%04x", fc->b); - xmlSetProp(value, "blue", hex); - sprintf(hex, "%04x", fc->a); - xmlSetProp(value, "alpha", hex); - - return value; -} + xmlSetProp(value, "spec", spec); -static guint16 -get_value (xmlNodePtr node, char *name) -{ - unsigned int ret; - char *value; - - value = xmlGetProp(node, name); - sscanf(value, "%04x", &ret); - xmlFree(value); - return ret; + return value; } - static int xml_decode (FilterElement *fe, xmlNodePtr node) { FilterColour *fc = (FilterColour *)fe; - + xmlChar *prop; + xmlFree (fe->name); fe->name = xmlGetProp(node, "name"); - fc->r = get_value(node, "red"); - fc->g = get_value(node, "green"); - fc->b = get_value(node, "blue"); - fc->a = get_value(node, "alpha"); - + + prop = xmlGetProp(node, "spec"); + if (prop != NULL) { + gdk_color_parse(prop, &fc->color); + xmlFree (prop); + } else { + /* try reading the old RGB properties */ + prop = xmlGetProp(node, "red"); + sscanf(prop, "%" G_GINT16_MODIFIER "x", &fc->color.red); + xmlFree (prop); + prop = xmlGetProp(node, "green"); + sscanf(prop, "%" G_GINT16_MODIFIER "x", &fc->color.green); + xmlFree (prop); + prop = xmlGetProp(node, "blue"); + sscanf(prop, "%" G_GINT16_MODIFIER "x", &fc->color.blue); + xmlFree (prop); + } + return 0; } static void -set_colour (GnomeColorPicker *cp, guint r, guint g, guint b, guint a, FilterColour *fc) +set_color (GtkColorButton *color_button, FilterColour *fc) { - fc->r = r; - fc->g = g; - fc->b = b; - fc->a = a; + gtk_color_button_get_color (color_button, &fc->color); } static GtkWidget * get_widget (FilterElement *fe) { FilterColour *fc = (FilterColour *) fe; - GnomeColorPicker *cp; - - cp = (GnomeColorPicker *) gnome_color_picker_new (); - gnome_color_picker_set_i16 (cp, fc->r, fc->g, fc->b, fc->a); - gtk_widget_show ((GtkWidget *) cp); - g_signal_connect (cp, "color_set", G_CALLBACK (set_colour), fe); + GtkWidget *color_button; + + color_button = gtk_color_button_new_with_color (&fc->color); + gtk_widget_show (color_button); + + g_signal_connect ( + G_OBJECT (color_button), "color_set", + G_CALLBACK (set_color), fe); - return (GtkWidget *) cp; + return color_button; } static void @@ -221,9 +213,9 @@ static void format_sexp (FilterElement *fe, GString *out) { FilterColour *fc = (FilterColour *)fe; - char *str; - - str = g_strdup_printf ("#%02x%02x%02x", (fc->r >> 8) & 0xff, (fc->g >> 8) & 0xff, (fc->b >> 8) & 0xff); - e_sexp_encode_string (out, str); - g_free (str); + gchar spec[16]; + + g_snprintf (spec, sizeof (spec), "#%04x%04x%04x", + fc->color.red, fc->color.green, fc->color.blue); + e_sexp_encode_string (out, spec); } diff --git a/filter/filter-colour.h b/filter/filter-colour.h index 9e22a2021f..e1bf347d9b 100644 --- a/filter/filter-colour.h +++ b/filter/filter-colour.h @@ -39,7 +39,7 @@ typedef struct _FilterColourClass FilterColourClass; struct _FilterColour { FilterElement parent_object; - guint16 r, g, b, a; + GdkColor color; }; struct _FilterColourClass { diff --git a/filter/filter-element.c b/filter/filter-element.c index 11b848216f..60ca789a69 100644 --- a/filter/filter-element.c +++ b/filter/filter-element.c @@ -293,12 +293,10 @@ copy_value(FilterElement *de, FilterElement *se) } } else if (IS_FILTER_COLOUR(se)) { if (IS_FILTER_COLOUR(de)) { - FilterColour *s = (FilterColour *)se, *d = (FilterColour *)de; + FilterColour *s = (FilterColour *)se; + FilterColour *d = (FilterColour *)de; - d->r = s->r; - d->g = s->g; - d->b = s->b; - d->a = s->a; + d->color = s->color; } } else if (IS_FILTER_DATESPEC(se)) { if (IS_FILTER_DATESPEC(de)) { |