1 /* GTK - The GIMP Toolkit
3 * Copyright (C) 2009 Matthias Clasen <mclasen@redhat.com>
4 * Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
5 * Copyright (C) 2009 Bastien Nocera <hadess@hadess.net>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
24 * Modified by the GTK+ Team and others 2007. See the AUTHORS
25 * file for a list of people on the GTK+ Team. See the ChangeLog
26 * files for a list of changes. These files are distributed with
27 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
34 #include "gtkcellrendererspinner.h"
44 struct _GtkCellRendererSpinnerPrivate
48 GtkIconSize icon_size, old_icon_size;
52 #define GTK_CELL_RENDERER_SPINNER_GET_PRIVATE(object) \
53 (G_TYPE_INSTANCE_GET_PRIVATE ((object), \
54 GTK_TYPE_CELL_RENDERER_SPINNER, \
55 GtkCellRendererSpinnerPrivate))
57 static void gtk_cell_renderer_spinner_get_property (GObject *object,
61 static void gtk_cell_renderer_spinner_set_property (GObject *object,
65 static void gtk_cell_renderer_spinner_get_size (GtkCellRenderer *cell,
67 GdkRectangle *cell_area,
72 static void gtk_cell_renderer_spinner_render (GtkCellRenderer *cell,
75 GdkRectangle *background_area,
76 GdkRectangle *cell_area,
77 GdkRectangle *expose_area,
80 G_DEFINE_TYPE (GtkCellRendererSpinner, gtk_cell_renderer_spinner, GTK_TYPE_CELL_RENDERER)
83 gtk_cell_renderer_spinner_class_init (GtkCellRendererSpinnerClass *klass)
85 GObjectClass *object_class = G_OBJECT_CLASS (klass);
86 GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass);
88 object_class->get_property = gtk_cell_renderer_spinner_get_property;
89 object_class->set_property = gtk_cell_renderer_spinner_set_property;
91 cell_class->get_size = gtk_cell_renderer_spinner_get_size;
92 cell_class->render = gtk_cell_renderer_spinner_render;
94 /* GtkCellRendererSpinner::active:
96 * Whether the spinner is active (ie. shown) in the cell
100 g_object_class_install_property (object_class,
102 g_param_spec_boolean ("active",
104 P_("Whether the spinner is active (ie. shown) in the cell"),
107 /* GtkCellRendererSpinner::pulse:
109 * Pulse of the spinner. Increment this value to draw the next frame of the spinner animation.
110 * Usually, you would update this value in a timeout, every 80 milliseconds to show a full
111 * animation within one second.
115 g_object_class_install_property (object_class,
117 g_param_spec_uint ("pulse",
119 P_("Pulse of the spinner"),
122 /* GtkCellRendererSpinner::size:
124 * The #GtkIconSize value that specifies the size of the rendered spinner.
128 g_object_class_install_property (object_class,
130 g_param_spec_enum ("size",
132 P_("The #GtkIconSize value that specifies the size of the rendered spinner"),
133 GTK_TYPE_ICON_SIZE, GTK_ICON_SIZE_MENU,
137 g_type_class_add_private (object_class, sizeof (GtkCellRendererSpinnerPrivate));
141 gtk_cell_renderer_spinner_init (GtkCellRendererSpinner *cell)
143 cell->priv = GTK_CELL_RENDERER_SPINNER_GET_PRIVATE (cell);
144 cell->priv->pulse = 0;
145 cell->priv->old_icon_size = GTK_ICON_SIZE_INVALID;
146 cell->priv->icon_size = GTK_ICON_SIZE_MENU;
150 * gtk_cell_renderer_spinner_new
152 * Returns a new cell renderer which will show a spinner to indicate
155 * Return value: a new #GtkCellRenderer
160 gtk_cell_renderer_spinner_new (void)
162 return g_object_new (GTK_TYPE_CELL_RENDERER_SPINNER, NULL);
166 gtk_cell_renderer_spinner_update_size (GtkCellRendererSpinner *cell,
169 GtkCellRendererSpinnerPrivate *priv = cell->priv;
171 GtkIconTheme *icon_theme;
172 GtkSettings *settings;
174 if (cell->priv->old_icon_size == cell->priv->icon_size)
177 screen = gtk_widget_get_screen (GTK_WIDGET (widget));
178 icon_theme = gtk_icon_theme_get_for_screen (screen);
179 settings = gtk_settings_get_for_screen (screen);
181 if (!gtk_icon_size_lookup_for_settings (settings, priv->icon_size, &priv->size, NULL))
183 g_warning ("Invalid icon size %u\n", priv->icon_size);
189 gtk_cell_renderer_spinner_get_property (GObject *object,
194 GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (object);
195 GtkCellRendererSpinnerPrivate *priv = cell->priv;
200 g_value_set_boolean (value, priv->active);
203 g_value_set_uint (value, priv->pulse);
206 g_value_set_enum (value, priv->icon_size);
209 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
214 gtk_cell_renderer_spinner_set_property (GObject *object,
219 GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (object);
220 GtkCellRendererSpinnerPrivate *priv = cell->priv;
225 priv->active = g_value_get_boolean (value);
228 priv->pulse = g_value_get_uint (value);
231 priv->old_icon_size = priv->icon_size;
232 priv->icon_size = g_value_get_enum (value);
235 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
240 gtk_cell_renderer_spinner_get_size (GtkCellRenderer *cellr,
242 GdkRectangle *cell_area,
248 GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (cellr);
249 GtkCellRendererSpinnerPrivate *priv = cell->priv;
253 gfloat xalign, yalign;
256 rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
258 gtk_cell_renderer_spinner_update_size (cell, widget);
272 align = rtl ? 1.0 - xalign : xalign;
273 *x_offset = align * (cell_area->width - w);
274 *x_offset = MAX (*x_offset, 0);
278 align = rtl ? 1.0 - yalign : yalign;
279 *y_offset = align * (cell_area->height - h);
280 *y_offset = MAX (*y_offset, 0);
298 gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
301 GdkRectangle *background_area,
302 GdkRectangle *cell_area,
303 GdkRectangle *expose_area,
306 GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (cellr);
307 GtkCellRendererSpinnerPrivate *priv = cell->priv;
309 GdkRectangle pix_rect;
310 GdkRectangle draw_rect;
316 gtk_cell_renderer_spinner_get_size (cellr, widget, cell_area,
317 &pix_rect.x, &pix_rect.y,
318 &pix_rect.width, &pix_rect.height);
324 pix_rect.x += cell_area->x + xpad;
325 pix_rect.y += cell_area->y + ypad;
326 pix_rect.width -= xpad * 2;
327 pix_rect.height -= ypad * 2;
329 if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect) ||
330 !gdk_rectangle_intersect (expose_area, &pix_rect, &draw_rect))
335 state = GTK_STATE_NORMAL;
336 if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE || !cellr->sensitive)
338 state = GTK_STATE_INSENSITIVE;
342 if ((flags & GTK_CELL_RENDERER_SELECTED) != 0)
344 if (GTK_WIDGET_HAS_FOCUS (widget))
345 state = GTK_STATE_SELECTED;
347 state = GTK_STATE_ACTIVE;
350 state = GTK_STATE_PRELIGHT;
353 gtk_paint_spinner (widget->style,
357 draw_rect.x, draw_rect.y,
358 draw_rect.width, draw_rect.height);
361 #define __GTK_CELL_RENDERER_SPINNER_C__
362 #include "gtkaliasdef.c"