1 /* gtkcellrenderertoggle.c
2 * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include <gtk/gtkcellrenderertoggle.h>
22 #include <gtk/gtksignal.h>
29 static void gtk_cell_renderer_toggle_get_param (GObject *object,
33 const gchar *trailer);
34 static void gtk_cell_renderer_toggle_set_param (GObject *object,
38 const gchar *trailer);
39 static void gtk_cell_renderer_toggle_init (GtkCellRendererToggle *celltext);
40 static void gtk_cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class);
41 static void gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
45 static void gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
48 GdkRectangle *background_area,
49 GdkRectangle *cell_area,
50 GdkRectangle *expose_area,
52 static gint gtk_cell_renderer_toggle_event (GtkCellRenderer *cell,
56 GdkRectangle *background_area,
57 GdkRectangle *cell_area,
73 #define TOGGLE_WIDTH 12
75 static guint toggle_cell_signals[LAST_SIGNAL] = { 0 };
79 gtk_cell_renderer_toggle_get_type (void)
81 static GtkType cell_toggle_type = 0;
83 if (!cell_toggle_type)
85 static const GTypeInfo cell_toggle_info =
87 sizeof (GtkCellRendererToggleClass),
89 NULL, /* base_finalize */
90 (GClassInitFunc) gtk_cell_renderer_toggle_class_init,
91 NULL, /* class_finalize */
92 NULL, /* class_data */
93 sizeof (GtkCellRendererToggle),
95 (GInstanceInitFunc) gtk_cell_renderer_toggle_init,
98 cell_toggle_type = g_type_register_static (GTK_TYPE_CELL_RENDERER, "GtkCellRendererToggle", &cell_toggle_info, 0);
101 return cell_toggle_type;
105 gtk_cell_renderer_toggle_init (GtkCellRendererToggle *celltoggle)
107 celltoggle->state = FALSE;
108 celltoggle->radio = FALSE;
109 GTK_CELL_RENDERER (celltoggle)->xpad = 2;
110 GTK_CELL_RENDERER (celltoggle)->ypad = 2;
114 gtk_cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class)
116 GObjectClass *object_class = G_OBJECT_CLASS (class);
117 GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (class);
119 object_class->get_param = gtk_cell_renderer_toggle_get_param;
120 object_class->set_param = gtk_cell_renderer_toggle_set_param;
122 cell_class->get_size = gtk_cell_renderer_toggle_get_size;
123 cell_class->render = gtk_cell_renderer_toggle_render;
124 cell_class->event = gtk_cell_renderer_toggle_event;
126 g_object_class_install_param (object_class,
128 g_param_spec_boolean ("state",
130 _("The toggle-state of the button."),
135 g_object_class_install_param (object_class,
137 g_param_spec_boolean ("radio",
139 _("Draw the toggle button as a radio button."),
145 toggle_cell_signals[TOGGLED] =
146 gtk_signal_new ("toggled",
148 GTK_CLASS_TYPE (object_class),
149 GTK_SIGNAL_OFFSET (GtkCellRendererToggleClass, toggled),
150 gtk_marshal_VOID__POINTER,
154 gtk_object_class_add_signals (GTK_OBJECT_CLASS (object_class), toggle_cell_signals, LAST_SIGNAL);
158 gtk_cell_renderer_toggle_get_param (GObject *object,
162 const gchar *trailer)
164 GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (object);
169 g_value_init (value, G_TYPE_BOOLEAN);
170 g_value_set_boolean (value, celltoggle->state);
173 g_value_init (value, G_TYPE_BOOLEAN);
174 g_value_set_boolean (value, celltoggle->radio);
183 gtk_cell_renderer_toggle_set_param (GObject *object,
187 const gchar *trailer)
189 GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (object);
194 celltoggle->state = g_value_get_boolean (value);
197 celltoggle->radio = g_value_get_boolean (value);
205 gtk_cell_renderer_toggle_new (void)
207 return GTK_CELL_RENDERER (gtk_type_new (gtk_cell_renderer_toggle_get_type ()));
211 gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
217 *width = (gint) cell->xpad * 2 + TOGGLE_WIDTH;
220 *height = (gint) cell->ypad * 2 + TOGGLE_WIDTH;
224 gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
227 GdkRectangle *background_area,
228 GdkRectangle *cell_area,
229 GdkRectangle *expose_area,
232 GtkCellRendererToggle *celltoggle = (GtkCellRendererToggle *) cell;
234 gint real_xoffset, real_yoffset;
236 width = MIN (TOGGLE_WIDTH, cell_area->width - cell->xpad * 2);
237 height = MIN (TOGGLE_WIDTH, cell_area->height - cell->ypad * 2);
239 if (width <= 0 || height <= 0)
242 real_xoffset = cell->xalign * (cell_area->width - width - (2 * cell->xpad));
243 real_xoffset = MAX (real_xoffset, 0) + cell->xpad;
244 real_yoffset = cell->yalign * (cell_area->height - height - (2 * cell->ypad));
245 real_yoffset = MAX (real_yoffset, 0) + cell->ypad;
247 gdk_gc_set_clip_rectangle (widget->style->black_gc, cell_area);
249 if (!celltoggle->radio)
251 gdk_draw_rectangle (window,
252 widget->style->black_gc,
254 cell_area->x + real_xoffset,
255 cell_area->y + real_yoffset,
257 if (celltoggle->state)
259 gdk_draw_line (window,
260 widget->style->black_gc,
261 cell_area->x + real_xoffset,
262 cell_area->y + real_yoffset,
263 cell_area->x + real_xoffset + width,
264 cell_area->y + real_yoffset + height);
265 gdk_draw_line (window,
266 widget->style->black_gc,
267 cell_area->x + real_xoffset + width,
268 cell_area->y + real_yoffset,
269 cell_area->x + real_xoffset,
270 cell_area->y + real_yoffset + height);
275 gdk_draw_arc (window,
276 widget->style->black_gc,
278 cell_area->x + real_xoffset,
279 cell_area->y + real_yoffset,
283 if (celltoggle->state)
285 gdk_draw_arc (window,
286 widget->style->black_gc,
288 cell_area->x + real_xoffset + 2,
289 cell_area->y + real_yoffset + 2,
297 gdk_gc_set_clip_rectangle (widget->style->black_gc, NULL);
301 gtk_cell_renderer_toggle_event (GtkCellRenderer *cell,
305 GdkRectangle *background_area,
306 GdkRectangle *cell_area,
309 gtk_signal_emit (GTK_OBJECT (cell), toggle_cell_signals[TOGGLED], path);
314 gtk_cell_renderer_toggle_set_radio (GtkCellRendererToggle *toggle,
317 g_return_if_fail (toggle != NULL);
318 g_return_if_fail (GTK_IS_CELL_RENDERER_TOGGLE (toggle));
320 toggle->radio = radio;