1/* Icon View/Editing and Drag-and-Drop
2 *
3 * The GtkIconView widget supports Editing and Drag-and-Drop.
4 * This example also demonstrates using the generic GtkCellLayout
5 * interface to set up cell renderers in an icon view.
6 */
7
8#include <gtk/gtk.h>
9#include <string.h>
10
11enum
12{
13 COL_TEXT,
14 NUM_COLS
15};
16
17
18static void
19fill_store (GtkListStore *store)
20{
21 GtkTreeIter iter;
22 const char *text[] = { "Red", "Green", "Blue", "Yellow" };
23 int i;
24
25 /* First clear the store */
26 gtk_list_store_clear (list_store: store);
27
28 for (i = 0; i < 4; i++)
29 {
30 gtk_list_store_append (list_store: store, iter: &iter);
31 gtk_list_store_set (list_store: store, iter: &iter, COL_TEXT, text[i], -1);
32 }
33}
34
35static GtkListStore *
36create_store (void)
37{
38 GtkListStore *store;
39
40 store = gtk_list_store_new (n_columns: NUM_COLS, G_TYPE_STRING);
41
42 return store;
43}
44
45static void
46set_cell_color (GtkCellLayout *cell_layout,
47 GtkCellRenderer *cell,
48 GtkTreeModel *tree_model,
49 GtkTreeIter *iter,
50 gpointer data)
51{
52 char *text;
53 GdkRGBA color;
54 guint32 pixel = 0;
55 GdkPixbuf *pixbuf;
56
57 gtk_tree_model_get (tree_model, iter, COL_TEXT, &text, -1);
58 if (!text)
59 return;
60
61 if (gdk_rgba_parse (rgba: &color, spec: text))
62 pixel =
63 ((int)(color.red * 255)) << 24 |
64 ((int)(color.green * 255)) << 16 |
65 ((int)(color.blue * 255)) << 8 |
66 ((int)(color.alpha * 255));
67
68 g_free (mem: text);
69
70 pixbuf = gdk_pixbuf_new (colorspace: GDK_COLORSPACE_RGB, TRUE, bits_per_sample: 8, width: 24, height: 24);
71 gdk_pixbuf_fill (pixbuf, pixel);
72
73 g_object_set (object: cell, first_property_name: "pixbuf", pixbuf, NULL);
74
75 g_object_unref (object: pixbuf);
76}
77
78static void
79edited (GtkCellRendererText *cell,
80 char *path_string,
81 char *text,
82 gpointer data)
83{
84 GtkTreeModel *model;
85 GtkTreeIter iter;
86 GtkTreePath *path;
87
88 model = gtk_icon_view_get_model (GTK_ICON_VIEW (data));
89 path = gtk_tree_path_new_from_string (path: path_string);
90
91 gtk_tree_model_get_iter (tree_model: model, iter: &iter, path);
92 gtk_list_store_set (GTK_LIST_STORE (model), iter: &iter,
93 COL_TEXT, text, -1);
94
95 gtk_tree_path_free (path);
96}
97
98GtkWidget *
99do_iconview_edit (GtkWidget *do_widget)
100{
101 static GtkWidget *window = NULL;
102
103 if (!window)
104 {
105 GtkWidget *icon_view;
106 GtkListStore *store;
107 GtkCellRenderer *renderer;
108
109 window = gtk_window_new ();
110
111 gtk_window_set_display (GTK_WINDOW (window),
112 display: gtk_widget_get_display (widget: do_widget));
113 gtk_window_set_title (GTK_WINDOW (window), title: "Editing and Drag-and-Drop");
114 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
115
116 store = create_store ();
117 fill_store (store);
118
119 icon_view = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store));
120 g_object_unref (object: store);
121
122 gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (icon_view),
123 mode: GTK_SELECTION_SINGLE);
124 gtk_icon_view_set_item_orientation (GTK_ICON_VIEW (icon_view),
125 orientation: GTK_ORIENTATION_HORIZONTAL);
126 gtk_icon_view_set_columns (GTK_ICON_VIEW (icon_view), columns: 2);
127 gtk_icon_view_set_reorderable (GTK_ICON_VIEW (icon_view), TRUE);
128
129 renderer = gtk_cell_renderer_pixbuf_new ();
130 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
131 cell: renderer, TRUE);
132 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (icon_view),
133 cell: renderer,
134 func: set_cell_color,
135 NULL, NULL);
136
137 renderer = gtk_cell_renderer_text_new ();
138 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
139 cell: renderer, TRUE);
140 g_object_set (object: renderer, first_property_name: "editable", TRUE, NULL);
141 g_signal_connect (renderer, "edited", G_CALLBACK (edited), icon_view);
142 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
143 cell: renderer,
144 "text", COL_TEXT,
145 NULL);
146
147 gtk_window_set_child (GTK_WINDOW (window), child: icon_view);
148 }
149
150 if (!gtk_widget_get_visible (widget: window))
151 gtk_widget_show (widget: window);
152 else
153 gtk_window_destroy (GTK_WINDOW (window));
154
155 return window;
156}
157

source code of gtk/demos/gtk-demo/iconview_edit.c