-/* Stock Item/Icon Browser
+/* Stock Item and Icon Browser
*
* This source code for this demo doesn't demonstrate anything
* particularly useful in applications. The purpose of the "demo" is
g_free (info->macro);
g_free (info->accel_str);
if (info->small_icon)
- g_object_unref (G_OBJECT (info->small_icon));
+ g_object_unref (info->small_icon);
g_free (info);
}
info->small_icon = src->small_icon;
if (info->small_icon)
- g_object_ref (G_OBJECT (info->small_icon));
+ g_object_ref (info->small_icon);
return info;
}
if (our_type == 0)
our_type = g_boxed_type_register_static ("StockItemInfo",
- NULL,
(GBoxedCopyFunc) stock_item_info_copy,
- (GBoxedFreeFunc) stock_item_info_free,
- FALSE);
+ (GBoxedFreeFunc) stock_item_info_free);
return our_type;
}
GtkWidget *icon_image;
};
-/* columns in the tree model */
-enum {
- COLUMN_ICON_MACRO,
- COLUMN_LABEL,
- COLUMN_ACCEL,
- COLUMN_ID
-};
-
static gchar*
id_to_macro (const gchar *id)
{
- GString *macro;
+ GString *macro = NULL;
const gchar *cp;
- gchar *p;
-
- /* gtk-foo -> GTK_STOCK_FOO */
-
- cp = id;
- while (*cp && *cp != '-')
- ++cp;
- if (*cp == '\0')
- return g_strdup ("??UNKNOWN??");
+ /* gtk-foo-bar -> GTK_STOCK_FOO_BAR */
macro = g_string_new (NULL);
- g_string_append_len (macro, id, cp - id);
+ cp = id;
- g_string_append (macro, "_STOCK");
- g_string_append (macro, cp);
+ if (strncmp (cp, "gtk-", 4) == 0)
+ {
+ g_string_append (macro, "GTK_STOCK_");
+ cp += 4;
+ }
- p = macro->str;
- while (*p)
+ while (*cp)
{
- if (*p == '-')
- *p = '_';
- ++p;
+ if (*cp == '-')
+ g_string_append_c (macro, '_');
+ else if (g_ascii_islower (*cp))
+ g_string_append_c (macro, g_ascii_toupper (*cp));
+ else
+ g_string_append_c (macro, *cp);
+
+ cp++;
}
- g_strup (macro->str);
-
return g_string_free (macro, FALSE);
}
GSList *ids;
GSList *tmp_list;
- store = gtk_list_store_new_with_types (1, STOCK_ITEM_INFO_TYPE);
+ store = gtk_list_store_new (2, STOCK_ITEM_INFO_TYPE, G_TYPE_STRING);
ids = gtk_stock_list_ids ();
ids = g_slist_sort (ids, (GCompareFunc) strcmp);
w, h,
GDK_INTERP_BILINEAR);
- g_object_unref (G_OBJECT (info.small_icon));
+ g_object_unref (info.small_icon);
info.small_icon = scaled;
}
}
info.macro = id_to_macro (info.id);
gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, &info, -1);
+ gtk_list_store_set (store, &iter, 0, &info, 1, info.id, -1);
g_free (info.macro);
g_free (info.accel_str);
if (info.small_icon)
- g_object_unref (G_OBJECT (info.small_icon));
+ g_object_unref (info.small_icon);
tmp_list = g_slist_next (tmp_list);
}
return GTK_TREE_MODEL (store);
}
+/* Finds the largest size at which the given image stock id is
+ * available. This would not be useful for a normal application
+ */
+static GtkIconSize
+get_largest_size (const char *id)
+{
+ GtkIconSet *set = gtk_icon_factory_lookup_default (id);
+ GtkIconSize *sizes;
+ gint n_sizes, i;
+ GtkIconSize best_size = GTK_ICON_SIZE_INVALID;
+ gint best_pixels = 0;
+
+ gtk_icon_set_get_sizes (set, &sizes, &n_sizes);
+
+ for (i = 0; i < n_sizes; i++)
+ {
+ gint width, height;
+
+ gtk_icon_size_lookup (sizes[i], &width, &height);
+
+ if (width * height > best_pixels)
+ {
+ best_size = sizes[i];
+ best_pixels = width * height;
+ }
+ }
+
+ g_free (sizes);
+
+ return best_size;
+}
+
static void
selection_changed (GtkTreeSelection *selection)
{
gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
}
- /* The problem here is that some icons don't have SIZE_LARGE_TOOLBAR,
- * so we get a "missing image" icon...
- */
if (info->small_icon)
gtk_image_set_from_stock (GTK_IMAGE (display->icon_image), info->id,
- GTK_ICON_SIZE_LARGE_TOOLBAR);
+ get_largest_size (info->id));
else
gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
}
static void
-macro_set_func (GtkTreeViewColumn *tree_column,
- GtkCellRenderer *cell,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
+macro_set_func_text (GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
{
StockItemInfo *info;
g_object_set (GTK_CELL_RENDERER (cell),
"text", info->macro,
- "pixbuf", info->small_icon,
NULL);
stock_item_info_free (info);
}
GtkWidget *
-do_stock_browser (void)
+do_stock_browser (GtkWidget *do_widget)
{
if (!window)
{
GtkCellRenderer *cell_renderer;
StockItemDisplay *display;
GtkTreeSelection *selection;
-
+ GtkTreeViewColumn *column;
+
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_screen (GTK_WINDOW (window),
+ gtk_widget_get_screen (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Stock Icons and Items");
+ gtk_window_set_default_size (GTK_WINDOW (window), -1, 500);
- gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
+ g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
gtk_container_set_border_width (GTK_CONTAINER (window), 8);
hbox = gtk_hbox_new (FALSE, 8);
treeview = gtk_tree_view_new_with_model (model);
- g_object_unref (G_OBJECT (model));
+ g_object_unref (model);
gtk_container_add (GTK_CONTAINER (sw), treeview);
- cell_renderer = gtk_cell_renderer_text_pixbuf_new ();
+ column = gtk_tree_view_column_new ();
+ gtk_tree_view_column_set_title (column, "Macro");
+
+ cell_renderer = gtk_cell_renderer_pixbuf_new ();
+ gtk_tree_view_column_pack_start (column,
+ cell_renderer,
+ FALSE);
+ gtk_tree_view_column_set_attributes (column, cell_renderer,
+ "stock_id", 1, NULL);
+ cell_renderer = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (column,
+ cell_renderer,
+ TRUE);
+ gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
+ macro_set_func_text, NULL, NULL);
- gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
- -1,
- "Macro",
- cell_renderer,
- macro_set_func,
- NULL,
- NULL);
- g_object_unref (G_OBJECT (cell_renderer));
+ gtk_tree_view_append_column (GTK_TREE_VIEW (treeview),
+ column);
cell_renderer = gtk_cell_renderer_text_new ();
-
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
-1,
"Label",
NULL,
NULL);
+ cell_renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
-1,
"Accel",
NULL,
NULL);
+ cell_renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
-1,
"ID",
NULL,
NULL);
- g_object_unref (G_OBJECT (cell_renderer));
-
align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
FALSE, FALSE, 0);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
- gtk_tree_selection_set_mode (selection, GTK_TREE_SELECTION_SINGLE);
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
- g_signal_connect (G_OBJECT (selection),
+ g_signal_connect (selection,
"changed",
G_CALLBACK (selection_changed),
NULL);
}
- if (!GTK_WIDGET_VISIBLE (window))
+ if (!gtk_widget_get_visible (window))
{
gtk_widget_show_all (window);
}