1 /*
2 * gtkcellrendererfile.c
3 *
4 * Copyright 2012 Alexander Petukhov <devel(at)apetukhov.ru>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 * MA 02110-1301, USA.
20 */
21
22 /*
23 * cell renderer that inherits from toggle
24 * the only difference - checks for a x position in "activate" signal
25 * to ensure the "toggled" signal is sent only when clicked on a particulary cell renderer
26 */
27
28 #include <geanyplugin.h>
29
30 #include "cellrenderertoggle.h"
31
32 struct _CellRendererToggle
33 {
34 GtkCellRendererToggle parent;
35 };
36
37 struct _CellRendererToggleClass
38 {
39 GtkCellRendererToggleClass parent_class;
40 };
41
42 /*
43 * handles an activation and sends a toggle signal is its cell renderer has been clicked
44 */
45 #if GTK_CHECK_VERSION(3, 0, 0)
cell_renderer_toggle_activate(GtkCellRenderer * cell,GdkEvent * event,GtkWidget * widget,const gchar * path,const GdkRectangle * background_area,const GdkRectangle * cell_area,GtkCellRendererState flags)46 static gint cell_renderer_toggle_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
47 const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags)
48 #else
49 static gint cell_renderer_toggle_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
50 GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState flags)
51 #endif
52 {
53 if (!event ||
54 (
55 event->button.x >= cell_area->x &&
56 event->button.x < (cell_area->x + cell_area->width)
57 )
58 )
59 {
60 g_signal_emit_by_name(cell, "toggled", path);
61 }
62 return TRUE;
63 }
64
65 /*
66 * instance init
67 */
cell_renderer_toggle_init(CellRendererToggle * cell)68 static void cell_renderer_toggle_init (CellRendererToggle *cell)
69 {
70 GtkCellRenderer *cell_renderer = (GtkCellRenderer*)cell;
71 g_object_set(cell_renderer, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
72 }
73
74 /*
75 * class init
76 */
cell_renderer_toggle_class_init(GtkCellRendererToggleClass * class)77 static void cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class)
78 {
79 GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(class);
80 cell_class->activate = cell_renderer_toggle_activate;
81 }
82
83 /*
84 * registers a type
85 */
cell_renderer_toggle_get_type(void)86 GType cell_renderer_toggle_get_type(void)
87 {
88 static GType cell_break_toggle_type = 0;
89
90 if(0 == cell_break_toggle_type && !(cell_break_toggle_type = g_type_from_name("CellRendererToggle")))
91 {
92 static const GTypeInfo cell_file_info =
93 {
94 sizeof (CellRendererToggleClass),
95 NULL, /* base_init */
96 NULL, /* base_finalize */
97 (GClassInitFunc) cell_renderer_toggle_class_init,
98 NULL, /* class_finalize */
99 NULL, /* class_data */
100 sizeof (CellRendererToggle),
101 0, /* n_preallocs */
102 (GInstanceInitFunc) cell_renderer_toggle_init,
103 };
104
105 /* Derive from GtkToggleCellRenderer */
106 cell_break_toggle_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TOGGLE,
107 "CellRendererToggle",
108 &cell_file_info,
109 0);
110 }
111
112 return cell_break_toggle_type;
113 }
114
115 /*
116 * creates new renderer
117 */
cell_renderer_toggle_new(void)118 GtkCellRenderer* cell_renderer_toggle_new(void)
119 {
120 return g_object_new(TYPE_CELL_RENDERER_TOGGLE, NULL);
121 }
122