summaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
authorArx Cruz <arxcruz@gnome.org>2012-07-19 14:22:25 -0300
committerArx Cruz <arxcruz@gnome.org>2012-07-19 14:23:48 -0300
commitc17eff5863009c69196e92520b150643f1f7937d (patch)
tree1404340cb01026b0398ebb60436a855754229158 /src/tree.c
parent9a2a2d8367f7c6a638370adcc6709a691fd883ff (diff)
Added support to --imagelist on tree. Thanks to Joshua Nathaniel Pritikin <jpritikin@pobox.com> now the first column can have an image.
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/src/tree.c b/src/tree.c
index b347b15..4234fc1 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -87,6 +87,44 @@ zenity_tree_toggled_callback (GtkCellRendererToggle *cell, gchar *path_string, g
gtk_tree_path_free (path);
}
+static void
+zenity_load_pixbuf (GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell,
+ GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ static GHashTable *pixbuf_cache = NULL;
+ GError *error = NULL;
+ GdkPixbuf *pixbuf;
+ gchar *str;
+
+ gtk_tree_model_get (tree_model, iter, 0, &str, -1);
+
+ if (!str)
+ return;
+
+ if (!pixbuf_cache) {
+ pixbuf_cache = g_hash_table_new (g_str_hash, g_str_equal);
+ g_assert(pixbuf_cache);
+ }
+
+ pixbuf = g_hash_table_lookup (pixbuf_cache, str);
+
+ if (!pixbuf) {
+ pixbuf = gdk_pixbuf_new_from_file (str, &error);
+ if (!pixbuf)
+ g_warning ("Failed to load '%s'", str);
+
+ g_hash_table_insert (pixbuf_cache, g_strdup (str), pixbuf);
+ }
+
+ if (pixbuf)
+ g_object_set (cell, "pixbuf", pixbuf, NULL);
+
+ g_free (str);
+}
+
static gboolean
zenity_tree_handle_stdin (GIOChannel *channel,
GIOCondition condition,
@@ -249,7 +287,7 @@ zenity_tree_fill_entries (GtkTreeView *tree_view,
GtkWidget *scrolled_window;
GtkRequisition rectangle;
- gtk_widget_size_request (GTK_WIDGET (tree_view), &rectangle);
+ gtk_widget_get_preferred_size (GTK_WIDGET (tree_view), &rectangle, NULL);
scrolled_window = GTK_WIDGET (gtk_builder_get_object (builder,
"zenity_tree_window"));
gtk_widget_set_size_request (scrolled_window, -1, rectangle.height);
@@ -329,7 +367,7 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data)
return;
}
- if (tree_data->checkbox && tree_data->radiobox) {
+ if (tree_data->checkbox + tree_data->radiobox + tree_data->imagebox > 1) {
g_printerr (_("You should use only one List dialog type.\n"));
data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR);
return;
@@ -433,6 +471,12 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data)
column = gtk_tree_view_column_new_with_attributes (tmp->data,
cell_renderer,
"active", column_index, NULL);
+ } else if (tree_data->imagebox) {
+ GtkCellRenderer *cell_renderer = gtk_cell_renderer_pixbuf_new ();
+ column = gtk_tree_view_column_new_with_attributes (tmp->data,
+ cell_renderer, NULL);
+ gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
+ zenity_load_pixbuf, NULL, NULL);
}
else {
if (tree_data->editable) {
@@ -657,10 +701,7 @@ zenity_tree_row_activated (GtkTreeView *tree_view, GtkTreePath *tree_path,
{
ZenityData *zen_data = data;
GtkTreeSelection *selection;
- GtkTreeModel *model;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
-
+
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
gtk_tree_selection_selected_foreach (selection,
(GtkTreeSelectionForeachFunc) zenity_tree_dialog_get_selected,