* @file gtkcellrendererprogress.c GTK+ Cell Renderer Progress * 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 * 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, static void gaim_gtk_cell_renderer_progress_set_property (GObject *object, 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, static void gaim_gtk_cell_renderer_progress_render (GtkCellRenderer *cell, GdkRectangle *background_area, GdkRectangle *expose_area, static gboolean gaim_gtk_cell_renderer_progress_activate (GtkCellRenderer *cell, GdkRectangle *background_area, static void gaim_gtk_cell_renderer_progress_finalize (GObject *gobject); 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; static const GTypeInfo cell_progress_info = sizeof (GaimGtkCellRendererProgressClass), NULL, /* base_finalize */ (GClassInitFunc) gaim_gtk_cell_renderer_progress_class_init, NULL, /* class_finalize */ sizeof (GaimGtkCellRendererProgress), (GInstanceInitFunc) gaim_gtk_cell_renderer_progress_init, g_type_register_static (GTK_TYPE_CELL_RENDERER, "GaimGtkCellRendererProgress", 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, g_param_spec_double ("percentage", "The fractional progress to display", g_object_class_install_property (object_class, g_param_spec_string ("text", "Text to overlay over progress bar", g_object_class_install_property(object_class, g_param_spec_string("text_set", "Whether to overlay text on the progress bar", 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, GaimGtkCellRendererProgress *cellprogress = GAIM_GTK_CELL_RENDERER_PROGRESS(object); g_value_set_double(value, cellprogress->progress); g_value_set_string(value, cellprogress->text); g_value_set_boolean(value, cellprogress->text_set); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, psec); static void gaim_gtk_cell_renderer_progress_set_property (GObject *object, GaimGtkCellRendererProgress *cellprogress = GAIM_GTK_CELL_RENDERER_PROGRESS (object); cellprogress->progress = g_value_get_double(value); g_free(cellprogress->text); cellprogress->text = g_strdup(g_value_get_string(value)); g_object_notify(object, "text"); cellprogress->text_set = g_value_get_boolean(value); G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); 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, calc_width = (gint) cell->xpad * 2 + 50; calc_height = (gint) cell->ypad * 2 + 12; *x_offset = cell->xalign * (cell_area->width - calc_width); *x_offset = MAX (*x_offset, 0); *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, GdkRectangle *background_area, GdkRectangle *expose_area, GaimGtkCellRendererProgress *cellprogress = (GaimGtkCellRendererProgress *) cell; width = cell_area->width; height = cell_area->height; if (GTK_WIDGET_HAS_FOCUS (widget)) state = GTK_STATE_ACTIVE; state = GTK_STATE_NORMAL; gtk_paint_box (widget->style, GTK_STATE_NORMAL, GTK_SHADOW_IN, cell_area->x + cell->xpad, cell_area->y + cell->ypad, gtk_paint_box (widget->style, cell_area->x + cell->xpad + 1, cell_area->y + cell->ypad + 1, (width - 3) * cellprogress->progress,