diff gtk/gtkcellrendererprogress.c @ 14191:009db0b357b5

This is a hand-crafted commit to migrate across subversion revisions 16854:16861, due to some vagaries of the way the original renames were done. Witness that monotone can do in one revision what svn had to spread across several.
author Ethan Blanton <elb@pidgin.im>
date Sat, 16 Dec 2006 04:59:55 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk/gtkcellrendererprogress.c	Sat Dec 16 04:59:55 2006 +0000
@@ -0,0 +1,295 @@
+/*
+ * @file gtkcellrendererprogress.c GTK+ Cell Renderer Progress
+ * @ingroup gtkui
+ *
+ * gaim
+ *
+ * Gaim is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * 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
+ *
+ */
+
+/* This is taken largely from GtkCellRenderer[Text|Pixbuf|Toggle] by 
+ * Jonathon Blandford <jrb@redhat.com> for RedHat, Inc.
+ */
+
+#include "gtkcellrendererprogress.h"
+
+static void gaim_gtk_cell_renderer_progress_get_property  (GObject                    *object,
+						      guint                       param_id,
+						      GValue                     *value,
+						      GParamSpec                 *pspec);
+static void gaim_gtk_cell_renderer_progress_set_property  (GObject                    *object,
+						      guint                       param_id,
+						      const GValue               *value,
+						      GParamSpec                 *pspec);
+static void gaim_gtk_cell_renderer_progress_init       (GaimGtkCellRendererProgress      *cellprogress);
+static void gaim_gtk_cell_renderer_progress_class_init (GaimGtkCellRendererProgressClass *class);
+static void gaim_gtk_cell_renderer_progress_get_size   (GtkCellRenderer            *cell,
+						   GtkWidget                  *widget,
+						   GdkRectangle               *cell_area,
+						   gint                       *x_offset,
+						   gint                       *y_offset,
+						   gint                       *width,
+						   gint                       *height);
+static void gaim_gtk_cell_renderer_progress_render     (GtkCellRenderer            *cell,
+						   GdkWindow                  *window,
+						   GtkWidget                  *widget,
+						   GdkRectangle               *background_area,
+						   GdkRectangle               *cell_area,
+						   GdkRectangle               *expose_area,
+						   guint                       flags);
+#if 0
+static gboolean gaim_gtk_cell_renderer_progress_activate  (GtkCellRenderer            *cell,
+						      GdkEvent                   *event,
+						      GtkWidget                  *widget,
+						      const gchar                *path,
+						      GdkRectangle               *background_area,
+						      GdkRectangle               *cell_area,
+						      guint                       flags);
+#endif
+static void  gaim_gtk_cell_renderer_progress_finalize (GObject *gobject);
+
+enum {
+	LAST_SIGNAL
+};
+
+enum {
+	PROP_0,
+	PROP_PERCENTAGE,
+	PROP_TEXT,
+	PROP_SHOW_TEXT
+};
+     
+static gpointer parent_class;
+/* static guint progress_cell_renderer_signals [LAST_SIGNAL]; */
+
+GType  gaim_gtk_cell_renderer_progress_get_type (void)
+{
+	static GType cell_progress_type = 0;
+	
+	if (!cell_progress_type)
+		{
+			static const GTypeInfo cell_progress_info =
+				{
+					sizeof (GaimGtkCellRendererProgressClass),
+					NULL,           /* base_init */
+					NULL,           /* base_finalize */
+					(GClassInitFunc) gaim_gtk_cell_renderer_progress_class_init,
+					NULL,           /* class_finalize */
+					NULL,           /* class_data */
+					sizeof (GaimGtkCellRendererProgress),
+					0,              /* n_preallocs */
+					(GInstanceInitFunc) gaim_gtk_cell_renderer_progress_init,
+					NULL		/* value_table */
+				};
+			
+			cell_progress_type =
+				g_type_register_static (GTK_TYPE_CELL_RENDERER,
+										"GaimGtkCellRendererProgress",
+										&cell_progress_info, 0);
+		}
+	
+	return cell_progress_type;
+}
+
+static void gaim_gtk_cell_renderer_progress_init (GaimGtkCellRendererProgress *cellprogress)
+{
+	GTK_CELL_RENDERER(cellprogress)->mode = GTK_CELL_RENDERER_MODE_INERT;
+	GTK_CELL_RENDERER(cellprogress)->xpad = 2;
+	GTK_CELL_RENDERER(cellprogress)->ypad = 2;
+}
+
+static void gaim_gtk_cell_renderer_progress_class_init (GaimGtkCellRendererProgressClass *class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS(class);
+	GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(class);
+	
+	parent_class = g_type_class_peek_parent (class);
+	object_class->finalize = gaim_gtk_cell_renderer_progress_finalize;
+
+	object_class->get_property = gaim_gtk_cell_renderer_progress_get_property;
+	object_class->set_property = gaim_gtk_cell_renderer_progress_set_property;
+	
+	cell_class->get_size = gaim_gtk_cell_renderer_progress_get_size;
+	cell_class->render   = gaim_gtk_cell_renderer_progress_render;
+	
+	g_object_class_install_property (object_class,
+					 PROP_PERCENTAGE,
+					 g_param_spec_double ("percentage",
+							      "Percentage",
+							      "The fractional progress to display",
+							      0, 1, 0,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_TEXT,
+					 g_param_spec_string ("text",
+							      "Text",
+							      "Text to overlay over progress bar",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property(object_class,
+					PROP_SHOW_TEXT,
+					g_param_spec_string("text_set",
+							    "Text set",
+							    "Whether to overlay text on the progress bar",
+							    FALSE,
+							    G_PARAM_READABLE | G_PARAM_WRITABLE));
+}
+
+static void gaim_gtk_cell_renderer_progress_finalize (GObject *object)
+{
+/*
+	GaimGtkCellRendererProgress *cellprogress = GAIM_GTK_CELL_RENDERER_PROGRESS(object);
+*/
+
+	(* G_OBJECT_CLASS (parent_class)->finalize) (object);
+}
+
+static void gaim_gtk_cell_renderer_progress_get_property (GObject    *object,
+						     guint      param_id,
+						     GValue     *value,
+						     GParamSpec *psec)
+{
+	GaimGtkCellRendererProgress *cellprogress = GAIM_GTK_CELL_RENDERER_PROGRESS(object);
+
+	switch (param_id)
+		{
+		case PROP_PERCENTAGE:
+			g_value_set_double(value, cellprogress->progress);
+			break;
+		case PROP_TEXT:
+			g_value_set_string(value, cellprogress->text);
+			break;
+		case PROP_SHOW_TEXT:
+			g_value_set_boolean(value, cellprogress->text_set);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, psec);
+			break;
+		}
+}
+
+static void gaim_gtk_cell_renderer_progress_set_property (GObject      *object,
+						     guint        param_id,
+						     const GValue *value,
+						     GParamSpec   *pspec)
+{
+	GaimGtkCellRendererProgress *cellprogress = GAIM_GTK_CELL_RENDERER_PROGRESS (object);
+
+	switch (param_id)
+		{
+		case PROP_PERCENTAGE:
+			cellprogress->progress = g_value_get_double(value);
+			break;
+		case PROP_TEXT:
+			if (cellprogress->text)
+				g_free(cellprogress->text);
+			cellprogress->text = g_strdup(g_value_get_string(value));
+			g_object_notify(object, "text");
+			break;
+		case PROP_SHOW_TEXT:
+			cellprogress->text_set = g_value_get_boolean(value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+			break;
+		}
+}
+
+GtkCellRenderer *gaim_gtk_cell_renderer_progress_new(void)
+{
+	return g_object_new(GAIM_TYPE_GTK_CELL_RENDERER_PROGRESS, NULL);
+}
+
+static void gaim_gtk_cell_renderer_progress_get_size (GtkCellRenderer *cell,
+						 GtkWidget       *widget,
+						 GdkRectangle    *cell_area,
+						 gint            *x_offset,
+						 gint            *y_offset,
+						 gint            *width,
+						 gint            *height)
+{
+	gint calc_width;
+	gint calc_height;
+	
+	calc_width = (gint) cell->xpad * 2 + 50;
+	calc_height = (gint) cell->ypad * 2 + 12;
+	
+	if (width)
+		*width = calc_width;
+	
+	if (height)
+		*height = calc_height;
+	
+	if (cell_area)
+		{
+			if (x_offset)
+				{
+					*x_offset = cell->xalign * (cell_area->width - calc_width);
+					*x_offset = MAX (*x_offset, 0);
+				}
+			if (y_offset)
+				{
+					*y_offset = cell->yalign * (cell_area->height - calc_height);
+					*y_offset = MAX (*y_offset, 0);
+				}
+		}
+}
+
+
+static void gaim_gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
+					       GdkWindow       *window,
+					       GtkWidget       *widget,
+					       GdkRectangle    *background_area,
+					       GdkRectangle    *cell_area,
+					       GdkRectangle    *expose_area,
+					       guint            flags)
+{
+	GaimGtkCellRendererProgress *cellprogress = (GaimGtkCellRendererProgress *) cell;
+	
+	gint width, height;
+	GtkStateType state;
+
+	width = cell_area->width;
+	height = cell_area->height;
+	
+	if (GTK_WIDGET_HAS_FOCUS (widget))
+		state = GTK_STATE_ACTIVE;
+	else
+		state = GTK_STATE_NORMAL;
+
+	width -= cell->xpad*2;
+	height -= cell->ypad*2;
+
+	gtk_paint_box (widget->style,
+		       window,
+		       GTK_STATE_NORMAL, GTK_SHADOW_IN, 
+		       NULL, widget, "trough",
+		       cell_area->x + cell->xpad,
+		       cell_area->y + cell->ypad,
+		       width - 1, height - 1);
+	gtk_paint_box (widget->style,
+		       window,
+		       state, GTK_SHADOW_OUT,
+		       NULL, widget, "bar",
+		       cell_area->x + cell->xpad + 1,
+		       cell_area->y + cell->ypad + 1,
+		       (width - 3) * cellprogress->progress,
+		       height - 3);
+}