]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/list_store.c
Add a demo showing combo box variations.
[~andy/gtk] / demos / gtk-demo / list_store.c
1 /* Tree View/List Store
2  *
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.
7  *
8  */
9
10 #include <gtk/gtk.h>
11
12 static GtkWidget *window = NULL;
13
14 typedef struct
15 {
16   const gboolean  fixed;
17   const guint     number;
18   const gchar    *severity;
19   const gchar    *description;
20 }
21 Bug;
22
23 enum
24 {
25   COLUMN_FIXED,
26   COLUMN_NUMBER,
27   COLUMN_SEVERITY,
28   COLUMN_DESCRIPTION,
29   NUM_COLUMNS
30 };
31
32 static Bug data[] =
33 {
34   { FALSE, 60482, "Normal",     "scrollable notebooks and hidden tabs" },
35   { FALSE, 60620, "Critical",   "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" },
36   { FALSE, 50214, "Major",      "Xft support does not clean up correctly" },
37   { TRUE,  52877, "Major",      "GtkFileSelection needs a refresh method. " },
38   { FALSE, 56070, "Normal",     "Can't click button after setting in sensitive" },
39   { TRUE,  56355, "Normal",     "GtkLabel - Not all changes propagate correctly" },
40   { FALSE, 50055, "Normal",     "Rework width/height computations for TreeView" },
41   { FALSE, 58278, "Normal",     "gtk_dialog_set_response_sensitive () doesn't work" },
42   { FALSE, 55767, "Normal",     "Getters for all setters" },
43   { FALSE, 56925, "Normal",     "Gtkcalender size" },
44   { FALSE, 56221, "Normal",     "Selectable label needs right-click copy menu" },
45   { TRUE,  50939, "Normal",     "Add shift clicking to GtkTextView" },
46   { FALSE, 6112,  "Enhancement","netscape-like collapsable toolbars" },
47   { FALSE, 1,     "Normal",     "First bug :=)" },
48 };
49
50 static GtkTreeModel *
51 create_model (void)
52 {
53   gint i = 0;
54   GtkListStore *store;
55   GtkTreeIter iter;
56
57   /* create list store */
58   store = gtk_list_store_new (NUM_COLUMNS,
59                               G_TYPE_BOOLEAN,
60                               G_TYPE_UINT,
61                               G_TYPE_STRING,
62                               G_TYPE_STRING);
63
64   /* add data to the list store */
65   for (i = 0; i < G_N_ELEMENTS (data); i++)
66     {
67       gtk_list_store_append (store, &iter);
68       gtk_list_store_set (store, &iter,
69                           COLUMN_FIXED, data[i].fixed,
70                           COLUMN_NUMBER, data[i].number,
71                           COLUMN_SEVERITY, data[i].severity,
72                           COLUMN_DESCRIPTION, data[i].description,
73                           -1);
74     }
75
76   return GTK_TREE_MODEL (store);
77 }
78
79 static void
80 fixed_toggled (GtkCellRendererToggle *cell,
81                gchar                 *path_str,
82                gpointer               data)
83 {
84   GtkTreeModel *model = (GtkTreeModel *)data;
85   GtkTreeIter  iter;
86   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
87   gboolean fixed;
88
89   /* get toggled iter */
90   gtk_tree_model_get_iter (model, &iter, path);
91   gtk_tree_model_get (model, &iter, COLUMN_FIXED, &fixed, -1);
92
93   /* do something with the value */
94   fixed ^= 1;
95
96   /* set new value */
97   gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_FIXED, fixed, -1);
98
99   /* clean up */
100   gtk_tree_path_free (path);
101 }
102
103 static void
104 add_columns (GtkTreeView *treeview)
105 {
106   GtkCellRenderer *renderer;
107   GtkTreeViewColumn *column;
108   GtkTreeModel *model = gtk_tree_view_get_model (treeview);
109
110   /* column for fixed toggles */
111   renderer = gtk_cell_renderer_toggle_new ();
112   g_signal_connect (renderer, "toggled",
113                     G_CALLBACK (fixed_toggled), model);
114
115   column = gtk_tree_view_column_new_with_attributes ("Fixed?",
116                                                      renderer,
117                                                      "active", COLUMN_FIXED,
118                                                      NULL);
119
120   /* set this column to a fixed sizing (of 50 pixels) */
121   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
122                                    GTK_TREE_VIEW_COLUMN_FIXED);
123   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
124   gtk_tree_view_append_column (treeview, column);
125
126   /* column for bug numbers */
127   renderer = gtk_cell_renderer_text_new ();
128   column = gtk_tree_view_column_new_with_attributes ("Bug number",
129                                                      renderer,
130                                                      "text",
131                                                      COLUMN_NUMBER,
132                                                      NULL);
133   gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
134   gtk_tree_view_append_column (treeview, column);
135
136   /* column for severities */
137   renderer = gtk_cell_renderer_text_new ();
138   column = gtk_tree_view_column_new_with_attributes ("Severity",
139                                                      renderer,
140                                                      "text",
141                                                      COLUMN_SEVERITY,
142                                                      NULL);
143   gtk_tree_view_column_set_sort_column_id (column, COLUMN_SEVERITY);
144   gtk_tree_view_append_column (treeview, column);
145
146   /* column for description */
147   renderer = gtk_cell_renderer_text_new ();
148   column = gtk_tree_view_column_new_with_attributes ("Description",
149                                                      renderer,
150                                                      "text",
151                                                      COLUMN_DESCRIPTION,
152                                                      NULL);
153   gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESCRIPTION);
154   gtk_tree_view_append_column (treeview, column);
155 }
156
157 GtkWidget *
158 do_list_store (GtkWidget *do_widget)
159 {
160   if (!window)
161     {
162       GtkWidget *vbox;
163       GtkWidget *label;
164       GtkWidget *sw;
165       GtkTreeModel *model;
166       GtkWidget *treeview;
167
168       /* create window, etc */
169       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
170       gtk_window_set_screen (GTK_WINDOW (window),
171                              gtk_widget_get_screen (do_widget));
172       gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo");
173
174       g_signal_connect (window, "destroy",
175                         G_CALLBACK (gtk_widget_destroyed), &window);
176       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
177
178       vbox = gtk_vbox_new (FALSE, 8);
179       gtk_container_add (GTK_CONTAINER (window), vbox);
180
181       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).");
182       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
183
184       sw = gtk_scrolled_window_new (NULL, NULL);
185       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
186                                            GTK_SHADOW_ETCHED_IN);
187       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
188                                       GTK_POLICY_NEVER,
189                                       GTK_POLICY_AUTOMATIC);
190       gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
191
192       /* create tree model */
193       model = create_model ();
194
195       /* create tree view */
196       treeview = gtk_tree_view_new_with_model (model);
197       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
198       gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
199                                        COLUMN_DESCRIPTION);
200
201       g_object_unref (model);
202
203       gtk_container_add (GTK_CONTAINER (sw), treeview);
204
205       /* add columns to the tree view */
206       add_columns (GTK_TREE_VIEW (treeview));
207
208       /* finish & show */
209       gtk_window_set_default_size (GTK_WINDOW (window), 280, 250);
210     }
211
212   if (!GTK_WIDGET_VISIBLE (window))
213     gtk_widget_show_all (window);
214   else
215     {
216       gtk_widget_destroy (window);
217       window = NULL;
218     }
219
220   return window;
221 }