Attachment 'gtk-simple-list-01-handle-toggle-renderers.diff'
Download 1 From 61455fd689d71d9f51f5e25cd2aa9aec1e0714ec Mon Sep 17 00:00:00 2001
2 From: Kristian Rietveld <kris@gtk.org>
3 Date: Sun, 21 Sep 2008 00:48:58 +0200
4 Subject: Implement default handling for toggle renderers; improve edited_callback().
5
6 ---
7 gtk/gtksimplelist.c | 144 ++++++++++++++++++++++++++++++++++++++++-------
8 tests/testsimplelist.c | 9 ++-
9 2 files changed, 128 insertions(+), 25 deletions(-)
10
11 diff --git a/gtk/gtksimplelist.c b/gtk/gtksimplelist.c
12 index c6cc688..f29f4ae 100644
13 --- a/gtk/gtksimplelist.c
14 +++ b/gtk/gtksimplelist.c
15 @@ -71,6 +71,14 @@ static void gtk_simple_list_row_activated (GtkTreeView *tree_view,
16 static void gtk_simple_list_selection_changed (GtkTreeSelection *selection,
17 gpointer user_data);
18
19 +/* default signal handlers for the convenience editable support */
20 +static void gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
21 + const gchar *path_string,
22 + const gchar *new_text,
23 + gpointer user_data);
24 +static void gtk_simple_list_toggled_callback (GtkCellRendererToggle *renderer,
25 + const gchar *path_string,
26 + gpointer user_data);
27
28 static guint simple_list_signals[LAST_SIGNAL] = { 0, };
29
30 @@ -337,6 +345,13 @@ gtk_simple_list_newv (int n_columns,
31 renderer,
32 attribute, i,
33 NULL);
34 +
35 + /* The toggle renderer is activatable by default, so we connect
36 + * our toggled callback here.
37 + */
38 + if (column_types[i] == GTK_SIMPLE_LIST_COLUMN_TOGGLE)
39 + g_signal_connect (renderer, "toggled",
40 + G_CALLBACK (gtk_simple_list_toggled_callback), list);
41 }
42
43 list->priv->n_columns = n_columns;
44 @@ -550,7 +565,6 @@ gtk_simple_list_get_row (GtkSimpleList *list,
45 int position,
46 ...)
47 {
48 - int i;
49 GtkTreeIter iter;
50 GtkTreeModel *model;
51 va_list args;
52 @@ -787,7 +801,7 @@ gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
53 {
54 GList *cells;
55
56 - cells = gtk_tree_view_column_get_cell_renderers (clist->data);
57 + cells = gtk_tree_view_column_get_cell_renderers (l->data);
58
59 if (cells->data == renderer)
60 {
61 @@ -798,7 +812,7 @@ gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
62 g_list_free (cells);
63 }
64
65 - g_return_if_fail (column <= list->priv->n_columns);
66 + g_return_if_fail (column < list->priv->n_columns);
67
68 path = gtk_tree_path_new_from_string (path_string);
69 gtk_tree_model_get_iter (model, &iter, path);
70 @@ -808,6 +822,102 @@ gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
71 column, new_text, -1);
72 }
73
74 +static void
75 +gtk_simple_list_set_text_editable (GtkSimpleList *list,
76 + GtkCellRendererText *celltext,
77 + gboolean editable)
78 +{
79 + gboolean is_editable;
80 +
81 + g_object_get (celltext, "editable", &is_editable, NULL);
82 + if (editable == !!is_editable)
83 + return;
84 +
85 + g_object_set (celltext, "editable", editable, NULL);
86 +
87 + if (editable)
88 + {
89 + g_signal_connect (celltext, "edited",
90 + G_CALLBACK (gtk_simple_list_edited_callback), list);
91 + }
92 + else
93 + {
94 + g_signal_handlers_disconnect_by_func (celltext,
95 + gtk_simple_list_edited_callback,
96 + list);
97 + }
98 +}
99 +
100 +static void
101 +gtk_simple_list_toggled_callback (GtkCellRendererToggle *renderer,
102 + const gchar *path_string,
103 + gpointer user_data)
104 +{
105 + int column = 0;
106 + gboolean active;
107 + GList *clist, *l;
108 + GtkTreeIter iter;
109 + GtkTreePath *path;
110 + GtkSimpleList *list;
111 + GtkTreeModel *model;
112 +
113 + list = GTK_SIMPLE_LIST (user_data);
114 + model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
115 +
116 + /* We need to find the column containing this renderer */
117 + clist = gtk_tree_view_get_columns (GTK_TREE_VIEW (user_data));
118 +
119 + for (l = clist; l; l = l->next, column++)
120 + {
121 + GList *cells;
122 +
123 + cells = gtk_tree_view_column_get_cell_renderers (l->data);
124 +
125 + if (cells->data == renderer)
126 + {
127 + g_list_free (cells);
128 + break;
129 + }
130 +
131 + g_list_free (cells);
132 + }
133 +
134 + g_return_if_fail (column < list->priv->n_columns);
135 +
136 + path = gtk_tree_path_new_from_string (path_string);
137 + gtk_tree_model_get_iter (model, &iter, path);
138 + gtk_tree_path_free (path);
139 +
140 + gtk_tree_model_get (model, &iter, column, &active, -1);
141 + gtk_list_store_set (GTK_LIST_STORE (model), &iter,
142 + column, !active, -1);
143 +}
144 +
145 +static void
146 +gtk_simple_list_set_toggle_editable (GtkSimpleList *list,
147 + GtkCellRendererToggle *celltoggle,
148 + gboolean editable)
149 +{
150 + gboolean is_activatable;
151 +
152 + g_object_get (celltoggle, "activatable", &is_activatable, NULL);
153 + if (editable == !!is_activatable)
154 + return;
155 +
156 + g_object_set (celltoggle, "activatable", editable, NULL);
157 +
158 + if (editable)
159 + {
160 + g_signal_connect (celltoggle, "toggled",
161 + G_CALLBACK (gtk_simple_list_toggled_callback), list);
162 + }
163 + else
164 + {
165 + g_signal_handlers_disconnect_by_func (celltoggle,
166 + gtk_simple_list_toggled_callback,
167 + list);
168 + }
169 +}
170
171 void
172 gtk_simple_list_column_set_editable (GtkSimpleList *list,
173 @@ -815,7 +925,6 @@ gtk_simple_list_column_set_editable (GtkSimpleList *list,
174 gboolean editable)
175 {
176 GList *cells;
177 - gboolean is_editable;
178 GtkCellRenderer *renderer;
179 GtkTreeViewColumn *column;
180
181 @@ -832,26 +941,17 @@ gtk_simple_list_column_set_editable (GtkSimpleList *list,
182 renderer = cells->data;
183 g_list_free (cells);
184
185 - if (!GTK_IS_CELL_RENDERER_TEXT (renderer))
186 - return;
187 -
188 - g_object_get (renderer, "editable", &is_editable, NULL);
189 - if (editable == !!is_editable)
190 - return;
191
192 - g_object_set (renderer, "editable", editable, NULL);
193 -
194 - if (editable)
195 - {
196 - g_signal_connect (renderer, "edited",
197 - G_CALLBACK (gtk_simple_list_edited_callback), list);
198 - }
199 + if (GTK_IS_CELL_RENDERER_TEXT (renderer))
200 + gtk_simple_list_set_text_editable (list,
201 + GTK_CELL_RENDERER_TEXT (renderer),
202 + editable);
203 + else if (GTK_IS_CELL_RENDERER_TOGGLE (renderer))
204 + gtk_simple_list_set_toggle_editable (list,
205 + GTK_CELL_RENDERER_TOGGLE (renderer),
206 + editable);
207 else
208 - {
209 - g_signal_handlers_disconnect_by_func (renderer,
210 - gtk_simple_list_edited_callback,
211 - list);
212 - }
213 + return;
214 }
215
216 void
217 diff --git a/tests/testsimplelist.c b/tests/testsimplelist.c
218 index 8e5426a..aba695e 100644
219 --- a/tests/testsimplelist.c
220 +++ b/tests/testsimplelist.c
221 @@ -37,10 +37,11 @@ main (int argc, char **argv)
222 GTK_ICON_SIZE_SMALL_TOOLBAR,
223 NULL);
224
225 - list = gtk_simple_list_new (3,
226 + list = gtk_simple_list_new (4,
227 GTK_SIMPLE_LIST_COLUMN_TEXT,
228 GTK_SIMPLE_LIST_COLUMN_INT,
229 - GTK_SIMPLE_LIST_COLUMN_PIXBUF);
230 + GTK_SIMPLE_LIST_COLUMN_PIXBUF,
231 + GTK_SIMPLE_LIST_COLUMN_TOGGLE);
232
233 gtk_simple_list_set_selection_mode (GTK_SIMPLE_LIST (list),
234 GTK_SELECTION_MULTIPLE);
235 @@ -54,7 +55,8 @@ main (int argc, char **argv)
236 gtk_simple_list_append_row (GTK_SIMPLE_LIST (list),
237 0, "Hoi", 1, 3, 2, pixbuf, -1);
238 gtk_simple_list_append_row (GTK_SIMPLE_LIST (list), 0, "Boe", 1, 2, -1);
239 - gtk_simple_list_append_row (GTK_SIMPLE_LIST (list), 0, "Bleh", 1, 5, -1);
240 + gtk_simple_list_append_row (GTK_SIMPLE_LIST (list),
241 + 0, "Bleh", 1, 5, 3, TRUE, -1);
242 gtk_simple_list_append_row (GTK_SIMPLE_LIST (list), 0, "Fooo", 1, 8, -1);
243 gtk_simple_list_append_row (GTK_SIMPLE_LIST (list),
244 0, "Bier", 1, 1, 2, pixbuf, -1);
245 @@ -63,6 +65,7 @@ main (int argc, char **argv)
246 gtk_simple_list_unselect_indices (GTK_SIMPLE_LIST (list), 2, 4, -1);
247
248 gtk_simple_list_column_set_editable (GTK_SIMPLE_LIST (list), 0, TRUE);
249 + gtk_simple_list_column_set_editable (GTK_SIMPLE_LIST (list), 3, TRUE);
250
251 g_signal_connect (list, "index-activated",
252 G_CALLBACK (index_activated_cb), NULL);
253 --
254 1.6.4
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.