[muine] Restore ColoredCellRendererPixbuf [Jorn Baayen]



commit d315979dd99131157d6dd48dbd4851e0a1828efc
Author: Priit Laes <plaes plaes org>
Date:   Thu Aug 27 11:41:11 2009 +0300

    Restore ColoredCellRendererPixbuf [Jorn Baayen]
    
    Gtk+'s stock CellRendererPixbuf does not look nice.
    
    * libmuine/Makefile.am, libmuine/rb-cell-renderer-pixbuf.c,
      libmuine/rb-cell-renderer-pixbuf.h, src/ColoredCellRendererPixbuf.cs,
      src/Makefile.am, src/PlaylistWindow.cs

 libmuine/Makefile.am               |    2 +
 libmuine/rb-cell-renderer-pixbuf.c |  348 ++++++++++++++++++++++++++++++++++++
 libmuine/rb-cell-renderer-pixbuf.h |   62 +++++++
 src/ColoredCellRendererPixbuf.cs   |   64 +++++++
 src/Makefile.am                    |    1 +
 src/PlaylistWindow.cs              |   13 +-
 6 files changed, 487 insertions(+), 3 deletions(-)
---
diff --git a/libmuine/Makefile.am b/libmuine/Makefile.am
index e5cc7af..93892fb 100644
--- a/libmuine/Makefile.am
+++ b/libmuine/Makefile.am
@@ -19,6 +19,8 @@ libmuine_la_SOURCES =			\
 	player-gst.c		\
 	pointer-list-model.c		\
 	pointer-list-model.h		\
+        rb-cell-renderer-pixbuf.c       \
+        rb-cell-renderer-pixbuf.h       \
 	db.c				\
 	db.h				\
 	mm-keys.c			\
diff --git a/libmuine/rb-cell-renderer-pixbuf.c b/libmuine/rb-cell-renderer-pixbuf.c
new file mode 100644
index 0000000..42cff41
--- /dev/null
+++ b/libmuine/rb-cell-renderer-pixbuf.c
@@ -0,0 +1,348 @@
+/* rbcellrendererpixbuf.c
+ *
+ * arch-tag: Implementation of Rhythmbox pixbuf GtkTreeView cell renderer
+ *
+ * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb redhat com>
+ * Copyright (C) 2002  Jorn Baayen <jorn nl linux org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "rb-cell-renderer-pixbuf.h"
+#include "macros.h"
+
+static void rb_cell_renderer_pixbuf_get_property  (GObject                    *object,
+						   guint                       param_id,
+						   GValue                     *value,
+						   GParamSpec                 *pspec);
+static void rb_cell_renderer_pixbuf_set_property  (GObject                    *object,
+						   guint                       param_id,
+						   const GValue               *value,
+						   GParamSpec                 *pspec);
+static void rb_cell_renderer_pixbuf_init       (RBCellRendererPixbuf      *celltext);
+static void rb_cell_renderer_pixbuf_class_init (RBCellRendererPixbufClass *class);
+static void rb_cell_renderer_pixbuf_get_size   (GtkCellRenderer            *cell,
+						GtkWidget                  *widget,
+						GdkRectangle               *rectangle,
+						gint                       *x_offset,
+						gint                       *y_offset,
+						gint                       *width,
+						gint                       *height);
+static void rb_cell_renderer_pixbuf_render     (GtkCellRenderer            *cell,
+						GdkWindow                  *window,
+						GtkWidget                  *widget,
+						GdkRectangle               *background_area,
+						GdkRectangle               *cell_area,
+						GdkRectangle               *expose_area,
+						guint                       flags);
+
+
+enum {
+	PROP_ZERO,
+	PROP_PIXBUF
+};
+
+
+GType
+rb_cell_renderer_pixbuf_get_type (void)
+{
+	static GType cell_pixbuf_type = 0;
+
+	if (!cell_pixbuf_type)
+	{
+		static const GTypeInfo cell_pixbuf_info =
+		{
+			sizeof (RBCellRendererPixbufClass),
+			NULL,		/* base_init */
+			NULL,		/* base_finalize */
+			(GClassInitFunc) rb_cell_renderer_pixbuf_class_init,
+			NULL,		/* class_finalize */
+			NULL,		/* class_data */
+			sizeof (RBCellRendererPixbuf),
+			0,              /* n_preallocs */
+			(GInstanceInitFunc) rb_cell_renderer_pixbuf_init,
+			NULL
+		};
+
+		cell_pixbuf_type = g_type_register_static (GTK_TYPE_CELL_RENDERER, "RBCellRendererPixbuf", &cell_pixbuf_info, 0);
+	}
+
+	return cell_pixbuf_type;
+}
+
+static void
+rb_cell_renderer_pixbuf_init (RBCellRendererPixbuf *UNUSED(cellpixbuf))
+{
+}
+
+static void
+rb_cell_renderer_pixbuf_class_init (RBCellRendererPixbufClass *class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (class);
+	GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (class);
+
+	object_class->get_property = rb_cell_renderer_pixbuf_get_property;
+	object_class->set_property = rb_cell_renderer_pixbuf_set_property;
+
+	cell_class->get_size = rb_cell_renderer_pixbuf_get_size;
+	cell_class->render = rb_cell_renderer_pixbuf_render;
+
+	g_object_class_install_property (object_class,
+					 PROP_PIXBUF,
+					 g_param_spec_object ("pixbuf",
+							      "Pixbuf Object",
+							      "The pixbuf to render.",
+							      GDK_TYPE_PIXBUF,
+							      G_PARAM_READABLE |
+							      G_PARAM_WRITABLE));
+}
+
+static void
+rb_cell_renderer_pixbuf_get_property (GObject        *object,
+				      guint           param_id,
+				      GValue         *value,
+				      GParamSpec     *pspec)
+{
+  RBCellRendererPixbuf *cellpixbuf = RB_CELL_RENDERER_PIXBUF (object);
+  
+  switch (param_id)
+    {
+    case PROP_PIXBUF:
+      g_value_set_object (value,
+                          cellpixbuf->pixbuf ? G_OBJECT (cellpixbuf->pixbuf) : NULL);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+    }
+}
+
+
+static void
+rb_cell_renderer_pixbuf_set_property (GObject      *object,
+				      guint         param_id,
+				      const GValue *value,
+				      GParamSpec   *pspec)
+{
+  GdkPixbuf *pixbuf;
+  RBCellRendererPixbuf *cellpixbuf = RB_CELL_RENDERER_PIXBUF (object);
+  
+  switch (param_id)
+    {
+    case PROP_PIXBUF:
+      pixbuf = (GdkPixbuf*) g_value_get_object (value);
+      if (pixbuf)
+        g_object_ref (G_OBJECT (pixbuf));
+      if (cellpixbuf->pixbuf)
+	g_object_unref (G_OBJECT (cellpixbuf->pixbuf));
+      cellpixbuf->pixbuf = pixbuf;
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+    }
+}
+
+/**
+ * rb_cell_renderer_pixbuf_new:
+ * 
+ * Creates a new #RBCellRendererPixbuf. Adjust rendering
+ * parameters using object properties. Object properties can be set
+ * globally (with g_object_set()). Also, with #RBTreeViewColumn, you
+ * can bind a property to a value in a #RBTreeModel. For example, you
+ * can bind the "pixbuf" property on the cell renderer to a pixbuf value
+ * in the model, thus rendering a different image in each row of the
+ * #RBTreeView.
+ * 
+ * Return value: the new cell renderer
+ **/
+GtkCellRenderer *
+rb_cell_renderer_pixbuf_new (void)
+{
+  return GTK_CELL_RENDERER (g_object_new (rb_cell_renderer_pixbuf_get_type (), NULL));
+}
+
+static GdkPixbuf *
+eel_create_colorized_pixbuf (GdkPixbuf *src,
+    			     int red_value,
+			     int green_value,
+			     int blue_value)
+{
+	int i, j;
+	int width, height, has_alpha, src_row_stride, dst_row_stride;
+	guchar *target_pixels;
+	guchar *original_pixels;
+	guchar *pixsrc;
+	guchar *pixdest;
+	GdkPixbuf *dest;
+
+	g_return_val_if_fail (gdk_pixbuf_get_colorspace (src) == GDK_COLORSPACE_RGB, NULL);
+	g_return_val_if_fail ((!gdk_pixbuf_get_has_alpha (src)
+		       	      && gdk_pixbuf_get_n_channels (src) == 3)
+			      || (gdk_pixbuf_get_has_alpha (src)
+			      && gdk_pixbuf_get_n_channels (src) == 4), NULL);
+	g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (src) == 8, NULL);
+
+	dest = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src),
+			       gdk_pixbuf_get_has_alpha (src),
+			       gdk_pixbuf_get_bits_per_sample (src),
+			       gdk_pixbuf_get_width (src),
+			       gdk_pixbuf_get_height (src));
+
+	has_alpha = gdk_pixbuf_get_has_alpha (src);
+	width = gdk_pixbuf_get_width (src);
+	height = gdk_pixbuf_get_height (src);
+	src_row_stride = gdk_pixbuf_get_rowstride (src);
+	dst_row_stride = gdk_pixbuf_get_rowstride (dest);
+	target_pixels = gdk_pixbuf_get_pixels (dest);
+	original_pixels = gdk_pixbuf_get_pixels (src);
+
+	for (i = 0; i < height; i++) {
+		pixdest = target_pixels + i*dst_row_stride;
+		pixsrc = original_pixels + i*src_row_stride;
+		for (j = 0; j < width; j++) {		
+			*pixdest++ = *pixsrc++ ? red_value : 0;
+			*pixdest++ = *pixsrc++ ? green_value : 0;
+			*pixdest++ = *pixsrc++ ? blue_value : 0;
+			if (has_alpha) {
+				*pixdest++ = *pixsrc++;
+			}	
+		}
+	}
+	return dest;
+}
+
+static void
+rb_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell,
+				  GtkWidget       *UNUSED(widget),
+				  GdkRectangle    *cell_area,
+				  gint            *x_offset,
+				  gint            *y_offset,
+				  gint            *width,
+				  gint            *height)
+{
+  RBCellRendererPixbuf *cellpixbuf = (RBCellRendererPixbuf *) cell;
+  gint pixbuf_width = 0;
+  gint pixbuf_height = 0;
+  gint calc_width;
+  gint calc_height;
+
+  if (cellpixbuf->pixbuf)
+    {
+      pixbuf_width = gdk_pixbuf_get_width (cellpixbuf->pixbuf);
+      pixbuf_height = gdk_pixbuf_get_height (cellpixbuf->pixbuf);
+    }
+  
+  calc_width = (gint) GTK_CELL_RENDERER (cellpixbuf)->xpad * 2 + pixbuf_width;
+  calc_height = (gint) GTK_CELL_RENDERER (cellpixbuf)->ypad * 2 + pixbuf_height;
+  
+  if (x_offset) *x_offset = 0;
+  if (y_offset) *y_offset = 0;
+
+  if (cell_area && pixbuf_width > 0 && pixbuf_height > 0)
+    {
+      if (x_offset)
+	{
+	  *x_offset = GTK_CELL_RENDERER (cellpixbuf)->xalign * (cell_area->width - calc_width - (2 * GTK_CELL_RENDERER (cellpixbuf)->xpad));
+	  *x_offset = MAX (*x_offset, 0) + GTK_CELL_RENDERER (cellpixbuf)->xpad;
+	}
+      if (y_offset)
+	{
+	  *y_offset = GTK_CELL_RENDERER (cellpixbuf)->yalign * (cell_area->height - calc_height - (2 * GTK_CELL_RENDERER (cellpixbuf)->ypad));
+	  *y_offset = MAX (*y_offset, 0) + GTK_CELL_RENDERER (cellpixbuf)->ypad;
+	}
+    }
+
+  if (calc_width)
+    *width = calc_width;
+  
+  if (height)
+    *height = calc_height;
+}
+
+static void
+rb_cell_renderer_pixbuf_render (GtkCellRenderer    *cell,
+				GdkWindow          *window,
+				GtkWidget          *widget,
+				GdkRectangle       *UNUSED(background_area),
+				GdkRectangle       *cell_area,
+				GdkRectangle       *UNUSED(expose_area),
+				guint               flags)
+
+{
+  RBCellRendererPixbuf *cellpixbuf = (RBCellRendererPixbuf *) cell;
+  GdkPixbuf *pixbuf;
+  GdkRectangle pix_rect;
+  GdkRectangle draw_rect;
+  GtkStateType state;
+
+  if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED)
+    {
+      if (GTK_WIDGET_HAS_FOCUS (widget))
+        state = GTK_STATE_SELECTED;
+      else
+        state = GTK_STATE_ACTIVE;
+    }
+  else
+    {
+      if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE)
+        state = GTK_STATE_INSENSITIVE;
+      else
+        state = GTK_STATE_NORMAL;
+    }
+
+  if (!cellpixbuf->pixbuf)
+    return;
+
+  pixbuf = eel_create_colorized_pixbuf (cellpixbuf->pixbuf,
+					widget->style->text[state].red,
+					widget->style->text[state].green,
+					widget->style->text[state].blue);
+
+  if (!pixbuf)
+    return;
+
+  rb_cell_renderer_pixbuf_get_size (cell, widget, cell_area,
+				     &pix_rect.x,
+				     &pix_rect.y,
+				     &pix_rect.width,
+				     &pix_rect.height);
+  
+  pix_rect.x += cell_area->x;
+  pix_rect.y += cell_area->y;
+  pix_rect.width -= cell->xpad * 2;
+  pix_rect.height -= cell->ypad * 2;
+  
+  if (gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect))
+    gdk_draw_pixbuf (window,
+		     widget->style->black_gc,
+                     pixbuf,
+                     /* pixbuf 0, 0 is at pix_rect.x, pix_rect.y */
+                     draw_rect.x - pix_rect.x,
+                     draw_rect.y - pix_rect.y,
+                     draw_rect.x,
+                     draw_rect.y,
+                     draw_rect.width,
+                     draw_rect.height,
+		     GDK_RGB_DITHER_NORMAL,
+		     0, 0);
+
+  g_object_unref (pixbuf);
+}
diff --git a/libmuine/rb-cell-renderer-pixbuf.h b/libmuine/rb-cell-renderer-pixbuf.h
new file mode 100644
index 0000000..6d42fce
--- /dev/null
+++ b/libmuine/rb-cell-renderer-pixbuf.h
@@ -0,0 +1,62 @@
+/* rbcellrendererpixbuf.h
+ *
+ * arch-tag: Header for Rhythmbox pixbuf GtkTreeView cell renderer
+ *
+ * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb redhat com>
+ * Copyright (C) 2002  Jorn Baayen <jorn nl linux org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RB_CELL_RENDERER_PIXBUF_H__
+#define __RB_CELL_RENDERER_PIXBUF_H__
+
+#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define RB_TYPE_CELL_RENDERER_PIXBUF		(rb_cell_renderer_pixbuf_get_type ())
+#define RB_CELL_RENDERER_PIXBUF(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), RB_TYPE_CELL_RENDERER_PIXBUF, RBCellRendererPixbuf))
+#define RB_CELL_RENDERER_PIXBUF_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), RB_TYPE_CELL_RENDERER_PIXBUF, RBCellRendererPixbufClass))
+#define RB_IS_CELL_RENDERER_PIXBUF(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), RB_TYPE_CELL_RENDERER_PIXBUF))
+#define RB_IS_CELL_RENDERER_PIXBUF_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), RB_TYPE_CELL_RENDERER_PIXBUF))
+#define RB_CELL_RENDERER_PIXBUF_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), RB_TYPE_CELL_RENDERER_PIXBUF, RBCellRendererPixbufClass))
+
+typedef struct _RBCellRendererPixbuf RBCellRendererPixbuf;
+typedef struct _RBCellRendererPixbufClass RBCellRendererPixbufClass;
+
+struct _RBCellRendererPixbuf
+{
+  GtkCellRenderer parent;
+
+  GdkPixbuf *pixbuf;
+};
+
+struct _RBCellRendererPixbufClass
+{
+  GtkCellRendererClass parent_class;
+};
+
+GType            rb_cell_renderer_pixbuf_get_type (void);
+GtkCellRenderer *rb_cell_renderer_pixbuf_new      (void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __RB_CELL_RENDERER_PIXBUF_H__ */
diff --git a/src/ColoredCellRendererPixbuf.cs b/src/ColoredCellRendererPixbuf.cs
new file mode 100644
index 0000000..72c92a5
--- /dev/null
+++ b/src/ColoredCellRendererPixbuf.cs
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2004 Jorn Baayen <jbaayen gnome org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace Muine
+{
+	/// <summary>
+	/// </summary>
+	/// <remarks>
+	///	This renderer is similar to <see cref="Gtk.CellRendererPixbuf" />.
+	/// </remarks>
+	public class ColoredCellRendererPixbuf : Gtk.CellRenderer 
+	{
+		// Constructor
+		[DllImport ("libmuine")]
+		private static extern IntPtr rb_cell_renderer_pixbuf_new ();
+
+		/// <summary>
+		///	Create a new <see cref="ColoredCellRendererPixbuf" />
+		///	object.
+		/// </summary>
+		public ColoredCellRendererPixbuf () : base (IntPtr.Zero)
+		{
+			base.Raw = rb_cell_renderer_pixbuf_new ();
+                        System.Console.WriteLine("hi");
+		}
+
+		// Destructor
+		~ColoredCellRendererPixbuf ()
+		{
+			Dispose ();
+		}
+
+		// Properties
+		// Properties :: Pixbuf (set;)
+		/// <summary>
+		///	The <see cref="Gdk.Pixbuf" /> to be used.
+		/// </summary>
+		/// <param name="value">
+		///	A <see cref="Gdk.Pixbuf" />.
+		/// </param>
+		public Gdk.Pixbuf Pixbuf {
+			set { SetProperty ("pixbuf", new GLib.Value (value)); }
+		}
+	}
+}
diff --git a/src/Makefile.am b/src/Makefile.am
index 76e91f0..b2269b1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,6 +26,7 @@ MUINE_CSFILES =					\
 	$(srcdir)/HandleView.cs			\
 	$(srcdir)/HandleModel.cs		\
 	$(srcdir)/StockIcons.cs			\
+	$(srcdir)/ColoredCellRendererPixbuf.cs  \
 	$(srcdir)/CoverDatabase.cs		\
 	$(srcdir)/CoverGetter.cs		\
 	$(srcdir)/MusicBrainz.cs		\
diff --git a/src/PlaylistWindow.cs b/src/PlaylistWindow.cs
index 88104d0..ab1edbd 100644
--- a/src/PlaylistWindow.cs
+++ b/src/PlaylistWindow.cs
@@ -166,9 +166,9 @@ namespace Muine
 		[Glade.Widget] private Box            menu_bar_box  ;
 		[Glade.Widget] private ScrolledWindow scrolledwindow;
 
-		private Gdk.Pixbuf         empty_pixbuf   ;
-		private CellRendererPixbuf pixbuf_renderer;
-		private CellRendererText   text_renderer  ;
+		private Gdk.Pixbuf                empty_pixbuf   ;
+		private CellRendererText          text_renderer  ;
+		private ColoredCellRendererPixbuf pixbuf_renderer;
 		
 		// Widgets :: Containers
 		[Glade.Widget] private Container volume_button_container;
@@ -896,8 +896,11 @@ namespace Muine
 
 			playlist.Selection.Mode = SelectionMode.Multiple;
 
+			/* Stock Cell Renderer
 			pixbuf_renderer = new Gtk.CellRendererPixbuf ();
                         pixbuf_renderer.FollowState = true;
+			*/
+			pixbuf_renderer = new ColoredCellRendererPixbuf ();
 
 			text_renderer   = new Gtk.CellRendererText ();
 			text_renderer.Ellipsize = Pango.EllipsizeMode.End;
@@ -2262,7 +2265,11 @@ namespace Muine
 		  (TreeViewColumn col, CellRenderer cell, TreeModel model,
 		   TreeIter iter)
 		{
+			/*
 			Gtk.CellRendererPixbuf r = (Gtk.CellRendererPixbuf) cell;
+			*/
+			ColoredCellRendererPixbuf r = (ColoredCellRendererPixbuf) cell;
+
 			IntPtr handle = playlist.Model.HandleFromIter (iter);
 
 			if (handle == playlist.Model.Playing) {



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