|
Packit |
98cdb6 |
/* Stock Item and Icon Browser
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This source code for this demo doesn't demonstrate anything
|
|
Packit |
98cdb6 |
* particularly useful in applications. The purpose of the "demo" is
|
|
Packit |
98cdb6 |
* just to provide a handy place to browse the available stock icons
|
|
Packit |
98cdb6 |
* and stock items.
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include <string.h>
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include <gtk/gtk.h>
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static GtkWidget *window = NULL;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
typedef struct _StockItemInfo StockItemInfo;
|
|
Packit |
98cdb6 |
struct _StockItemInfo
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gchar *id;
|
|
Packit |
98cdb6 |
GtkStockItem item;
|
|
Packit |
98cdb6 |
GdkPixbuf *small_icon;
|
|
Packit |
98cdb6 |
gchar *macro;
|
|
Packit |
98cdb6 |
gchar *accel_str;
|
|
Packit |
98cdb6 |
};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* Make StockItemInfo a boxed type so we can automatically
|
|
Packit |
98cdb6 |
* manage memory
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
#define STOCK_ITEM_INFO_TYPE stock_item_info_get_type ()
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
stock_item_info_free (StockItemInfo *info)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_free (info->id);
|
|
Packit |
98cdb6 |
g_free (info->macro);
|
|
Packit |
98cdb6 |
g_free (info->accel_str);
|
|
Packit |
98cdb6 |
if (info->small_icon)
|
|
Packit |
98cdb6 |
g_object_unref (info->small_icon);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_free (info);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static StockItemInfo*
|
|
Packit |
98cdb6 |
stock_item_info_copy (StockItemInfo *src)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo *info;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
info = g_new (StockItemInfo, 1);
|
|
Packit |
98cdb6 |
info->id = g_strdup (src->id);
|
|
Packit |
98cdb6 |
info->macro = g_strdup (src->macro);
|
|
Packit |
98cdb6 |
info->accel_str = g_strdup (src->accel_str);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
info->item = src->item;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
info->small_icon = src->small_icon;
|
|
Packit |
98cdb6 |
if (info->small_icon)
|
|
Packit |
98cdb6 |
g_object_ref (info->small_icon);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return info;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static GType
|
|
Packit |
98cdb6 |
stock_item_info_get_type (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
static GType our_type = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (our_type == 0)
|
|
Packit |
98cdb6 |
our_type = g_boxed_type_register_static ("StockItemInfo",
|
|
Packit |
98cdb6 |
(GBoxedCopyFunc) stock_item_info_copy,
|
|
Packit |
98cdb6 |
(GBoxedFreeFunc) stock_item_info_free);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return our_type;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
typedef struct _StockItemDisplay StockItemDisplay;
|
|
Packit |
98cdb6 |
struct _StockItemDisplay
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkWidget *type_label;
|
|
Packit |
98cdb6 |
GtkWidget *macro_label;
|
|
Packit |
98cdb6 |
GtkWidget *id_label;
|
|
Packit |
98cdb6 |
GtkWidget *label_accel_label;
|
|
Packit |
98cdb6 |
GtkWidget *icon_image;
|
|
Packit |
98cdb6 |
};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static gchar*
|
|
Packit |
98cdb6 |
id_to_macro (const gchar *id)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GString *macro = NULL;
|
|
Packit |
98cdb6 |
const gchar *cp;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* gtk-foo-bar -> GTK_STOCK_FOO_BAR */
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
macro = g_string_new (NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
cp = id;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (strncmp (cp, "gtk-", 4) == 0)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_string_append (macro, "GTK_STOCK_");
|
|
Packit |
98cdb6 |
cp += 4;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
while (*cp)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (*cp == '-')
|
|
Packit |
98cdb6 |
g_string_append_c (macro, '_');
|
|
Packit |
98cdb6 |
else if (g_ascii_islower (*cp))
|
|
Packit |
98cdb6 |
g_string_append_c (macro, g_ascii_toupper (*cp));
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
g_string_append_c (macro, *cp);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
cp++;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return g_string_free (macro, FALSE);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static GtkTreeModel*
|
|
Packit |
98cdb6 |
create_model (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkListStore *store;
|
|
Packit |
98cdb6 |
GSList *ids;
|
|
Packit |
98cdb6 |
GSList *tmp_list;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
store = gtk_list_store_new (2, STOCK_ITEM_INFO_TYPE, G_TYPE_STRING);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
ids = gtk_stock_list_ids ();
|
|
Packit |
98cdb6 |
ids = g_slist_sort (ids, (GCompareFunc) strcmp);
|
|
Packit |
98cdb6 |
tmp_list = ids;
|
|
Packit |
98cdb6 |
while (tmp_list != NULL)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo info;
|
|
Packit |
98cdb6 |
GtkStockItem item;
|
|
Packit |
98cdb6 |
GtkTreeIter iter;
|
|
Packit |
98cdb6 |
GtkIconSet *icon_set;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
info.id = tmp_list->data;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (gtk_stock_lookup (info.id, &item))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
info.item = item;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
info.item.label = NULL;
|
|
Packit |
98cdb6 |
info.item.stock_id = NULL;
|
|
Packit |
98cdb6 |
info.item.modifier = 0;
|
|
Packit |
98cdb6 |
info.item.keyval = 0;
|
|
Packit |
98cdb6 |
info.item.translation_domain = NULL;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* only show icons for stock IDs that have default icons */
|
|
Packit |
98cdb6 |
icon_set = gtk_icon_factory_lookup_default (info.id);
|
|
Packit |
98cdb6 |
if (icon_set)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkIconSize *sizes = NULL;
|
|
Packit |
98cdb6 |
gint n_sizes = 0;
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
GtkIconSize size;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* See what sizes this stock icon really exists at */
|
|
Packit |
98cdb6 |
gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* Use menu size if it exists, otherwise first size found */
|
|
Packit |
98cdb6 |
size = sizes[0];
|
|
Packit |
98cdb6 |
i = 0;
|
|
Packit |
98cdb6 |
while (i < n_sizes)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (sizes[i] == GTK_ICON_SIZE_MENU)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
size = GTK_ICON_SIZE_MENU;
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
++i;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
g_free (sizes);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
info.small_icon = gtk_widget_render_icon (window, info.id,
|
|
Packit |
98cdb6 |
size,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (size != GTK_ICON_SIZE_MENU)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
/* Make the result the proper size for our thumbnail */
|
|
Packit |
98cdb6 |
gint w, h;
|
|
Packit |
98cdb6 |
GdkPixbuf *scaled;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
scaled = gdk_pixbuf_scale_simple (info.small_icon,
|
|
Packit |
98cdb6 |
w, h,
|
|
Packit |
98cdb6 |
GDK_INTERP_BILINEAR);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_object_unref (info.small_icon);
|
|
Packit |
98cdb6 |
info.small_icon = scaled;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
info.small_icon = NULL;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (info.item.keyval != 0)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
info.accel_str = gtk_accelerator_name (info.item.keyval,
|
|
Packit |
98cdb6 |
info.item.modifier);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
info.accel_str = g_strdup ("");
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
info.macro = id_to_macro (info.id);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_list_store_append (store, &iter);
|
|
Packit |
98cdb6 |
gtk_list_store_set (store, &iter, 0, &info, 1, info.id, -1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_free (info.macro);
|
|
Packit |
98cdb6 |
g_free (info.accel_str);
|
|
Packit |
98cdb6 |
if (info.small_icon)
|
|
Packit |
98cdb6 |
g_object_unref (info.small_icon);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
tmp_list = g_slist_next (tmp_list);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_slist_foreach (ids, (GFunc)g_free, NULL);
|
|
Packit |
98cdb6 |
g_slist_free (ids);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return GTK_TREE_MODEL (store);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* Finds the largest size at which the given image stock id is
|
|
Packit |
98cdb6 |
* available. This would not be useful for a normal application
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
static GtkIconSize
|
|
Packit |
98cdb6 |
get_largest_size (const char *id)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkIconSet *set = gtk_icon_factory_lookup_default (id);
|
|
Packit |
98cdb6 |
GtkIconSize *sizes;
|
|
Packit |
98cdb6 |
gint n_sizes, i;
|
|
Packit |
98cdb6 |
GtkIconSize best_size = GTK_ICON_SIZE_INVALID;
|
|
Packit |
98cdb6 |
gint best_pixels = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_icon_set_get_sizes (set, &sizes, &n_sizes);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; i < n_sizes; i++)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint width, height;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_icon_size_lookup (sizes[i], &width, &height);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (width * height > best_pixels)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
best_size = sizes[i];
|
|
Packit |
98cdb6 |
best_pixels = width * height;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_free (sizes);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return best_size;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
selection_changed (GtkTreeSelection *selection)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkTreeView *treeview;
|
|
Packit |
98cdb6 |
StockItemDisplay *display;
|
|
Packit |
98cdb6 |
GtkTreeModel *model;
|
|
Packit |
98cdb6 |
GtkTreeIter iter;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
treeview = gtk_tree_selection_get_tree_view (selection);
|
|
Packit |
98cdb6 |
display = g_object_get_data (G_OBJECT (treeview), "stock-display");
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo *info;
|
|
Packit |
98cdb6 |
gchar *str;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_tree_model_get (model, &iter,
|
|
Packit |
98cdb6 |
0, &info,
|
|
Packit |
98cdb6 |
-1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (info->small_icon && info->item.label)
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->type_label), "Icon and Item");
|
|
Packit |
98cdb6 |
else if (info->small_icon)
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->type_label), "Icon Only");
|
|
Packit |
98cdb6 |
else if (info->item.label)
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->type_label), "Item Only");
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->type_label), "???????");
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->macro_label), info->macro);
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->id_label), info->id);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (info->item.label)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
str = g_strdup_printf ("%s %s", info->item.label, info->accel_str);
|
|
Packit |
98cdb6 |
gtk_label_set_text_with_mnemonic (GTK_LABEL (display->label_accel_label), str);
|
|
Packit |
98cdb6 |
g_free (str);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (info->small_icon)
|
|
Packit |
98cdb6 |
gtk_image_set_from_stock (GTK_IMAGE (display->icon_image), info->id,
|
|
Packit |
98cdb6 |
get_largest_size (info->id));
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
stock_item_info_free (info);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->type_label), "No selected item");
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->macro_label), "");
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->id_label), "");
|
|
Packit |
98cdb6 |
gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
|
|
Packit |
98cdb6 |
gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
macro_set_func_text (GtkTreeViewColumn *tree_column,
|
|
Packit |
98cdb6 |
GtkCellRenderer *cell,
|
|
Packit |
98cdb6 |
GtkTreeModel *model,
|
|
Packit |
98cdb6 |
GtkTreeIter *iter,
|
|
Packit |
98cdb6 |
gpointer data)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo *info;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_tree_model_get (model, iter,
|
|
Packit |
98cdb6 |
0, &info,
|
|
Packit |
98cdb6 |
-1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_object_set (GTK_CELL_RENDERER (cell),
|
|
Packit |
98cdb6 |
"text", info->macro,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
stock_item_info_free (info);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
id_set_func (GtkTreeViewColumn *tree_column,
|
|
Packit |
98cdb6 |
GtkCellRenderer *cell,
|
|
Packit |
98cdb6 |
GtkTreeModel *model,
|
|
Packit |
98cdb6 |
GtkTreeIter *iter,
|
|
Packit |
98cdb6 |
gpointer data)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo *info;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_tree_model_get (model, iter,
|
|
Packit |
98cdb6 |
0, &info,
|
|
Packit |
98cdb6 |
-1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_object_set (GTK_CELL_RENDERER (cell),
|
|
Packit |
98cdb6 |
"text", info->id,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
stock_item_info_free (info);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
accel_set_func (GtkTreeViewColumn *tree_column,
|
|
Packit |
98cdb6 |
GtkCellRenderer *cell,
|
|
Packit |
98cdb6 |
GtkTreeModel *model,
|
|
Packit |
98cdb6 |
GtkTreeIter *iter,
|
|
Packit |
98cdb6 |
gpointer data)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo *info;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_tree_model_get (model, iter,
|
|
Packit |
98cdb6 |
0, &info,
|
|
Packit |
98cdb6 |
-1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_object_set (GTK_CELL_RENDERER (cell),
|
|
Packit |
98cdb6 |
"text", info->accel_str,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
stock_item_info_free (info);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
label_set_func (GtkTreeViewColumn *tree_column,
|
|
Packit |
98cdb6 |
GtkCellRenderer *cell,
|
|
Packit |
98cdb6 |
GtkTreeModel *model,
|
|
Packit |
98cdb6 |
GtkTreeIter *iter,
|
|
Packit |
98cdb6 |
gpointer data)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
StockItemInfo *info;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_tree_model_get (model, iter,
|
|
Packit |
98cdb6 |
0, &info,
|
|
Packit |
98cdb6 |
-1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_object_set (GTK_CELL_RENDERER (cell),
|
|
Packit |
98cdb6 |
"text", info->item.label,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
stock_item_info_free (info);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GtkWidget *
|
|
Packit |
98cdb6 |
do_stock_browser (GtkWidget *do_widget)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (!window)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkWidget *frame;
|
|
Packit |
98cdb6 |
GtkWidget *vbox;
|
|
Packit |
98cdb6 |
GtkWidget *hbox;
|
|
Packit |
98cdb6 |
GtkWidget *sw;
|
|
Packit |
98cdb6 |
GtkWidget *treeview;
|
|
Packit |
98cdb6 |
GtkWidget *align;
|
|
Packit |
98cdb6 |
GtkTreeModel *model;
|
|
Packit |
98cdb6 |
GtkCellRenderer *cell_renderer;
|
|
Packit |
98cdb6 |
StockItemDisplay *display;
|
|
Packit |
98cdb6 |
GtkTreeSelection *selection;
|
|
Packit |
98cdb6 |
GtkTreeViewColumn *column;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit |
98cdb6 |
gtk_window_set_screen (GTK_WINDOW (window),
|
|
Packit |
98cdb6 |
gtk_widget_get_screen (do_widget));
|
|
Packit |
98cdb6 |
gtk_window_set_title (GTK_WINDOW (window), "Stock Icons and Items");
|
|
Packit |
98cdb6 |
gtk_window_set_default_size (GTK_WINDOW (window), -1, 500);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
|
|
Packit |
98cdb6 |
gtk_container_set_border_width (GTK_CONTAINER (window), 8);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
hbox = gtk_hbox_new (FALSE, 8);
|
|
Packit |
98cdb6 |
gtk_container_add (GTK_CONTAINER (window), hbox);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
sw = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit |
98cdb6 |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
|
Packit |
98cdb6 |
GTK_POLICY_NEVER,
|
|
Packit |
98cdb6 |
GTK_POLICY_AUTOMATIC);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (hbox), sw, FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
model = create_model ();
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
treeview = gtk_tree_view_new_with_model (model);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_object_unref (model);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_container_add (GTK_CONTAINER (sw), treeview);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
column = gtk_tree_view_column_new ();
|
|
Packit |
98cdb6 |
gtk_tree_view_column_set_title (column, "Macro");
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
cell_renderer = gtk_cell_renderer_pixbuf_new ();
|
|
Packit |
98cdb6 |
gtk_tree_view_column_pack_start (column,
|
|
Packit |
98cdb6 |
cell_renderer,
|
|
Packit |
98cdb6 |
FALSE);
|
|
Packit |
98cdb6 |
gtk_tree_view_column_set_attributes (column, cell_renderer,
|
|
Packit |
98cdb6 |
"stock_id", 1, NULL);
|
|
Packit |
98cdb6 |
cell_renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
98cdb6 |
gtk_tree_view_column_pack_start (column,
|
|
Packit |
98cdb6 |
cell_renderer,
|
|
Packit |
98cdb6 |
TRUE);
|
|
Packit |
98cdb6 |
gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
|
|
Packit |
98cdb6 |
macro_set_func_text, NULL, NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview),
|
|
Packit |
98cdb6 |
column);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
cell_renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
98cdb6 |
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
|
|
Packit |
98cdb6 |
-1,
|
|
Packit |
98cdb6 |
"Label",
|
|
Packit |
98cdb6 |
cell_renderer,
|
|
Packit |
98cdb6 |
label_set_func,
|
|
Packit |
98cdb6 |
NULL,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
cell_renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
98cdb6 |
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
|
|
Packit |
98cdb6 |
-1,
|
|
Packit |
98cdb6 |
"Accel",
|
|
Packit |
98cdb6 |
cell_renderer,
|
|
Packit |
98cdb6 |
accel_set_func,
|
|
Packit |
98cdb6 |
NULL,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
cell_renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
98cdb6 |
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
|
|
Packit |
98cdb6 |
-1,
|
|
Packit |
98cdb6 |
"ID",
|
|
Packit |
98cdb6 |
cell_renderer,
|
|
Packit |
98cdb6 |
id_set_func,
|
|
Packit |
98cdb6 |
NULL,
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
|
|
Packit |
98cdb6 |
gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
frame = gtk_frame_new ("Selected Item");
|
|
Packit |
98cdb6 |
gtk_container_add (GTK_CONTAINER (align), frame);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
vbox = gtk_vbox_new (FALSE, 8);
|
|
Packit |
98cdb6 |
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
|
|
Packit |
98cdb6 |
gtk_container_add (GTK_CONTAINER (frame), vbox);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
display = g_new (StockItemDisplay, 1);
|
|
Packit |
98cdb6 |
g_object_set_data_full (G_OBJECT (treeview),
|
|
Packit |
98cdb6 |
"stock-display",
|
|
Packit |
98cdb6 |
display,
|
|
Packit |
98cdb6 |
g_free); /* free display with treeview */
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
display->type_label = gtk_label_new (NULL);
|
|
Packit |
98cdb6 |
display->macro_label = gtk_label_new (NULL);
|
|
Packit |
98cdb6 |
display->id_label = gtk_label_new (NULL);
|
|
Packit |
98cdb6 |
display->label_accel_label = gtk_label_new (NULL);
|
|
Packit |
98cdb6 |
display->icon_image = gtk_image_new_from_pixbuf (NULL); /* empty image */
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (vbox), display->type_label,
|
|
Packit |
98cdb6 |
FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (vbox), display->icon_image,
|
|
Packit |
98cdb6 |
FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (vbox), display->label_accel_label,
|
|
Packit |
98cdb6 |
FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (vbox), display->macro_label,
|
|
Packit |
98cdb6 |
FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (vbox), display->id_label,
|
|
Packit |
98cdb6 |
FALSE, FALSE, 0);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
|
Packit |
98cdb6 |
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_signal_connect (selection,
|
|
Packit |
98cdb6 |
"changed",
|
|
Packit |
98cdb6 |
G_CALLBACK (selection_changed),
|
|
Packit |
98cdb6 |
NULL);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (!gtk_widget_get_visible (window))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gtk_widget_show_all (window);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gtk_widget_destroy (window);
|
|
Packit |
98cdb6 |
window = NULL;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return window;
|
|
Packit |
98cdb6 |
}
|