evolution r34855 - trunk/widgets/table



Author: sragavan
Date: Sat Jan 19 21:51:18 2008
New Revision: 34855
URL: http://svn.gnome.org/viewvc/evolution?rev=34855&view=rev

Log:
2008-01-20  Srinivasa Ragavan  <sragavan novell com>

	* e-cell-toggle.c: (etog_new_view), (etog_kill_view), (etog_draw),
	(etog_print), (e_cell_toggle_class_init),
	(e_cell_toggle_construct): Removed the pixmap cache. It wasn't giving
	alpha for the cairo rendered message list row.
	* e-table-item.c: (eti_draw): Render the rows with Cairo. It looks
	same as GtkTreeView and seems nice.


Modified:
   trunk/widgets/table/ChangeLog
   trunk/widgets/table/e-cell-toggle.c
   trunk/widgets/table/e-table-item.c

Modified: trunk/widgets/table/e-cell-toggle.c
==============================================================================
--- trunk/widgets/table/e-cell-toggle.c	(original)
+++ trunk/widgets/table/e-cell-toggle.c	Sat Jan 19 21:51:18 2008
@@ -41,7 +41,6 @@
 	ECellView     cell_view;
 	GdkGC        *gc;
 	GnomeCanvas  *canvas;
-	GdkPixmap   **pixmap_cache;
 } ECellToggleView;
 
 #define CACHE_SEQ_COUNT 6
@@ -55,8 +54,6 @@
 	ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
 	ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
 	GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
-	ECellToggle *etog = E_CELL_TOGGLE (ecell);
-	int i;
 
 	toggle_view->cell_view.ecell = ecell;
 	toggle_view->cell_view.e_table_model = table_model;
@@ -64,9 +61,6 @@
         toggle_view->cell_view.kill_view_cb = NULL;
         toggle_view->cell_view.kill_view_cb_data = NULL;
 	toggle_view->canvas = canvas;
-	toggle_view->pixmap_cache = g_new (GdkPixmap *, etog->n_states * CACHE_SEQ_COUNT);
-	for (i = 0; i < etog->n_states * CACHE_SEQ_COUNT; i++)
-		toggle_view->pixmap_cache[i] = NULL;
 
 	return (ECellView *) toggle_view;
 }
@@ -74,9 +68,7 @@
 static void
 etog_kill_view (ECellView *ecell_view)
 {
-	ECellToggle *etog = E_CELL_TOGGLE (ecell_view->ecell);
 	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	int i;
 
         if (toggle_view->cell_view.kill_view_cb)
             (toggle_view->cell_view.kill_view_cb)(ecell_view, toggle_view->cell_view.kill_view_cb_data);
@@ -84,10 +76,6 @@
         if (toggle_view->cell_view.kill_view_cb_data)
             g_list_free(toggle_view->cell_view.kill_view_cb_data);
 
-	for (i = 0; i < etog->n_states * CACHE_SEQ_COUNT; i++)
-		if (toggle_view->pixmap_cache[i])
-			g_object_unref (toggle_view->pixmap_cache[i]);
-	g_free (toggle_view->pixmap_cache);
 	g_free (ecell_view);
 }
 
@@ -111,65 +99,10 @@
 	toggle_view->gc = NULL;
 }
 
-#define PIXMAP_CACHE(toggle_view, cache_seq, image_seq) ((toggle_view)->pixmap_cache[(cache_seq) * E_CELL_TOGGLE (((ECellView *) (toggle_view))->ecell)->n_states + (image_seq)])
-
 #define RGB_COLOR(color) (((color).red & 0xff00) << 8 | \
 			   ((color).green & 0xff00) | \
 			   ((color).blue & 0xff00) >> 8)
 
-static void
-check_cache (ECellToggleView *toggle_view, int image_seq, int cache_seq)
-{
-	ECellView *ecell_view = (ECellView *) toggle_view;
-	ECellToggle *etog = E_CELL_TOGGLE (ecell_view->ecell);
-
-	if (PIXMAP_CACHE (toggle_view, cache_seq, image_seq) == NULL) {
-		GdkPixbuf *image = etog->images[image_seq];
-		GdkPixbuf *flat;
-		GdkColor  color;
-		int width = gdk_pixbuf_get_width (image);
-		int height = gdk_pixbuf_get_height (image);
-
-		PIXMAP_CACHE (toggle_view, cache_seq, image_seq) =
-			gdk_pixmap_new (toggle_view->canvas->layout.bin_window, width, height,
-					gtk_widget_get_visual (GTK_WIDGET (toggle_view->canvas))->depth);
-
-
-		switch (cache_seq % 3) {
-		case 0:
-			color = GTK_WIDGET (toggle_view->canvas)->style->bg [GTK_STATE_SELECTED];
-			break;
-		case 1:
-			color = GTK_WIDGET (toggle_view->canvas)->style->bg [GTK_STATE_ACTIVE];
-			break;
-		case 2:
-			color = GTK_WIDGET (toggle_view->canvas)->style->base [GTK_STATE_NORMAL];
-			break;
-		}
-
-		if (cache_seq >= 3) {
-			e_hsv_tweak (&color, 0.0f, 0.0f, -0.07f);
-		}
-
-		flat = gdk_pixbuf_composite_color_simple (image,
-							  width, height,
-							  GDK_INTERP_BILINEAR,
-							  255,
-							  1,
-							  RGB_COLOR (color), RGB_COLOR (color));
-
-		gdk_draw_pixbuf (PIXMAP_CACHE (toggle_view, cache_seq, image_seq),
-				 toggle_view->gc,
-				 flat,
-				 0, 0,
-				 0, 0,
-				 width, height,
-				 GDK_RGB_DITHER_NORMAL,
-				 0, 0);
-		g_object_unref (flat);
-	}
-}
-
 /*
  * ECell::draw method
  */
@@ -180,10 +113,10 @@
 {
 	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
 	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	GdkPixmap *pixmap;
 	GdkPixbuf *image;
 	int x, y, width, height;
 	int cache_seq;
+	cairo_t *cr;
 
 	const int value = GPOINTER_TO_INT (
 		 e_table_model_value_at (ecell_view->e_table_model, model_col, row));
@@ -205,11 +138,9 @@
 	if (E_TABLE_ITEM (ecell_view->e_table_item_view)->alternating_row_colors && (row % 2) == 0)
 		cache_seq += 3;
 
-	check_cache (toggle_view, value, cache_seq);
 
-	pixmap = PIXMAP_CACHE (toggle_view, cache_seq, value);
 	image = toggle->images[value];
-
+	
 	if ((x2 - x1) < gdk_pixbuf_get_width (image)){
 		x = x1;
 		width = x2 - x1;
@@ -217,7 +148,7 @@
 		x = x1 + ((x2 - x1) - gdk_pixbuf_get_width (image)) / 2;
 		width = gdk_pixbuf_get_width (image);
 	}
-
+	
 	if ((y2 - y1) < gdk_pixbuf_get_height (image)){
 		y = y1;
 		height = y2 - y1;
@@ -226,12 +157,14 @@
 		height = gdk_pixbuf_get_height (image);
 	}
 
-	gdk_draw_drawable (drawable, toggle_view->gc,
-			  pixmap,
-			  0, 0,
-			  x, y,
-			  width, height);
-}
+	cr = gdk_cairo_create (drawable);
+	cairo_save (cr);
+	gdk_cairo_set_source_pixbuf (cr, image, x, y);
+	cairo_paint_with_alpha (cr, 1);
+	cairo_restore (cr);
+	cairo_destroy (cr);	
+
+}	
 
 static void
 etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int row, int value)
@@ -310,20 +243,22 @@
 		return;
 	}
 
-	cr = gtk_print_context_get_cairo_context (context);
-	cairo_save(cr);
 	image = toggle->images[value];
-	cairo_translate (cr, 0 , 0);
-	image = gdk_pixbuf_add_alpha (image, TRUE, 255, 255, 255);
-	image_width = (double)gdk_pixbuf_get_width (image);
-	image_height = (double)gdk_pixbuf_get_height (image);
-	cairo_rectangle (cr, image_width / 7, image_height / 3,
-			image_width - image_width / 4,
-			image_width - image_height / 7);
-	cairo_clip (cr);
-	gdk_cairo_set_source_pixbuf (cr, image, 0, image_height / 4);
-	cairo_paint (cr);
-	cairo_restore(cr);
+	if (image) {
+		cr = gtk_print_context_get_cairo_context (context);
+		cairo_save(cr);
+		cairo_translate (cr, 0 , 0);
+		image = gdk_pixbuf_add_alpha (image, TRUE, 255, 255, 255);
+		image_width = (double)gdk_pixbuf_get_width (image);
+		image_height = (double)gdk_pixbuf_get_height (image);
+		cairo_rectangle (cr, image_width / 7, image_height / 3,
+				image_width - image_width / 4,
+				image_width - image_height / 7);
+		cairo_clip (cr);
+		gdk_cairo_set_source_pixbuf (cr, image, 0, image_height / 4);
+		cairo_paint (cr);
+		cairo_restore(cr);
+	}
 }
 
 static gdouble
@@ -358,21 +293,6 @@
 }
 
 static void
-etog_style_set (ECellView *ecell_view, GtkStyle *previous_style)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	int i;
-
-	for (i = 0; i < toggle->n_states * CACHE_SEQ_COUNT; i++) {
-		if (toggle_view->pixmap_cache[i]) {
-			g_object_unref (toggle_view->pixmap_cache[i]);
-			toggle_view->pixmap_cache[i] = NULL;
-		}
-	}
-}
-
-static void
 etog_finalize (GObject *object)
 {
 	ECellToggle *etog = E_CELL_TOGGLE (object);
@@ -406,7 +326,6 @@
 	ecc->print      = etog_print;
 	ecc->print_height = etog_print_height;
 	ecc->max_width  = etog_max_width;
-	ecc->style_set  = etog_style_set;
 
 	gal_a11y_e_cell_registry_add_cell_type (NULL,
 					         E_CELL_TOGGLE_TYPE,
@@ -443,10 +362,12 @@
 
 	for (i = 0; i < n_states; i++){
 		etog->images [i] = images [i];
+		if (images[i]) {
 		g_object_ref (images [i]);
 
 		if (gdk_pixbuf_get_height (images [i]) > max_height)
 			max_height = gdk_pixbuf_get_height (images [i]);
+		}
 	}
 
 	etog->height = max_height;

Modified: trunk/widgets/table/e-table-item.c
==============================================================================
--- trunk/widgets/table/e-table-item.c	(original)
+++ trunk/widgets/table/e-table-item.c	Sat Jan 19 21:51:18 2008
@@ -1830,6 +1830,9 @@
 	ArtPoint eti_base, eti_base_item, lower_right;
 	GtkWidget *canvas = GTK_WIDGET(item->canvas);
 	int height_extra = eti->horizontal_draw_grid ? 1 : 0;
+	cairo_t *cr;
+
+	cr = gdk_cairo_create (drawable);
 
 	/*
 	 * Find out our real position after grouping
@@ -1954,6 +1957,8 @@
 			ECellFlags flags;
 			gboolean free_background;
 			GdkColor *background;
+			int x1, x2, y1, y2;
+			cairo_pattern_t *pat;
 
 			switch (eti->cursor_mode) {
 			case E_CURSOR_SIMPLE:
@@ -1968,12 +1973,52 @@
 				break;
 			}
 
+			x1 = xd;
+			y1 = yd+1;
+			x2 = x1 + ecol->width;
+			y2 = yd+height;
+
 			background = eti_get_cell_background_color (eti, row, col, col_selected, &free_background);
 
-			gdk_gc_set_foreground (eti->fill_gc, background);
-			gdk_draw_rectangle (drawable, eti->fill_gc, TRUE,
-					    xd, yd, ecol->width, height);
+			cairo_save (cr);
+			pat = cairo_pattern_create_linear (0, y1, 0, y2);
+			cairo_pattern_add_color_stop_rgba (pat, 0.0, background->red/65535.0 , 
+								     background->green/65535.0, 
+								     background->blue/65535.0, selected ? 0.8: 1.0);
+
+			cairo_pattern_add_color_stop_rgba (pat, 0.5, background->red/65535.0 , 
+								     background->green/65535.0, 
+								     background->blue/65535.0, 0.9);
+
+			cairo_pattern_add_color_stop_rgba (pat, 1, background->red/65535.0 , 
+								   background->green/65535.0, 
+								   background->blue/65535.0, selected ? 0.8 : 1.0);
+			cairo_rectangle (cr, x1, y1, ecol->width, height-1);
+			cairo_set_source (cr, pat);
+			cairo_fill_preserve (cr);
+			cairo_pattern_destroy (pat);
+			cairo_set_line_width (cr, 0);
+			cairo_stroke (cr);
+			cairo_restore (cr);
 
+			cairo_save (cr);
+			cairo_set_line_width (cr, 1.0);
+			cairo_set_source_rgba (cr, background->red/65535.0 , 
+						   background->green/65535.0, 
+						   background->blue/65535.0, 1);
+			cairo_move_to (cr, x1, y1);
+			cairo_line_to (cr, x2, y1);
+			cairo_stroke (cr);
+
+			cairo_set_line_width (cr, 1.0);
+			cairo_set_source_rgba (cr, background->red/65535.0 , 
+						  background->green/65535.0, 
+						  background->blue/65535.0, 1);
+			cairo_move_to (cr, x1, y2);
+			cairo_line_to (cr, x2, y2);
+			cairo_stroke (cr);
+			cairo_restore (cr); 
+			
 			if (free_background)
 				gdk_color_free (background);
 
@@ -2062,6 +2107,8 @@
 		gdk_draw_rectangle (drawable, eti->focus_gc, FALSE,
 				    f_x1, f_y1, f_x2 - f_x1 - 1, f_y2 - f_y1 - 1);
 	}
+	cairo_destroy (cr);
+
 }
 
 static double



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