1 /* Stock Item/Icon Browser
3 * This source code for this demo doesn't demonstrate anything
4 * particularly useful in applications, it just lets you scan the
5 * available stock icons and stock items.
10 static GtkWidget *window = NULL;
12 typedef struct _StockItemInfo StockItemInfo;
17 GdkPixbuf *small_icon;
22 /* Make StockItemInfo a boxed type so we can automatically
25 #define STOCK_ITEM_INFO_TYPE stock_item_info_get_type ()
28 stock_item_info_free (StockItemInfo *info)
32 g_free (info->accel_str);
34 g_object_unref (G_OBJECT (info->small_icon));
40 stock_item_info_copy (StockItemInfo *src)
44 info = g_new (StockItemInfo, 1);
45 info->id = g_strdup (src->id);
46 info->macro = g_strdup (src->macro);
47 info->accel_str = g_strdup (src->accel_str);
49 info->item = src->item;
51 info->small_icon = src->small_icon;
53 g_object_ref (G_OBJECT (info->small_icon));
59 stock_item_info_get_type (void)
61 static GType our_type = 0;
64 our_type = g_boxed_type_register_static ("StockItemInfo",
66 (GBoxedCopyFunc) stock_item_info_copy,
67 (GBoxedFreeFunc) stock_item_info_free,
73 typedef struct _StockItemDisplay StockItemDisplay;
74 struct _StockItemDisplay
76 GtkWidget *type_label;
77 GtkWidget *macro_label;
79 GtkWidget *label_accel_label;
80 GtkWidget *icon_image;
83 /* columns in the tree model */
92 id_to_macro (const gchar *id)
98 /* gtk-foo -> GTK_STOCK_FOO */
101 while (*cp && *cp != '-')
105 return g_strdup ("??UNKNOWN??");
107 macro = g_string_new (NULL);
109 g_string_append_len (macro, id, cp - id);
111 g_string_append (macro, "_STOCK");
112 g_string_append (macro, cp);
122 g_strup (macro->str);
124 return g_string_free (macro, FALSE);
134 store = gtk_list_store_new_with_types (1, STOCK_ITEM_INFO_TYPE);
136 ids = gtk_stock_list_ids ();
138 while (tmp_list != NULL)
143 GtkIconSet *icon_set;
145 info.id = tmp_list->data;
147 if (gtk_stock_lookup (info.id, &item))
153 info.item.label = NULL;
154 info.item.stock_id = NULL;
155 info.item.modifier = 0;
156 info.item.keyval = 0;
157 info.item.translation_domain = NULL;
160 /* only show icons for stock IDs that have default icons */
161 icon_set = gtk_icon_factory_lookup_default (info.id);
164 GtkIconSize *sizes = NULL;
169 /* See what sizes this stock icon really exists at */
170 gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes);
172 /* Use menu size if it exists, otherwise first size found */
177 if (sizes[i] == GTK_ICON_SIZE_MENU)
179 size = GTK_ICON_SIZE_MENU;
186 info.small_icon = gtk_widget_render_icon (window, info.id,
190 if (size != GTK_ICON_SIZE_MENU)
192 /* Make the result the proper size for our thumbnail */
196 gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
198 scaled = gdk_pixbuf_scale_simple (info.small_icon,
200 GDK_INTERP_BILINEAR);
202 g_object_unref (G_OBJECT (info.small_icon));
203 info.small_icon = scaled;
207 info.small_icon = NULL;
209 if (info.item.keyval != 0)
211 info.accel_str = gtk_accelerator_name (info.item.keyval,
216 info.accel_str = g_strdup ("");
219 info.macro = id_to_macro (info.id);
221 gtk_list_store_append (store, &iter);
222 gtk_list_store_set (store, &iter, 0, &info, -1);
225 g_free (info.accel_str);
227 g_object_unref (G_OBJECT (info.small_icon));
229 tmp_list = g_slist_next (tmp_list);
232 g_slist_foreach (ids, (GFunc)g_free, NULL);
235 return GTK_TREE_MODEL (store);
239 selection_changed (GtkTreeSelection *selection)
241 GtkTreeView *treeview;
242 StockItemDisplay *display;
246 treeview = gtk_tree_selection_get_tree_view (selection);
247 display = g_object_get_data (G_OBJECT (treeview), "stock-display");
249 if (gtk_tree_selection_get_selected (selection, &model, &iter))
254 gtk_tree_model_get (model, &iter,
258 if (info->small_icon && info->item.label)
259 gtk_label_set_text (GTK_LABEL (display->type_label), "Icon and Item");
260 else if (info->small_icon)
261 gtk_label_set_text (GTK_LABEL (display->type_label), "Icon Only");
262 else if (info->item.label)
263 gtk_label_set_text (GTK_LABEL (display->type_label), "Item Only");
265 gtk_label_set_text (GTK_LABEL (display->type_label), "???????");
267 gtk_label_set_text (GTK_LABEL (display->macro_label), info->macro);
268 gtk_label_set_text (GTK_LABEL (display->id_label), info->id);
270 if (info->item.label)
272 str = g_strdup_printf ("%s %s", info->item.label, info->accel_str);
273 gtk_label_set_text_with_mnemonic (GTK_LABEL (display->label_accel_label), str);
278 gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
281 /* The problem here is that some icons don't have SIZE_LARGE_TOOLBAR,
282 * so we get a "missing image" icon...
284 if (info->small_icon)
285 gtk_image_set_from_stock (GTK_IMAGE (display->icon_image), info->id,
286 GTK_ICON_SIZE_LARGE_TOOLBAR);
288 gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
290 stock_item_info_free (info);
294 gtk_label_set_text (GTK_LABEL (display->type_label), "No selected item");
295 gtk_label_set_text (GTK_LABEL (display->macro_label), "");
296 gtk_label_set_text (GTK_LABEL (display->id_label), "");
297 gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
298 gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
303 macro_set_func (GtkTreeViewColumn *tree_column,
304 GtkCellRenderer *cell,
311 gtk_tree_model_get (model, iter,
315 g_object_set (GTK_CELL_RENDERER (cell),
317 "pixbuf", info->small_icon,
320 stock_item_info_free (info);
324 id_set_func (GtkTreeViewColumn *tree_column,
325 GtkCellRenderer *cell,
332 gtk_tree_model_get (model, iter,
336 g_object_set (GTK_CELL_RENDERER (cell),
340 stock_item_info_free (info);
344 accel_set_func (GtkTreeViewColumn *tree_column,
345 GtkCellRenderer *cell,
352 gtk_tree_model_get (model, iter,
356 g_object_set (GTK_CELL_RENDERER (cell),
357 "text", info->accel_str,
360 stock_item_info_free (info);
364 label_set_func (GtkTreeViewColumn *tree_column,
365 GtkCellRenderer *cell,
372 gtk_tree_model_get (model, iter,
376 g_object_set (GTK_CELL_RENDERER (cell),
377 "text", info->item.label,
380 stock_item_info_free (info);
384 do_stock_browser (void)
395 GtkCellRenderer *cell_renderer;
396 StockItemDisplay *display;
397 GtkTreeSelection *selection;
399 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
400 gtk_window_set_title (GTK_WINDOW (window), "Stock Icons and Items");
402 gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
403 gtk_container_set_border_width (GTK_CONTAINER (window), 8);
405 hbox = gtk_hbox_new (FALSE, 8);
406 gtk_container_add (GTK_CONTAINER (window), hbox);
408 sw = gtk_scrolled_window_new (NULL, NULL);
409 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
411 GTK_POLICY_AUTOMATIC);
412 gtk_box_pack_start (GTK_BOX (hbox), sw, FALSE, FALSE, 0);
414 model = create_model ();
416 treeview = gtk_tree_view_new_with_model (model);
418 g_object_unref (G_OBJECT (model));
420 gtk_container_add (GTK_CONTAINER (sw), treeview);
422 cell_renderer = gtk_cell_renderer_text_pixbuf_new ();
424 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
431 g_object_unref (G_OBJECT (cell_renderer));
433 cell_renderer = gtk_cell_renderer_text_new ();
435 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
443 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
451 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
459 g_object_unref (G_OBJECT (cell_renderer));
461 align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
462 gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
464 frame = gtk_frame_new ("Selected Item");
465 gtk_container_add (GTK_CONTAINER (align), frame);
467 vbox = gtk_vbox_new (FALSE, 8);
468 gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
469 gtk_container_add (GTK_CONTAINER (frame), vbox);
471 display = g_new (StockItemDisplay, 1);
472 g_object_set_data_full (G_OBJECT (treeview),
475 g_free); /* free display with treeview */
477 display->type_label = gtk_label_new (NULL);
478 display->macro_label = gtk_label_new (NULL);
479 display->id_label = gtk_label_new (NULL);
480 display->label_accel_label = gtk_label_new (NULL);
481 display->icon_image = gtk_image_new_from_pixbuf (NULL); /* empty image */
483 gtk_box_pack_start (GTK_BOX (vbox), display->type_label,
486 gtk_box_pack_start (GTK_BOX (vbox), display->icon_image,
489 gtk_box_pack_start (GTK_BOX (vbox), display->label_accel_label,
491 gtk_box_pack_start (GTK_BOX (vbox), display->macro_label,
493 gtk_box_pack_start (GTK_BOX (vbox), display->id_label,
496 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
497 gtk_tree_selection_set_mode (selection, GTK_TREE_SELECTION_SINGLE);
499 g_signal_connect_data (G_OBJECT (selection),
501 G_CALLBACK (selection_changed),
502 NULL, NULL, FALSE, FALSE);
505 if (!GTK_WIDGET_VISIBLE (window))
507 gtk_widget_show_all (window);
511 gtk_widget_destroy (window);