1 /* Tree View/Editable Cells
3 * This demo demonstrates the use of editable cells in a GtkTreeView. If
4 * you're new to the GtkTreeView widgets and associates, look into
5 * the GtkListStore example first.
13 static GtkWidget *window = NULL;
31 static GArray *articles = NULL;
38 g_return_if_fail (articles != NULL);
41 foo.product = g_strdup ("bottles of coke");
43 g_array_append_vals (articles, &foo, 1);
46 foo.product = g_strdup ("packages of noodles");
48 g_array_append_vals (articles, &foo, 1);
51 foo.product = g_strdup ("packages of chocolate chip cookies");
53 g_array_append_vals (articles, &foo, 1);
56 foo.product = g_strdup ("can vanilla ice cream");
58 g_array_append_vals (articles, &foo, 1);
61 foo.product = g_strdup ("eggs");
63 g_array_append_vals (articles, &foo, 1);
74 articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
78 /* create list store */
79 model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
83 for (i = 0; i < articles->len; i++)
85 gtk_list_store_append (model, &iter);
87 gtk_list_store_set (model, &iter,
89 g_array_index (articles, Item, i).number,
91 g_array_index (articles, Item, i).product,
93 g_array_index (articles, Item, i).editable,
97 return GTK_TREE_MODEL (model);
101 add_item (GtkWidget *button, gpointer data)
105 GtkTreeModel *model = (GtkTreeModel *)data;
107 g_return_if_fail (articles != NULL);
110 foo.product = g_strdup ("Description here");
112 g_array_append_vals (articles, &foo, 1);
114 gtk_list_store_append (GTK_LIST_STORE (model), &iter);
115 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
116 COLUMN_NUMBER, foo.number,
117 COLUMN_PRODUCT, foo.product,
118 COLUMN_EDITABLE, foo.editable,
123 remove_item (GtkWidget *widget, gpointer data)
126 GtkTreeView *treeview = (GtkTreeView *)data;
127 GtkTreeModel *model = gtk_tree_view_get_model (treeview);
128 GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
130 if (gtk_tree_selection_get_selected (selection, NULL, &iter))
135 path = gtk_tree_model_get_path (model, &iter);
136 i = gtk_tree_path_get_indices (path)[0];
137 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
139 g_array_remove_index (articles, i);
141 gtk_tree_path_free (path);
146 cell_edited (GtkCellRendererText *cell,
147 const gchar *path_string,
148 const gchar *new_text,
151 GtkTreeModel *model = (GtkTreeModel *)data;
152 GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
157 column = g_object_get_data (G_OBJECT (cell), "column");
159 gtk_tree_model_get_iter (model, &iter, path);
161 switch ((gint) column)
167 i = gtk_tree_path_get_indices (path)[0];
168 g_array_index (articles, Item, i).number = atoi (new_text);
170 gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
171 g_array_index (articles, Item, i).number, -1);
180 gtk_tree_model_get (model, &iter, column, &old_text, -1);
183 i = gtk_tree_path_get_indices (path)[0];
184 g_free (g_array_index (articles, Item, i).product);
185 g_array_index (articles, Item, i).product = g_strdup (new_text);
187 gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
188 g_array_index (articles, Item, i).product, -1);
193 gtk_tree_path_free (path);
197 add_columns (GtkTreeView *treeview)
199 GtkCellRenderer *renderer;
200 GtkTreeModel *model = gtk_tree_view_get_model (treeview);
203 renderer = gtk_cell_renderer_text_new ();
204 g_signal_connect (G_OBJECT (renderer), "edited",
205 G_CALLBACK (cell_edited), model);
206 g_object_set_data (G_OBJECT (renderer), "column", (gint *)COLUMN_NUMBER);
208 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
209 -1, "Number", renderer,
210 "text", COLUMN_NUMBER,
211 "editable", COLUMN_EDITABLE,
215 renderer = gtk_cell_renderer_text_new ();
216 g_signal_connect (G_OBJECT (renderer), "edited",
217 G_CALLBACK (cell_edited), model);
218 g_object_set_data (G_OBJECT (renderer), "column", (gint *)COLUMN_PRODUCT);
220 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
221 -1, "Product", renderer,
222 "text", COLUMN_PRODUCT,
223 "editable", COLUMN_EDITABLE,
228 do_editable_cells (void)
239 /* create window, etc */
240 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
241 gtk_window_set_title (GTK_WINDOW (window), "Shopping list");
242 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
243 g_signal_connect (G_OBJECT (window), "destroy",
244 G_CALLBACK (gtk_widget_destroyed), &window);
246 vbox = gtk_vbox_new (FALSE, 5);
247 gtk_container_add (GTK_CONTAINER (window), vbox);
249 gtk_box_pack_start (GTK_BOX (vbox),
250 gtk_label_new ("Shopping list (you can edit the cells!)"),
253 sw = gtk_scrolled_window_new (NULL, NULL);
254 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
255 GTK_SHADOW_ETCHED_IN);
256 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
257 GTK_POLICY_AUTOMATIC,
258 GTK_POLICY_AUTOMATIC);
259 gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
262 model = create_model ();
264 /* create tree view */
265 treeview = gtk_tree_view_new_with_model (model);
266 g_object_unref (G_OBJECT (model));
267 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
268 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
269 GTK_SELECTION_SINGLE);
271 add_columns (GTK_TREE_VIEW (treeview));
273 gtk_container_add (GTK_CONTAINER (sw), treeview);
276 hbox = gtk_hbox_new (TRUE, 4);
277 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
279 button = gtk_button_new_with_label ("Add item");
280 g_signal_connect (G_OBJECT (button), "clicked",
281 G_CALLBACK (add_item), model);
282 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
284 button = gtk_button_new_with_label ("Remove item");
285 g_signal_connect (G_OBJECT (button), "clicked",
286 G_CALLBACK (remove_item), treeview);
287 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
289 gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
292 if (!GTK_WIDGET_VISIBLE (window))
293 gtk_widget_show_all (window);
296 gtk_widget_destroy (window);