diff options
author | Alexander Larsson <alexl@redhat.com> | 2008-02-25 14:24:07 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2008-02-25 14:24:07 +0000 |
commit | 73785e5b1c356486269543180845412f7b823714 (patch) | |
tree | 0ebfac43dfe48d407e5b115bb3af030a7ff13cbd | |
parent | f55483ab805616a8e52e19f8d0e3fce470413550 (diff) | |
download | nautilus-73785e5b1c356486269543180845412f7b823714.tar.gz |
Allow theming of chart colors (#478471) Patch from Baris Cicek
2008-02-25 Alexander Larsson <alexl@redhat.com>
* src/file-manager/fm-properties-window.c:
Allow theming of chart colors (#478471)
Patch from Baris Cicek
svn path=/trunk/; revision=13813
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | src/file-manager/fm-properties-window.c | 263 |
2 files changed, 244 insertions, 25 deletions
@@ -1,5 +1,11 @@ 2008-02-25 Alexander Larsson <alexl@redhat.com> + * src/file-manager/fm-properties-window.c: + Allow theming of chart colors (#478471) + Patch from Baris Cicek + +2008-02-25 Alexander Larsson <alexl@redhat.com> + * libnautilus-private/nautilus-file.c (is_uri_relative): g_uri_get_scheme -> g_uri_parse_scheme diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index 6a770d9ea..fe1a3c6db 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -93,21 +93,14 @@ #include <sys/mount.h> #endif -#define USED_FILL_R 0.988235294 -#define USED_FILL_G 0.91372549 -#define USED_FILL_B 0.309803922 +#define USED_FILL_R (0.988235294 * 65535) +#define USED_FILL_G (0.91372549 * 65535) +#define USED_FILL_B (0.309803922 * 65535) -#define USED_STROKE_R 0.929411765 -#define USED_STROKE_G 0.831372549 -#define USED_STROKE_B 0.0 +#define FREE_FILL_R (0.447058824 * 65535) +#define FREE_FILL_G (0.623529412 * 65535) +#define FREE_FILL_B (0.811764706 * 65535) -#define FREE_FILL_R 0.447058824 -#define FREE_FILL_G 0.623529412 -#define FREE_FILL_B 0.811764706 - -#define FREE_STROKE_R 0.203921569 -#define FREE_STROKE_G 0.396078431 -#define FREE_STROKE_B 0.643137255 #define PREVIEW_IMAGE_WIDTH 96 @@ -169,6 +162,11 @@ struct FMPropertiesWindowDetails { guint64 volume_capacity; guint64 volume_free; + + GdkColor used_color; + GdkColor free_color; + GdkColor used_stroke_color; + GdkColor free_stroke_color; }; enum { @@ -2650,11 +2648,16 @@ should_show_volume_usage (FMPropertiesWindow *window) static void paint_used_legend (GtkWidget *widget, GdkEventExpose *eev, gpointer data) { + FMPropertiesWindow *window; cairo_t *cr; gint width, height; + width = widget->allocation.width; height = widget->allocation.height; - cr = gdk_cairo_create (widget->window); + + window = FM_PROPERTIES_WINDOW (data); + + cr = gdk_cairo_create (widget->window); cairo_rectangle (cr, 2, @@ -2662,10 +2665,10 @@ paint_used_legend (GtkWidget *widget, GdkEventExpose *eev, gpointer data) width - 4, height - 4); - cairo_set_source_rgb (cr, USED_FILL_R, USED_FILL_G, USED_FILL_B); + cairo_set_source_rgb (cr, (double) window->details->used_color.red / 65535, (double) window->details->used_color.green / 65535, (double) window->details->used_color.blue / 65535); cairo_fill_preserve (cr); - cairo_set_source_rgb (cr, USED_STROKE_R, USED_STROKE_G, USED_STROKE_B); + cairo_set_source_rgb (cr, (double) window->details->used_stroke_color.red / 65535, (double) window->details->used_stroke_color.green / 65535, (double) window->details->used_stroke_color.blue / 65535); cairo_stroke (cr); cairo_destroy (cr); @@ -2674,8 +2677,11 @@ paint_used_legend (GtkWidget *widget, GdkEventExpose *eev, gpointer data) static void paint_free_legend (GtkWidget *widget, GdkEventExpose *eev, gpointer data) { + FMPropertiesWindow *window; cairo_t *cr; gint width, height; + + window = FM_PROPERTIES_WINDOW (data); width = widget->allocation.width; height = widget->allocation.height; @@ -2687,10 +2693,10 @@ paint_free_legend (GtkWidget *widget, GdkEventExpose *eev, gpointer data) width - 4, height - 4); - cairo_set_source_rgb (cr, FREE_FILL_R, FREE_FILL_G, FREE_FILL_B); + cairo_set_source_rgb (cr, (double) window->details->free_color.red / 65535, (double) window->details->free_color.green / 65535, (double) window->details->free_color.blue / 65535); cairo_fill_preserve(cr); - cairo_set_source_rgb (cr, FREE_STROKE_R, FREE_STROKE_G, FREE_STROKE_B); + cairo_set_source_rgb (cr, (double) window->details->free_stroke_color.red / 65535, (double) window->details->free_stroke_color.green / 65535, (double) window->details->free_stroke_color.blue / 65535); cairo_stroke (cr); cairo_destroy (cr); @@ -2710,7 +2716,8 @@ paint_pie_chart (GtkWidget *widget, GdkEventExpose *eev, gpointer data) width = widget->allocation.width; height = widget->allocation.height; - + + free = (double)window->details->volume_free / (double)window->details->volume_capacity; used = 1.0 - free; @@ -2747,10 +2754,10 @@ paint_pie_chart (GtkWidget *widget, GdkEventExpose *eev, gpointer data) cairo_line_to (cr,xc,yc); } - cairo_set_source_rgb (cr, USED_FILL_R,USED_FILL_G,USED_FILL_B); + cairo_set_source_rgb (cr, (double) window->details->used_color.red / 65535, (double) window->details->used_color.green / 65535, (double) window->details->used_color.blue / 65535); cairo_fill_preserve (cr); - cairo_set_source_rgb (cr, USED_STROKE_R,USED_STROKE_G,USED_STROKE_B); + cairo_set_source_rgb (cr, (double) window->details->used_stroke_color.red / 65535, (double) window->details->used_stroke_color.green / 65535, (double) window->details->used_stroke_color.blue / 65535); cairo_stroke (cr); } @@ -2765,21 +2772,209 @@ paint_pie_chart (GtkWidget *widget, GdkEventExpose *eev, gpointer data) cairo_line_to (cr,xc,yc); } - cairo_set_source_rgb (cr, FREE_FILL_R,FREE_FILL_G,FREE_FILL_B); + cairo_set_source_rgb (cr, (double) window->details->free_color.red / 65535, (double) window->details->free_color.green / 65535,(double) window->details->free_color.blue / 65535); cairo_fill_preserve(cr); - cairo_set_source_rgb (cr, FREE_STROKE_R,FREE_STROKE_G,FREE_STROKE_B); + cairo_set_source_rgb (cr, (double) window->details->free_stroke_color.red / 65535, (double) window->details->free_stroke_color.green / 65535, (double) window->details->free_stroke_color.blue / 65535); cairo_stroke (cr); } cairo_destroy (cr); } + +/* Copied from gtk/gtkstyle.c */ + +static void +rgb_to_hls (gdouble *r, + gdouble *g, + gdouble *b) +{ + gdouble min; + gdouble max; + gdouble red; + gdouble green; + gdouble blue; + gdouble h, l, s; + gdouble delta; + + red = *r; + green = *g; + blue = *b; + + if (red > green) + { + if (red > blue) + max = red; + else + max = blue; + + if (green < blue) + min = green; + else + min = blue; + } + else + { + if (green > blue) + max = green; + else + max = blue; + + if (red < blue) + min = red; + else + min = blue; + } + + l = (max + min) / 2; + s = 0; + h = 0; + + if (max != min) + { + if (l <= 0.5) + s = (max - min) / (max + min); + else + s = (max - min) / (2 - max - min); + + delta = max -min; + if (red == max) + h = (green - blue) / delta; + else if (green == max) + h = 2 + (blue - red) / delta; + else if (blue == max) + h = 4 + (red - green) / delta; + + h *= 60; + if (h < 0.0) + h += 360; + } + + *r = h; + *g = l; + *b = s; +} + +static void +hls_to_rgb (gdouble *h, + gdouble *l, + gdouble *s) +{ + gdouble hue; + gdouble lightness; + gdouble saturation; + gdouble m1, m2; + gdouble r, g, b; + + lightness = *l; + saturation = *s; + + if (lightness <= 0.5) + m2 = lightness * (1 + saturation); + else + m2 = lightness + saturation - lightness * saturation; + m1 = 2 * lightness - m2; + + if (saturation == 0) + { + *h = lightness; + *l = lightness; + *s = lightness; + } + else + { + hue = *h + 120; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + r = m1 + (m2 - m1) * hue / 60; + else if (hue < 180) + r = m2; + else if (hue < 240) + r = m1 + (m2 - m1) * (240 - hue) / 60; + else + r = m1; + + hue = *h; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + g = m1 + (m2 - m1) * hue / 60; + else if (hue < 180) + g = m2; + else if (hue < 240) + g = m1 + (m2 - m1) * (240 - hue) / 60; + else + g = m1; + + hue = *h - 120; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + b = m1 + (m2 - m1) * hue / 60; + else if (hue < 180) + b = m2; + else if (hue < 240) + b = m1 + (m2 - m1) * (240 - hue) / 60; + else + b = m1; + + *h = r; + *l = g; + *s = b; + } +} +static void +_pie_style_shade (GdkColor *a, + GdkColor *b, + gdouble k) +{ + gdouble red; + gdouble green; + gdouble blue; + + red = (gdouble) a->red / 65535.0; + green = (gdouble) a->green / 65535.0; + blue = (gdouble) a->blue / 65535.0; + + rgb_to_hls (&red, &green, &blue); + + green *= k; + if (green > 1.0) + green = 1.0; + else if (green < 0.0) + green = 0.0; + + blue *= k; + if (blue > 1.0) + blue = 1.0; + else if (blue < 0.0) + blue = 0.0; + + hls_to_rgb (&red, &green, &blue); + + b->red = red * 65535.0; + b->green = green * 65535.0; + b->blue = blue * 65535.0; +} + + static GtkWidget* create_pie_widget (FMPropertiesWindow *window) { NautilusFile *file; GtkTable *table; + GtkStyle *style; GtkWidget *pie_canvas; GtkWidget *used_canvas; GtkWidget *used_label; @@ -2804,6 +2999,24 @@ create_pie_widget (FMPropertiesWindow *window) uri = nautilus_file_get_activation_uri (file); table = GTK_TABLE (gtk_table_new (4, 3, FALSE)); + + style = gtk_rc_get_style (GTK_WIDGET(table)); + + if (!gtk_style_lookup_color (style, "chart_color_1", &window->details->used_color)) { + window->details->used_color.red = USED_FILL_R; + window->details->used_color.green = USED_FILL_G; + window->details->used_color.blue = USED_FILL_B; + } + + if (!gtk_style_lookup_color (style, "chart_color_2", &window->details->free_color)) { + window->details->free_color.red = FREE_FILL_R; + window->details->free_color.green = FREE_FILL_G; + window->details->free_color.blue = FREE_FILL_B; + } + + _pie_style_shade (&window->details->used_color, &window->details->used_stroke_color, 0.7); + _pie_style_shade (&window->details->free_color, &window->details->free_stroke_color, 0.7); + pie_canvas = gtk_drawing_area_new (); gtk_widget_set_size_request (pie_canvas, 200, 200); @@ -2850,8 +3063,8 @@ create_pie_widget (FMPropertiesWindow *window) gtk_table_attach (table, fstype_label , 1, 3, 3, 4, GTK_FILL, 0, 5, 5); g_signal_connect (G_OBJECT (pie_canvas), "expose-event", G_CALLBACK (paint_pie_chart), window); - g_signal_connect (G_OBJECT (used_canvas), "expose-event", G_CALLBACK (paint_used_legend), NULL); - g_signal_connect (G_OBJECT (free_canvas), "expose-event", G_CALLBACK (paint_free_legend), NULL); + g_signal_connect (G_OBJECT (used_canvas), "expose-event", G_CALLBACK (paint_used_legend), window); + g_signal_connect (G_OBJECT (free_canvas), "expose-event", G_CALLBACK (paint_free_legend), window); return GTK_WIDGET (table); } |