1 /* Stock Item/Icon Browser
3 * This source code for this demo doesn't demonstrate anything
4 * particularly useful in applications. The purpose of the "demo" is
5 * just to provide a handy place to browse the available stock icons
13 static GtkWidget *window = NULL;
15 typedef struct _StockItemInfo StockItemInfo;
20 GdkPixbuf *small_icon;
25 /* Make StockItemInfo a boxed type so we can automatically
28 #define STOCK_ITEM_INFO_TYPE stock_item_info_get_type ()
31 stock_item_info_free (StockItemInfo *info)
35 g_free (info->accel_str);
37 g_object_unref (G_OBJECT (info->small_icon));
43 stock_item_info_copy (StockItemInfo *src)
47 info = g_new (StockItemInfo, 1);
48 info->id = g_strdup (src->id);
49 info->macro = g_strdup (src->macro);
50 info->accel_str = g_strdup (src->accel_str);
52 info->item = src->item;
54 info->small_icon = src->small_icon;
56 g_object_ref (G_OBJECT (info->small_icon));
62 stock_item_info_get_type (void)
64 static GType our_type = 0;
67 our_type = g_boxed_type_register_static ("StockItemInfo",
69 (GBoxedCopyFunc) stock_item_info_copy,
70 (GBoxedFreeFunc) stock_item_info_free,
76 typedef struct _StockItemDisplay StockItemDisplay;
77 struct _StockItemDisplay
79 GtkWidget *type_label;
80 GtkWidget *macro_label;
82 GtkWidget *label_accel_label;
83 GtkWidget *icon_image;
86 /* columns in the tree model */
95 id_to_macro (const gchar *id)
101 /* gtk-foo -> GTK_STOCK_FOO */
104 while (*cp && *cp != '-')
108 return g_strdup ("??UNKNOWN??");
110 macro = g_string_new (NULL);
112 g_string_append_len (macro, id, cp - id);
114 g_string_append (macro, "_STOCK");
115 g_string_append (macro, cp);
125 g_ascii_strup (macro->str);
127 return g_string_free (macro, FALSE);
137 store = gtk_list_store_new (1, STOCK_ITEM_INFO_TYPE);
139 ids = gtk_stock_list_ids ();
140 ids = g_slist_sort (ids, (GCompareFunc) strcmp);
142 while (tmp_list != NULL)
147 GtkIconSet *icon_set;
149 info.id = tmp_list->data;
151 if (gtk_stock_lookup (info.id, &item))
157 info.item.label = NULL;
158 info.item.stock_id = NULL;
159 info.item.modifier = 0;
160 info.item.keyval = 0;
161 info.item.translation_domain = NULL;
164 /* only show icons for stock IDs that have default icons */
165 icon_set = gtk_icon_factory_lookup_default (info.id);
168 GtkIconSize *sizes = NULL;
173 /* See what sizes this stock icon really exists at */
174 gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes);
176 /* Use menu size if it exists, otherwise first size found */
181 if (sizes[i] == GTK_ICON_SIZE_MENU)
183 size = GTK_ICON_SIZE_MENU;
190 info.small_icon = gtk_widget_render_icon (window, info.id,
194 if (size != GTK_ICON_SIZE_MENU)
196 /* Make the result the proper size for our thumbnail */
200 gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
202 scaled = gdk_pixbuf_scale_simple (info.small_icon,
204 GDK_INTERP_BILINEAR);
206 g_object_unref (G_OBJECT (info.small_icon));
207 info.small_icon = scaled;
211 info.small_icon = NULL;
213 if (info.item.keyval != 0)
215 info.accel_str = gtk_accelerator_name (info.item.keyval,
220 info.accel_str = g_strdup ("");
223 info.macro = id_to_macro (info.id);
225 gtk_list_store_append (store, &iter);
226 gtk_list_store_set (store, &iter, 0, &info, -1);
229 g_free (info.accel_str);
231 g_object_unref (G_OBJECT (info.small_icon));
233 tmp_list = g_slist_next (tmp_list);
236 g_slist_foreach (ids, (GFunc)g_free, NULL);
239 return GTK_TREE_MODEL (store);
243 selection_changed (GtkTreeSelection *selection)
245 GtkTreeView *treeview;
246 StockItemDisplay *display;
250 treeview = gtk_tree_selection_get_tree_view (selection);
251 display = g_object_get_data (G_OBJECT (treeview), "stock-display");
253 if (gtk_tree_selection_get_selected (selection, &model, &iter))
258 gtk_tree_model_get (model, &iter,
262 if (info->small_icon && info->item.label)
263 gtk_label_set_text (GTK_LABEL (display->type_label), "Icon and Item");
264 else if (info->small_icon)
265 gtk_label_set_text (GTK_LABEL (display->type_label), "Icon Only");
266 else if (info->item.label)
267 gtk_label_set_text (GTK_LABEL (display->type_label), "Item Only");
269 gtk_label_set_text (GTK_LABEL (display->type_label), "???????");
271 gtk_label_set_text (GTK_LABEL (display->macro_label), info->macro);
272 gtk_label_set_text (GTK_LABEL (display->id_label), info->id);
274 if (info->item.label)
276 str = g_strdup_printf ("%s %s", info->item.label, info->accel_str);
277 gtk_label_set_text_with_mnemonic (GTK_LABEL (display->label_accel_label), str);
282 gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
285 /* The problem here is that some icons don't have SIZE_LARGE_TOOLBAR,
286 * so we get a "missing image" icon...
288 if (info->small_icon)
289 gtk_image_set_from_stock (GTK_IMAGE (display->icon_image), info->id,
290 GTK_ICON_SIZE_LARGE_TOOLBAR);
292 gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
294 stock_item_info_free (info);
298 gtk_label_set_text (GTK_LABEL (display->type_label), "No selected item");
299 gtk_label_set_text (GTK_LABEL (display->macro_label), "");
300 gtk_label_set_text (GTK_LABEL (display->id_label), "");
301 gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
302 gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
307 macro_set_func_text (GtkTreeViewColumn *tree_column,
308 GtkCellRenderer *cell,
315 gtk_tree_model_get (model, iter,
319 g_object_set (GTK_CELL_RENDERER (cell),
323 stock_item_info_free (info);
327 macro_set_func_pixbuf (GtkTreeViewColumn *tree_column,
328 GtkCellRenderer *cell,
335 gtk_tree_model_get (model, iter,
339 g_object_set (GTK_CELL_RENDERER (cell),
340 "pixbuf", info->small_icon,
343 stock_item_info_free (info);
347 id_set_func (GtkTreeViewColumn *tree_column,
348 GtkCellRenderer *cell,
355 gtk_tree_model_get (model, iter,
359 g_object_set (GTK_CELL_RENDERER (cell),
363 stock_item_info_free (info);
367 accel_set_func (GtkTreeViewColumn *tree_column,
368 GtkCellRenderer *cell,
375 gtk_tree_model_get (model, iter,
379 g_object_set (GTK_CELL_RENDERER (cell),
380 "text", info->accel_str,
383 stock_item_info_free (info);
387 label_set_func (GtkTreeViewColumn *tree_column,
388 GtkCellRenderer *cell,
395 gtk_tree_model_get (model, iter,
399 g_object_set (GTK_CELL_RENDERER (cell),
400 "text", info->item.label,
403 stock_item_info_free (info);
407 do_stock_browser (void)
418 GtkCellRenderer *cell_renderer;
419 StockItemDisplay *display;
420 GtkTreeSelection *selection;
421 GtkTreeViewColumn *column;
423 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
424 gtk_window_set_title (GTK_WINDOW (window), "Stock Icons and Items");
426 gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
427 gtk_container_set_border_width (GTK_CONTAINER (window), 8);
429 hbox = gtk_hbox_new (FALSE, 8);
430 gtk_container_add (GTK_CONTAINER (window), hbox);
432 sw = gtk_scrolled_window_new (NULL, NULL);
433 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
435 GTK_POLICY_AUTOMATIC);
436 gtk_box_pack_start (GTK_BOX (hbox), sw, FALSE, FALSE, 0);
438 model = create_model ();
440 treeview = gtk_tree_view_new_with_model (model);
442 g_object_unref (G_OBJECT (model));
444 gtk_container_add (GTK_CONTAINER (sw), treeview);
446 column = gtk_tree_view_column_new ();
447 gtk_tree_view_column_set_title (column, "Macro");
449 cell_renderer = gtk_cell_renderer_pixbuf_new ();
450 gtk_tree_view_column_pack_start (column,
453 gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
454 macro_set_func_pixbuf, NULL, NULL);
455 cell_renderer = gtk_cell_renderer_text_new ();
456 gtk_tree_view_column_pack_start (column,
459 gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
460 macro_set_func_text, NULL, NULL);
462 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview),
465 cell_renderer = gtk_cell_renderer_text_new ();
467 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
475 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
483 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
491 align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
492 gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
494 frame = gtk_frame_new ("Selected Item");
495 gtk_container_add (GTK_CONTAINER (align), frame);
497 vbox = gtk_vbox_new (FALSE, 8);
498 gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
499 gtk_container_add (GTK_CONTAINER (frame), vbox);
501 display = g_new (StockItemDisplay, 1);
502 g_object_set_data_full (G_OBJECT (treeview),
505 g_free); /* free display with treeview */
507 display->type_label = gtk_label_new (NULL);
508 display->macro_label = gtk_label_new (NULL);
509 display->id_label = gtk_label_new (NULL);
510 display->label_accel_label = gtk_label_new (NULL);
511 display->icon_image = gtk_image_new_from_pixbuf (NULL); /* empty image */
513 gtk_box_pack_start (GTK_BOX (vbox), display->type_label,
516 gtk_box_pack_start (GTK_BOX (vbox), display->icon_image,
519 gtk_box_pack_start (GTK_BOX (vbox), display->label_accel_label,
521 gtk_box_pack_start (GTK_BOX (vbox), display->macro_label,
523 gtk_box_pack_start (GTK_BOX (vbox), display->id_label,
526 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
527 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
529 g_signal_connect (G_OBJECT (selection),
531 G_CALLBACK (selection_changed),
535 if (!GTK_WIDGET_VISIBLE (window))
537 gtk_widget_show_all (window);
541 gtk_widget_destroy (window);