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 | |
11 | enum |
12 | { |
13 | COL_TEXT, |
14 | NUM_COLS |
15 | }; |
16 | |
17 | |
18 | static void |
19 | fill_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 | |
35 | static GtkListStore * |
36 | create_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 | |
45 | static void |
46 | set_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 | |
78 | static void |
79 | edited (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 | |
98 | GtkWidget * |
99 | do_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 | |