[evolution] [CompEditor] Use CSS3 color name in the iCalendar COLOR property



commit 736a5a3251a553de8f8a99385ef1911ec9e94dfe
Author: Milan Crha <mcrha redhat com>
Date:   Tue Apr 2 15:50:30 2019 +0200

    [CompEditor] Use CSS3 color name in the iCalendar COLOR property
    
    This is required by the RFC 7986: https://tools.ietf.org/html/rfc7986#section-5.9
    
    Related to https://gitlab.gnome.org/GNOME/evolution/issues/37

 src/calendar/gui/e-comp-editor-property-parts.c | 310 +++++++++++++++++++++++-
 1 file changed, 306 insertions(+), 4 deletions(-)
---
diff --git a/src/calendar/gui/e-comp-editor-property-parts.c b/src/calendar/gui/e-comp-editor-property-parts.c
index 967651f20f..78303ac976 100644
--- a/src/calendar/gui/e-comp-editor-property-parts.c
+++ b/src/calendar/gui/e-comp-editor-property-parts.c
@@ -1616,6 +1616,8 @@ typedef struct _ECompEditorPropertyPartColorClass ECompEditorPropertyPartColorCl
 
 struct _ECompEditorPropertyPartColor {
        ECompEditorPropertyPart parent;
+
+       gulong notify_current_color_id;
 };
 
 struct _ECompEditorPropertyPartColorClass {
@@ -1626,11 +1628,304 @@ GType e_comp_editor_property_part_color_get_type (void) G_GNUC_CONST;
 
 G_DEFINE_TYPE (ECompEditorPropertyPartColor, e_comp_editor_property_part_color, 
E_TYPE_COMP_EDITOR_PROPERTY_PART)
 
+#ifdef HAVE_ICAL_COLOR_PROPERTY
+static const gchar *
+ecepp_color_rgba_to_string (const GdkRGBA *rgba)
+{
+       const struct _colors {
+               const gchar *name;
+               guchar rr, gg, bb;
+       } colors[] = {
+               { "aliceblue",            240, 248, 255 },
+               { "antiquewhite",         250, 235, 215 },
+               { "aqua",                   0, 255, 255 },
+               { "aquamarine",           127, 255, 212 },
+               { "azure",                240, 255, 255 },
+               { "beige",                245, 245, 220 },
+               { "bisque",               255, 228, 196 },
+               { "black",                  0,   0,   0 },
+               { "blanchedalmond",       255, 235, 205 },
+               { "blue",                   0,   0, 255 },
+               { "blueviolet",           138,  43, 226 },
+               { "brown",                165,  42,  42 },
+               { "burlywood",            222, 184, 135 },
+               { "cadetblue",             95, 158, 160 },
+               { "chartreuse",           127, 255,   0 },
+               { "chocolate",            210, 105,  30 },
+               { "coral",                255, 127,  80 },
+               { "cornflowerblue",       100, 149, 237 },
+               { "cornsilk",             255, 248, 220 },
+               { "crimson",              220,  20,  60 },
+               { "cyan",                   0, 255, 255 },
+               { "darkblue",               0,   0, 139 },
+               { "darkcyan",               0, 139, 139 },
+               { "darkgoldenrod",        184, 134,  11 },
+               { "darkgray",             169, 169, 169 },
+               { "darkgreen",              0, 100,   0 },
+               { "darkgrey",             169, 169, 169 },
+               { "darkkhaki",            189, 183, 107 },
+               { "darkmagenta",          139,   0, 139 },
+               { "darkolivegreen",        85, 107,  47 },
+               { "darkorange",           255, 140,   0 },
+               { "darkorchid",           153,  50, 204 },
+               { "darkred",              139,   0,   0 },
+               { "darksalmon",           233, 150, 122 },
+               { "darkseagreen",         143, 188, 143 },
+               { "darkslateblue",         72 , 61, 139 },
+               { "darkslategray",         47,  79,  79 },
+               { "darkslategrey",         47,  79,  79 },
+               { "darkturquoise",          0, 206, 209 },
+               { "darkviolet",           148,   0, 211 },
+               { "deeppink",             255,  20, 147 },
+               { "deepskyblue",            0, 191, 255 },
+               { "dimgray",              105, 105, 105 },
+               { "dimgrey",              105, 105, 105 },
+               { "dodgerblue",            30, 144, 255 },
+               { "firebrick",            178,  34,  34 },
+               { "floralwhite",          255, 250, 240 },
+               { "forestgreen",           34, 139,  34 },
+               { "fuchsia",              255,   0, 255 },
+               { "gainsboro",            220, 220, 220 },
+               { "ghostwhite",           248, 248, 255 },
+               { "gold",                 255, 215,   0 },
+               { "goldenrod",            218, 165,  32 },
+               { "gray",                 128, 128, 128 },
+               { "green",                  0, 128,   0 },
+               { "greenyellow",          173, 255,  47 },
+               { "grey",                 128, 128, 128 },
+               { "honeydew",             240, 255, 240 },
+               { "hotpink",              255, 105, 180 },
+               { "indianred",            205,  92,  92 },
+               { "indigo",                75,   0, 130 },
+               { "ivory",                255, 255, 240 },
+               { "khaki",                240, 230, 140 },
+               { "lavender",             230, 230, 250 },
+               { "lavenderblush",        255, 240, 245 },
+               { "lawngreen",            124, 252,   0 },
+               { "lemonchiffon",         255, 250, 205 },
+               { "lightblue",            173, 216, 230 },
+               { "lightcoral",           240, 128, 128 },
+               { "lightcyan",            224, 255, 255 },
+               { "lightgoldenrodyellow", 250, 250, 210 },
+               { "lightgray",            211, 211, 211 },
+               { "lightgreen",           144, 238, 144 },
+               { "lightgrey",            211, 211, 211 },
+               { "lightpink",            255, 182, 193 },
+               { "lightsalmon",          255, 160, 122 },
+               { "lightseagreen",         32, 178, 170 },
+               { "lightskyblue",         135, 206, 250 },
+               { "lightslategray",       119, 136, 153 },
+               { "lightslategrey",       119, 136, 153 },
+               { "lightsteelblue",       176, 196, 222 },
+               { "lightyellow",          255, 255, 224 },
+               { "lime",                   0, 255,   0 },
+               { "limegreen",             50, 205,  50 },
+               { "linen",                250, 240, 230 },
+               { "magenta",              255,   0, 255 },
+               { "maroon",               128,   0,   0 },
+               { "mediumaquamarine",     102, 205, 170 },
+               { "mediumblue",             0,   0, 205 },
+               { "mediumorchid",         186,  85, 211 },
+               { "mediumpurple",         147, 112, 219 },
+               { "mediumseagreen",        60, 179, 113 },
+               { "mediumslateblue",      123, 104, 238 },
+               { "mediumspringgreen",      0, 250, 154 },
+               { "mediumturquoise",       72, 209, 204 },
+               { "mediumvioletred",      199,  21, 133 },
+               { "midnightblue",          25,  25, 112 },
+               { "mintcream",            245, 255, 250 },
+               { "mistyrose",            255, 228, 225 },
+               { "moccasin",             255, 228, 181 },
+               { "navajowhite",          255, 222, 173 },
+               { "navy",                   0,   0, 128 },
+               { "oldlace",              253, 245, 230 },
+               { "olive",                128, 128,   0 },
+               { "olivedrab",            107, 142,  35 },
+               { "orange",               255, 165,   0 },
+               { "orangered",            255,  69,   0 },
+               { "orchid",               218, 112, 214 },
+               { "palegoldenrod",        238, 232, 170 },
+               { "palegreen",            152, 251, 152 },
+               { "paleturquoise",        175, 238, 238 },
+               { "palevioletred",        219, 112, 147 },
+               { "papayawhip",           255, 239, 213 },
+               { "peachpuff",            255, 218, 185 },
+               { "peru",                 205, 133, 63  },
+               { "pink",                 255, 192, 203 },
+               { "plum",                 221, 160, 221 },
+               { "powderblue",           176, 224, 230 },
+               { "purple",               128,   0, 128 },
+               { "red",                  255,   0,   0 },
+               { "rosybrown",            188, 143, 143 },
+               { "royalblue",             65, 105, 225 },
+               { "saddlebrown",          139,  69,  19 },
+               { "salmon",               250, 128, 114 },
+               { "sandybrown",           244, 164,  96 },
+               { "seagreen",              46, 139,  87 },
+               { "seashell",             255, 245, 238 },
+               { "sienna",               160,  82,  45 },
+               { "silver",               192, 192, 192 },
+               { "skyblue",              135, 206, 235 },
+               { "slateblue",            106,  90, 205 },
+               { "slategray",            112, 128, 144 },
+               { "slategrey",            112, 128, 144 },
+               { "snow",                 255, 250, 250 },
+               { "springgreen",            0, 255, 127 },
+               { "steelblue",             70, 130, 180 },
+               { "tan",                  210, 180, 140 },
+               { "teal",                   0, 128, 128 },
+               { "thistle",              216, 191, 216 },
+               { "tomato",               255,  99,  71 },
+               { "turquoise",             64, 224, 208 },
+               { "violet",               238, 130, 238 },
+               { "wheat",                245, 222, 179 },
+               { "white",                255, 255, 255 },
+               { "whitesmoke",           245, 245, 245 },
+               { "yellow",               255, 255,   0 },
+               { "yellowgreen",          154, 205,  50 }
+       };
+       guchar rr, gg, bb;
+       gint best = G_MAXINT;
+       const gchar *name = NULL;
+       gint ii;
+
+       g_return_val_if_fail (rgba != NULL, NULL);
+
+       rr = 0xFF * rgba->red;
+       gg = 0xFF * rgba->green;
+       bb = 0xFF * rgba->blue;
+
+       for (ii = 0; ii < G_N_ELEMENTS (colors); ii++) {
+               gint delta_rr, delta_gg, delta_bb, rr_mid;
+               gint dist_cc;
+
+               delta_rr = colors[ii].rr - rr;
+               delta_gg = colors[ii].gg - gg;
+               delta_bb = colors[ii].bb - bb;
+
+               /* Exact match */
+               if (!delta_rr && !delta_gg && !delta_bb)
+                       return colors[ii].name;
+
+               rr_mid = (colors[ii].rr + rr) / 2;
+
+               /* Euclidean distance: https://en.wikipedia.org/wiki/Color_difference */
+               dist_cc = ((2 + (rr_mid / 256.0)) * delta_rr * delta_rr) +
+                         (4 * delta_gg * delta_gg) +
+                         ((2 + ((255 - rr_mid) / 256.0)) * delta_bb * delta_bb);
+
+               if (dist_cc < best) {
+                       best = dist_cc;
+                       name = colors[ii].name;
+               }
+       }
+
+       return name;
+}
+
+static void
+ecepp_color_notify_current_color_cb (EColorCombo *color_combo,
+                                    GParamSpec *param,
+                                    gpointer user_data)
+{
+       ECompEditorPropertyPartColor *color_part = user_data;
+       const gchar *color_name;
+       GdkRGBA rgba = { 0.0, 0.0, 0.0, 0.0 }, def_rgba = { 0.0, 0.0, 0.0, 0.0 }, parsed = {0.0, 0.0, 0.0, 
0.0 };
+
+       g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_COLOR (color_part));
+
+       e_color_combo_get_current_color (color_combo, &rgba);
+       e_color_combo_get_default_color (color_combo, &def_rgba);
+
+       if (gdk_rgba_equal (&rgba, &def_rgba))
+               return;
+
+       color_name = ecepp_color_rgba_to_string (&rgba);
+       if (color_name && gdk_rgba_parse (&parsed, color_name) && !gdk_rgba_equal (&rgba, &parsed)) {
+               g_signal_handler_block (color_combo, color_part->notify_current_color_id);
+               e_color_combo_set_current_color (color_combo, &parsed);
+               g_signal_handler_unblock (color_combo, color_part->notify_current_color_id);
+       }
+}
+#endif /* HAVE_ICAL_COLOR_PROPERTY */
+
+static void
+ecepp_color_set_palette (GtkWidget *color_combo)
+{
+       const gchar *colors[] = {
+               "black",
+               "saddlebrown",
+               "rosybrown",
+               "darkgreen",
+               "midnightblue",
+               "navy",
+               "darkslateblue",
+               "darkslategray",
+               "maroon",
+
+               "orangered",
+               "olive",
+               "green",
+               "teal",
+               "blue",
+               "slategray",
+               "gray",
+               "red",
+
+               "orange",
+               "yellowgreen",
+               "seagreen",
+               "mediumturquoise",
+               "royalblue",
+               "purple",
+               "lightslategray",
+               "fuchsia",
+
+               "gold",
+               "yellow",
+               "lime",
+               "aqua",
+               "deepskyblue",
+               "brown",
+               "silver",
+               "lightpink",
+
+               "navajowhite",
+               "khaki",
+               "beige",
+               "lightcyan",
+               "lightskyblue",
+               "plum",
+               "white"
+       };
+       GList *palette = NULL;
+       gint ii;
+
+       g_return_if_fail (E_IS_COLOR_COMBO (color_combo));
+
+       for (ii = G_N_ELEMENTS (colors) - 1; ii >= 0 ; ii--) {
+               GdkRGBA *rgba;
+
+               rgba = g_new0 (GdkRGBA, 1);
+
+               g_warn_if_fail (gdk_rgba_parse (rgba, colors[ii]));
+
+               palette = g_list_prepend (palette, rgba);
+       }
+
+       e_color_combo_set_palette (E_COLOR_COMBO (color_combo), palette);
+
+       g_list_free_full (palette, g_free);
+}
+
 static void
 ecepp_color_create_widgets (ECompEditorPropertyPart *property_part,
                            GtkWidget **out_label_widget,
                            GtkWidget **out_edit_widget)
 {
+       #ifdef HAVE_ICAL_COLOR_PROPERTY
+       ECompEditorPropertyPartColor *color_part;
+       #endif
        GdkRGBA rgba;
 
        g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_COLOR (property_part));
@@ -1658,6 +1953,15 @@ ecepp_color_create_widgets (ECompEditorPropertyPart *property_part,
 
        g_signal_connect_swapped (*out_edit_widget, "activated",
                G_CALLBACK (e_comp_editor_property_part_emit_changed), property_part);
+
+       ecepp_color_set_palette (*out_edit_widget);
+
+       #ifdef HAVE_ICAL_COLOR_PROPERTY
+       color_part = E_COMP_EDITOR_PROPERTY_PART_COLOR (property_part);
+       color_part->notify_current_color_id =
+               g_signal_connect (*out_edit_widget, "notify::current-color",
+               G_CALLBACK (ecepp_color_notify_current_color_cb), property_part);
+       #endif
 }
 
 static void
@@ -1727,9 +2031,9 @@ ecepp_color_fill_component (ECompEditorPropertyPart *property_part,
                        icalproperty_free (prop);
                }
        } else {
-               gchar *str;
+               const gchar *str;
 
-               str = gdk_rgba_to_string (&rgba);
+               str = ecepp_color_rgba_to_string (&rgba);
                if (str) {
                        if (prop) {
                                icalproperty_set_color (prop, str);
@@ -1737,8 +2041,6 @@ ecepp_color_fill_component (ECompEditorPropertyPart *property_part,
                                prop = icalproperty_new_color (str);
                                icalcomponent_add_property (component, prop);
                        }
-
-                       g_free (str);
                } else {
                        g_warning ("%s: Failed to convert RGBA (%f,%f,%f,%f) to string", G_STRFUNC, rgba.red, 
rgba.green, rgba.blue, rgba.alpha);
                }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]