2 * Copyright (C) 2007 Raphael Slinckx <raphael@slinckx.net>
3 * Copyright (C) 2007-2009 Collabora Ltd.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 * Authors: Raphael Slinckx <raphael@slinckx.net>
20 * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
25 #include "empathy-utils.h"
27 #include "empathy-cell-renderer-activatable.h"
35 PROP_SHOW_ON_SELECT = 1
39 gboolean show_on_select;
40 } EmpathyCellRendererActivatablePriv;
42 static guint signals[LAST_SIGNAL];
44 G_DEFINE_TYPE (EmpathyCellRendererActivatable,
45 empathy_cell_renderer_activatable, GTK_TYPE_CELL_RENDERER_PIXBUF)
47 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCellRendererActivatable)
50 empathy_cell_renderer_activatable_init (EmpathyCellRendererActivatable *cell)
52 cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
53 EMPATHY_TYPE_CELL_RENDERER_ACTIVATABLE,
54 EmpathyCellRendererActivatablePriv);
59 "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
65 cell_renderer_activatable_get_property (GObject *object,
70 EmpathyCellRendererActivatablePriv *priv = GET_PRIV (object);
74 case PROP_SHOW_ON_SELECT:
75 g_value_set_boolean (value, priv->show_on_select);
78 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
84 cell_renderer_activatable_set_property (GObject *object,
89 EmpathyCellRendererActivatablePriv *priv = GET_PRIV (object);
93 case PROP_SHOW_ON_SELECT:
94 priv->show_on_select = g_value_get_boolean (value);
97 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
103 empathy_cell_renderer_activatable_new (void)
105 return g_object_new (EMPATHY_TYPE_CELL_RENDERER_ACTIVATABLE, NULL);
109 cell_renderer_activatable_activate (GtkCellRenderer *cell,
112 const gchar *path_string,
113 const GdkRectangle *background_area,
114 const GdkRectangle *cell_area,
115 GtkCellRendererState flags)
117 EmpathyCellRendererActivatable *activatable;
118 gint ex, ey, bx, by, bw, bh;
120 activatable = EMPATHY_CELL_RENDERER_ACTIVATABLE (cell);
122 if (!GTK_IS_TREE_VIEW (widget) || event == NULL ||
123 event->type != GDK_BUTTON_PRESS) {
127 ex = (gint) ((GdkEventButton *) event)->x;
128 ey = (gint) ((GdkEventButton *) event)->y;
129 bx = background_area->x;
130 by = background_area->y;
131 bw = background_area->width;
132 bh = background_area->height;
134 if (ex < bx || ex > (bx+bw) || ey < by || ey > (by+bh)){
135 /* Click wasn't on the icon */
139 g_signal_emit (activatable, signals[PATH_ACTIVATED], 0, path_string);
145 cell_renderer_activatable_render (
146 GtkCellRenderer *cell,
149 const GdkRectangle *background_area,
150 const GdkRectangle *cell_area,
151 GtkCellRendererState flags)
153 EmpathyCellRendererActivatablePriv *priv = GET_PRIV (cell);
155 if (priv->show_on_select && !(flags & (GTK_CELL_RENDERER_SELECTED)))
158 GTK_CELL_RENDERER_CLASS
159 (empathy_cell_renderer_activatable_parent_class)->render (
160 cell, cr, widget, background_area, cell_area, flags);
164 empathy_cell_renderer_activatable_class_init (
165 EmpathyCellRendererActivatableClass *klass)
167 GtkCellRendererClass *cell_class;
168 GObjectClass *oclass;
170 oclass = G_OBJECT_CLASS (klass);
171 oclass->get_property = cell_renderer_activatable_get_property;
172 oclass->set_property = cell_renderer_activatable_set_property;
174 cell_class = GTK_CELL_RENDERER_CLASS (klass);
175 cell_class->activate = cell_renderer_activatable_activate;
176 cell_class->render = cell_renderer_activatable_render;
178 signals[PATH_ACTIVATED] =
179 g_signal_new ("path-activated",
180 G_TYPE_FROM_CLASS (klass),
184 g_cclosure_marshal_generic,
188 g_object_class_install_property (oclass, PROP_SHOW_ON_SELECT,
189 g_param_spec_boolean ("show-on-select",
191 "Whether the cell renderer should be shown only when it's selected",
193 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
195 g_type_class_add_private (klass,
196 sizeof (EmpathyCellRendererActivatablePriv));