1 /* Tree View/List Store
3 * The GtkListStore is used to store data in list form, to be used
4 * later on by a GtkTreeView to display it. This demo builds a
5 * simple GtkListStore and displays it. See the Stock Browser
6 * demo for a more advanced example.
12 static GtkWidget *window = NULL;
13 static GtkTreeModel *model = NULL;
14 static guint timeout = 0;
20 const gchar *severity;
21 const gchar *description;
40 { FALSE, 60482, "Normal", "scrollable notebooks and hidden tabs" },
41 { FALSE, 60620, "Critical", "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" },
42 { FALSE, 50214, "Major", "Xft support does not clean up correctly" },
43 { TRUE, 52877, "Major", "GtkFileSelection needs a refresh method. " },
44 { FALSE, 56070, "Normal", "Can't click button after setting in sensitive" },
45 { TRUE, 56355, "Normal", "GtkLabel - Not all changes propagate correctly" },
46 { FALSE, 50055, "Normal", "Rework width/height computations for TreeView" },
47 { FALSE, 58278, "Normal", "gtk_dialog_set_response_sensitive () doesn't work" },
48 { FALSE, 55767, "Normal", "Getters for all setters" },
49 { FALSE, 56925, "Normal", "Gtkcalender size" },
50 { FALSE, 56221, "Normal", "Selectable label needs right-click copy menu" },
51 { TRUE, 50939, "Normal", "Add shift clicking to GtkTextView" },
52 { FALSE, 6112, "Enhancement","netscape-like collapsable toolbars" },
53 { FALSE, 1, "Normal", "First bug :=)" },
57 spinner_timeout (gpointer data)
65 gtk_tree_model_get_iter_first (model, &iter);
66 gtk_tree_model_get (model, &iter,
69 if (pulse == G_MAXUINT)
74 gtk_list_store_set (GTK_LIST_STORE (model),
90 /* create list store */
91 store = gtk_list_store_new (NUM_COLUMNS,
101 /* add data to the list store */
102 for (i = 0; i < G_N_ELEMENTS (data); i++)
107 if (i == 1 || i == 3)
108 icon_name = "battery-critical-charging-symbolic";
115 gtk_list_store_append (store, &iter);
116 gtk_list_store_set (store, &iter,
117 COLUMN_FIXED, data[i].fixed,
118 COLUMN_NUMBER, data[i].number,
119 COLUMN_SEVERITY, data[i].severity,
120 COLUMN_DESCRIPTION, data[i].description,
122 COLUMN_ICON, icon_name,
123 COLUMN_ACTIVE, FALSE,
124 COLUMN_SENSITIVE, sensitive,
128 return GTK_TREE_MODEL (store);
132 fixed_toggled (GtkCellRendererToggle *cell,
136 GtkTreeModel *model = (GtkTreeModel *)data;
138 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
141 /* get toggled iter */
142 gtk_tree_model_get_iter (model, &iter, path);
143 gtk_tree_model_get (model, &iter, COLUMN_FIXED, &fixed, -1);
145 /* do something with the value */
149 gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_FIXED, fixed, -1);
152 gtk_tree_path_free (path);
156 add_columns (GtkTreeView *treeview)
158 GtkCellRenderer *renderer;
159 GtkTreeViewColumn *column;
160 GtkTreeModel *model = gtk_tree_view_get_model (treeview);
162 /* column for fixed toggles */
163 renderer = gtk_cell_renderer_toggle_new ();
164 g_signal_connect (renderer, "toggled",
165 G_CALLBACK (fixed_toggled), model);
167 column = gtk_tree_view_column_new_with_attributes ("Fixed?",
169 "active", COLUMN_FIXED,
172 /* set this column to a fixed sizing (of 50 pixels) */
173 gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
174 GTK_TREE_VIEW_COLUMN_FIXED);
175 gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
176 gtk_tree_view_append_column (treeview, column);
178 /* column for bug numbers */
179 renderer = gtk_cell_renderer_text_new ();
180 column = gtk_tree_view_column_new_with_attributes ("Bug number",
185 gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
186 gtk_tree_view_append_column (treeview, column);
188 /* column for severities */
189 renderer = gtk_cell_renderer_text_new ();
190 column = gtk_tree_view_column_new_with_attributes ("Severity",
195 gtk_tree_view_column_set_sort_column_id (column, COLUMN_SEVERITY);
196 gtk_tree_view_append_column (treeview, column);
198 /* column for description */
199 renderer = gtk_cell_renderer_text_new ();
200 column = gtk_tree_view_column_new_with_attributes ("Description",
205 gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESCRIPTION);
206 gtk_tree_view_append_column (treeview, column);
208 /* column for spinner */
209 renderer = gtk_cell_renderer_spinner_new ();
210 column = gtk_tree_view_column_new_with_attributes ("Spinning",
217 gtk_tree_view_column_set_sort_column_id (column, COLUMN_PULSE);
218 gtk_tree_view_append_column (treeview, column);
220 /* column for symbolic icon */
221 renderer = gtk_cell_renderer_pixbuf_new ();
222 g_object_set (G_OBJECT (renderer), "follow-state", TRUE, NULL);
223 column = gtk_tree_view_column_new_with_attributes ("Symbolic icon",
230 gtk_tree_view_column_set_sort_column_id (column, COLUMN_ICON);
231 gtk_tree_view_append_column (treeview, column);
235 window_closed (GtkWidget *widget,
243 g_source_remove (timeout);
250 do_list_store (GtkWidget *do_widget)
259 /* create window, etc */
260 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
261 gtk_window_set_screen (GTK_WINDOW (window),
262 gtk_widget_get_screen (do_widget));
263 gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo");
265 g_signal_connect (window, "destroy",
266 G_CALLBACK (gtk_widget_destroyed), &window);
267 gtk_container_set_border_width (GTK_CONTAINER (window), 8);
269 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
270 gtk_container_add (GTK_CONTAINER (window), vbox);
272 label = gtk_label_new ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though).");
273 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
275 sw = gtk_scrolled_window_new (NULL, NULL);
276 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
277 GTK_SHADOW_ETCHED_IN);
278 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
280 GTK_POLICY_AUTOMATIC);
281 gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
283 /* create tree model */
284 model = create_model ();
286 /* create tree view */
287 treeview = gtk_tree_view_new_with_model (model);
288 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
289 gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
292 g_object_unref (model);
294 gtk_container_add (GTK_CONTAINER (sw), treeview);
296 /* add columns to the tree view */
297 add_columns (GTK_TREE_VIEW (treeview));
300 gtk_window_set_default_size (GTK_WINDOW (window), 280, 250);
301 g_signal_connect (window, "delete-event",
302 G_CALLBACK (window_closed), NULL);
305 if (!gtk_widget_get_visible (window))
307 gtk_widget_show_all (window);
309 /* FIXME this should use the animation-duration instead */
310 timeout = g_timeout_add (80, spinner_timeout, NULL);
315 gtk_widget_destroy (window);
319 g_source_remove (timeout);