[muine] Restore ColoredCellRendererPixbuf [Jorn Baayen]
- From: Priit Laes <plaes src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [muine] Restore ColoredCellRendererPixbuf [Jorn Baayen]
- Date: Thu, 27 Aug 2009 09:05:40 +0000 (UTC)
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]