]> Pileus Git - ~andy/gtk/blob - tests/testcombo.c
b666b9401184509b4c7a21419fbc4c0b7465d76e
[~andy/gtk] / tests / testcombo.c
1 #include <config.h>
2 #include <gtk/gtk.h>
3 #include <gtk/gtkcellview.h>
4
5 #include <string.h>
6 #include <stdio.h>
7
8 /**
9  * oh yes, this test app surely has a lot of ugly code
10  */
11
12 /* grid combo demo */
13 static GdkPixbuf *
14 create_color_pixbuf (const char *color)
15 {
16         GdkPixbuf *pixbuf;
17         GdkColor col;
18
19         int x;
20         int num;
21         int rowstride;
22         guchar *pixels, *p;
23
24         if (!gdk_color_parse (color, &col))
25                 return NULL;
26
27         pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
28                                  FALSE, 8,
29                                  16, 16);
30
31         rowstride = gdk_pixbuf_get_rowstride (pixbuf);
32         p = pixels = gdk_pixbuf_get_pixels (pixbuf);
33
34         num = gdk_pixbuf_get_width (pixbuf) *
35                 gdk_pixbuf_get_height (pixbuf);
36
37         for (x = 0; x < num; x++) {
38                 p[0] = col.red / 65535 * 255;
39                 p[1] = col.green / 65535 * 255;
40                 p[2] = col.blue / 65535 * 255;
41                 p += 3;
42         }
43
44         return pixbuf;
45 }
46
47 static GtkWidget *
48 create_combo_box_grid_demo ()
49 {
50         GtkWidget *combo;
51         GtkTreeIter iter;
52         GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
53         GtkListStore *store;
54
55         store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
56
57         combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
58         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
59                                     cell, TRUE);
60         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo),
61                                         cell, "pixbuf", 0, NULL);
62         gtk_combo_box_set_wrap_width (GTK_COMBO_BOX (combo),
63                                       3);
64
65         /* first row */
66         gtk_list_store_append (store, &iter);
67         gtk_list_store_set (store, &iter,
68                             0, create_color_pixbuf ("red"),
69                             -1);
70
71         gtk_list_store_append (store, &iter);
72         gtk_list_store_set (store, &iter,
73                             0, create_color_pixbuf ("green"),
74                             -1);
75
76         gtk_list_store_append (store, &iter);
77         gtk_list_store_set (store, &iter,
78                             0, create_color_pixbuf ("blue"),
79                             -1);
80
81         /* second row */
82         gtk_list_store_append (store, &iter);
83         gtk_list_store_set (store, &iter,
84                             0, create_color_pixbuf ("yellow"),
85                             -1);
86
87         gtk_list_store_append (store, &iter);
88         gtk_list_store_set (store, &iter,
89                             0, create_color_pixbuf ("black"),
90                             -1);
91
92         gtk_list_store_append (store, &iter);
93         gtk_list_store_set (store, &iter,
94                             0, create_color_pixbuf ("white"),
95                             -1);
96
97         /* third row */
98         gtk_list_store_append (store, &iter);
99         gtk_list_store_set (store, &iter,
100                             0, create_color_pixbuf ("gray"),
101                             -1);
102
103         gtk_list_store_append (store, &iter);
104         gtk_list_store_set (store, &iter,
105                             0, create_color_pixbuf ("snow"),
106                             -1);
107
108         gtk_list_store_append (store, &iter);
109         gtk_list_store_set (store, &iter,
110                             0, create_color_pixbuf ("magenta"),
111                             -1);
112
113         g_object_unref (store);
114
115         gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
116
117         return combo;
118 }
119
120 /* blaat */
121 static GtkTreeModel *
122 create_blaat ()
123 {
124         GdkPixbuf *pixbuf;
125         GtkWidget *cellview;
126         GtkTreeIter iter;
127         GtkListStore *store;
128
129         cellview = gtk_cell_view_new ();
130
131         store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
132
133         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
134                                          GTK_ICON_SIZE_BUTTON, NULL);
135         gtk_list_store_append (store, &iter);
136         gtk_list_store_set (store, &iter,
137                             0, pixbuf,
138                             1, "gtk-stock-dialog-warning",
139                             -1);
140
141         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_STOP,
142                                          GTK_ICON_SIZE_BUTTON, NULL);
143         gtk_list_store_append (store, &iter);
144         gtk_list_store_set (store, &iter,
145                             0, pixbuf,
146                             1, "gtk-stock-stop",
147                             -1);
148
149         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_NEW,
150                                          GTK_ICON_SIZE_BUTTON, NULL);
151         gtk_list_store_append (store, &iter);
152         gtk_list_store_set (store, &iter,
153                             0, pixbuf,
154                             1, "gtk-stock-new",
155                             -1);
156
157         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_CLEAR,
158                                          GTK_ICON_SIZE_BUTTON, NULL);
159         gtk_list_store_append (store, &iter);
160         gtk_list_store_set (store, &iter,
161                             0, pixbuf,
162                             1, "gtk-stock-clear",
163                             -1);
164
165         gtk_list_store_append (store, &iter);
166         gtk_list_store_set (store, &iter,
167                             0, NULL,
168                             1, "separator",
169                             -1);
170
171         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_OPEN,
172                                          GTK_ICON_SIZE_BUTTON, NULL);
173         gtk_list_store_append (store, &iter);
174         gtk_list_store_set (store, &iter,
175                             0, pixbuf,
176                             1, "gtk-stock-open",
177                             -1);
178
179         gtk_widget_destroy (cellview);
180
181         return GTK_TREE_MODEL (store);
182 }
183
184 static void
185 setup_combo_entry (GtkWidget *entry_box)
186 {
187         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
188                                    "dum de dum");
189         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
190                                    "la la la");
191         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
192                                    "la la la dum de dum la la la la la la boom de da la la");
193         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
194                                    "bloop");
195         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
196                                    "bleep");
197         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
198                                    "klaas");
199 }
200
201 static void
202 set_sensitive (GtkCellLayout   *cell_layout,
203                GtkCellRenderer *cell,
204                GtkTreeModel    *tree_model,
205                GtkTreeIter     *iter,
206                gpointer         data)
207 {
208   GtkTreePath *path;
209   gint *indices;
210   gboolean sensitive;
211
212   path = gtk_tree_model_get_path (tree_model, iter);
213   indices = gtk_tree_path_get_indices (path);
214   sensitive = indices[0] != 1;
215   gtk_tree_path_free (path);
216
217   g_object_set (cell, "sensitive", sensitive, NULL);
218 }
219
220 static gboolean
221 is_separator (GtkTreeModel *model,
222               GtkTreeIter  *iter,
223               gpointer      data)
224 {
225   GtkTreePath *path;
226   gboolean result;
227
228   path = gtk_tree_model_get_path (model, iter);
229   result = gtk_tree_path_get_indices (path)[0] == 4;
230   gtk_tree_path_free (path);
231
232   return result;
233   
234 }
235
236 int
237 main (int argc, char **argv)
238 {
239         GtkWidget *window, *cellview, *mainbox;
240         GtkWidget *combobox, *comboboxtext, *comboboxgrid;
241         GtkWidget *tmp, *boom;
242         GtkCellRenderer *renderer;
243         GdkPixbuf *pixbuf;
244         GtkTreeModel *model;
245         GValue value = {0, };
246
247         gtk_init (&argc, &argv);
248
249         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
250         gtk_container_set_border_width (GTK_CONTAINER (window), 5);
251         g_signal_connect (window, "destroy", gtk_main_quit, NULL);
252
253         mainbox = gtk_vbox_new (FALSE, 2);
254         gtk_container_add (GTK_CONTAINER (window), mainbox);
255
256
257         /* GtkCellView */
258         tmp = gtk_frame_new ("GtkCellView");
259         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
260
261         boom = gtk_vbox_new (FALSE, 0);
262         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
263         gtk_container_add (GTK_CONTAINER (tmp), boom);
264
265         cellview = gtk_cell_view_new ();
266         renderer = gtk_cell_renderer_pixbuf_new ();
267         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
268                                          GTK_ICON_SIZE_BUTTON, NULL);
269
270         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
271                                     renderer,
272                                     FALSE);
273         g_value_init (&value, GDK_TYPE_PIXBUF);
274         g_value_set_instance (&value, pixbuf);
275         gtk_cell_view_set_values (GTK_CELL_VIEW (cellview),
276                                   renderer,
277                                   "pixbuf", &value,
278                                   NULL);
279         g_value_unset (&value);
280
281         renderer = gtk_cell_renderer_text_new ();
282         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
283                                     renderer,
284                                     TRUE);
285         g_value_init (&value, G_TYPE_STRING);
286         g_value_set_string (&value, "la la la");
287         gtk_cell_view_set_values (GTK_CELL_VIEW (cellview),
288                                   renderer,
289                                   "text", &value,
290                                   NULL);
291         g_value_unset (&value);
292         gtk_container_add (GTK_CONTAINER (boom), cellview);
293
294
295         /* GtkComboBox */
296         tmp = gtk_frame_new ("GtkComboBox");
297         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
298
299         boom = gtk_vbox_new (FALSE, 0);
300         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
301         gtk_container_add (GTK_CONTAINER (tmp), boom);
302
303         model = create_blaat ();
304         combobox = gtk_combo_box_new_with_model (model);
305         g_object_unref (model);
306         gtk_container_add (GTK_CONTAINER (boom), combobox);
307
308         renderer = gtk_cell_renderer_pixbuf_new ();
309         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
310                                     renderer,
311                                     FALSE);
312         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
313                                         "pixbuf", 0,
314                                         NULL);
315         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
316                                             renderer,
317                                             set_sensitive,
318                                             NULL, NULL);
319
320         renderer = gtk_cell_renderer_text_new ();
321         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
322                                     renderer,
323                                     TRUE);
324         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
325                                         "text", 1,
326                                         NULL);
327         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
328                                             renderer,
329                                             set_sensitive,
330                                             NULL, NULL);
331         gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
332                                               is_separator, NULL, NULL);
333                                                 
334         gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
335
336
337         /* GtkComboBox (grid mode) */
338         tmp = gtk_frame_new ("GtkComboBox (grid mode)");
339         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
340
341         boom = gtk_vbox_new (FALSE, 0);
342         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
343         gtk_container_add (GTK_CONTAINER (tmp), boom);
344
345         comboboxgrid = create_combo_box_grid_demo ();
346         gtk_box_pack_start (GTK_BOX (boom), comboboxgrid, FALSE, FALSE, 0);
347
348
349         /* GtkComboBoxEntry */
350         tmp = gtk_frame_new ("GtkComboBoxEntry");
351         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
352
353         boom = gtk_vbox_new (FALSE, 0);
354         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
355         gtk_container_add (GTK_CONTAINER (tmp), boom);
356
357         comboboxtext = gtk_combo_box_entry_new_text ();
358         setup_combo_entry (comboboxtext);
359         gtk_container_add (GTK_CONTAINER (boom), comboboxtext);
360
361         /* done */
362         gtk_widget_show_all (window);
363
364         gtk_main ();
365
366         return 0;
367 }
368
369 /* vim:expandtab
370  */