2
* Copyright (c) 2011 Red Hat, Inc.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or (at your
7
* option) any later version.
9
* This program is distributed in the hope that it will be useful, but
10
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of the GNU Lesser General Public License
15
* along with this program; if not, write to the Free Software Foundation,
16
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
* Author: Cosimo Cecchi <cosimoc@redhat.com>
22
#include "gd-toggle-pixbuf-renderer.h"
24
G_DEFINE_TYPE (GdTogglePixbufRenderer, gd_toggle_pixbuf_renderer, GTK_TYPE_CELL_RENDERER_PIXBUF);
32
static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
34
struct _GdTogglePixbufRendererPrivate {
36
gboolean toggle_visible;
40
gd_toggle_pixbuf_renderer_render (GtkCellRenderer *cell,
43
const GdkRectangle *background_area,
44
const GdkRectangle *cell_area,
45
GtkCellRendererState flags)
48
gint check_x, check_y, x_offset, xpad, ypad;
49
GtkStyleContext *context;
50
GdTogglePixbufRenderer *self = GD_TOGGLE_PIXBUF_RENDERER (cell);
51
GtkTextDirection direction;
53
GTK_CELL_RENDERER_CLASS (gd_toggle_pixbuf_renderer_parent_class)->render
55
background_area, cell_area, flags);
57
if (!self->priv->toggle_visible)
60
gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
61
direction = gtk_widget_get_direction (widget);
62
gtk_widget_style_get (widget,
63
"check-icon-size", &icon_size,
69
if (direction == GTK_TEXT_DIR_RTL)
72
x_offset = cell_area->width - icon_size - xpad;
74
check_x = cell_area->x + x_offset;
75
check_y = cell_area->y + cell_area->height - icon_size - ypad;
77
context = gtk_widget_get_style_context (widget);
78
gtk_style_context_save (context);
79
gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK);
81
if (self->priv->active)
82
gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
84
gtk_render_check (context, cr,
86
icon_size, icon_size);
88
gtk_style_context_restore (context);
92
gd_toggle_pixbuf_renderer_get_size (GtkCellRenderer *cell,
94
const GdkRectangle *cell_area,
102
gtk_widget_style_get (widget,
103
"check-icon-size", &icon_size,
106
GTK_CELL_RENDERER_CLASS (gd_toggle_pixbuf_renderer_parent_class)->get_size
107
(cell, widget, cell_area,
108
x_offset, y_offset, width, height);
110
*width += icon_size / 4;
114
gd_toggle_pixbuf_renderer_get_property (GObject *object,
119
GdTogglePixbufRenderer *self = GD_TOGGLE_PIXBUF_RENDERER (object);
124
g_value_set_boolean (value, self->priv->active);
126
case PROP_TOGGLE_VISIBLE:
127
g_value_set_boolean (value, self->priv->toggle_visible);
130
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
136
gd_toggle_pixbuf_renderer_set_property (GObject *object,
141
GdTogglePixbufRenderer *self = GD_TOGGLE_PIXBUF_RENDERER (object);
146
self->priv->active = g_value_get_boolean (value);
148
case PROP_TOGGLE_VISIBLE:
149
self->priv->toggle_visible = g_value_get_boolean (value);
152
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
158
gd_toggle_pixbuf_renderer_class_init (GdTogglePixbufRendererClass *klass)
160
GObjectClass *oclass = G_OBJECT_CLASS (klass);
161
GtkCellRendererClass *crclass = GTK_CELL_RENDERER_CLASS (klass);
163
crclass->render = gd_toggle_pixbuf_renderer_render;
164
crclass->get_size = gd_toggle_pixbuf_renderer_get_size;
165
oclass->get_property = gd_toggle_pixbuf_renderer_get_property;
166
oclass->set_property = gd_toggle_pixbuf_renderer_set_property;
168
properties[PROP_ACTIVE] =
169
g_param_spec_boolean ("active",
171
"Whether the cell renderer is active",
174
G_PARAM_STATIC_STRINGS);
175
properties[PROP_TOGGLE_VISIBLE] =
176
g_param_spec_boolean ("toggle-visible",
178
"Whether to draw the toggle indicator",
181
G_PARAM_STATIC_STRINGS);
183
g_type_class_add_private (klass, sizeof (GdTogglePixbufRendererPrivate));
184
g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
188
gd_toggle_pixbuf_renderer_init (GdTogglePixbufRenderer *self)
190
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_TOGGLE_PIXBUF_RENDERER,
191
GdTogglePixbufRendererPrivate);
195
gd_toggle_pixbuf_renderer_new (void)
197
return g_object_new (GD_TYPE_TOGGLE_PIXBUF_RENDERER, NULL);