]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/iconview_edit.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / demos / gtk-demo / iconview_edit.c
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 static GtkWidget *window = NULL;
12
13 enum
14 {
15   COL_TEXT,
16   NUM_COLS
17 };
18
19
20 static void
21 fill_store (GtkListStore *store)
22 {
23   GtkTreeIter iter;
24   const gchar *text[] = { "Red", "Green", "Blue", "Yellow" };
25   gint i;
26
27   /* First clear the store */
28   gtk_list_store_clear (store);
29
30   for (i = 0; i < 4; i++)
31     {
32       gtk_list_store_append (store, &iter);
33       gtk_list_store_set (store, &iter, COL_TEXT, text[i], -1);
34     }
35 }
36
37 static GtkListStore *
38 create_store (void)
39 {
40   GtkListStore *store;
41
42   store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING);
43
44   return store;
45 }
46
47 static void
48 set_cell_color (GtkCellLayout   *cell_layout,
49                 GtkCellRenderer *cell,
50                 GtkTreeModel    *tree_model,
51                 GtkTreeIter     *iter,
52                 gpointer         data)
53 {
54   gchar *text;
55   GdkColor color;
56   guint32 pixel = 0;
57   GdkPixbuf *pixbuf;
58
59   gtk_tree_model_get (tree_model, iter, COL_TEXT, &text, -1);
60   if (gdk_color_parse (text, &color))
61     pixel =
62       (color.red   >> 8) << 24 |
63       (color.green >> 8) << 16 |
64       (color.blue  >> 8) << 8;
65
66   g_free (text);
67
68   pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 24, 24);
69   gdk_pixbuf_fill (pixbuf, pixel);
70
71   g_object_set (cell, "pixbuf", pixbuf, NULL);
72
73   g_object_unref (pixbuf);
74 }
75
76 static void
77 edited (GtkCellRendererText *cell,
78         gchar               *path_string,
79         gchar               *text,
80         gpointer             data)
81 {
82   GtkTreeModel *model;
83   GtkTreeIter iter;
84   GtkTreePath *path;
85
86   model = gtk_icon_view_get_model (GTK_ICON_VIEW (data));
87   path = gtk_tree_path_new_from_string (path_string);
88
89   gtk_tree_model_get_iter (model, &iter, path);
90   gtk_list_store_set (GTK_LIST_STORE (model), &iter,
91                       COL_TEXT, text, -1);
92
93   gtk_tree_path_free (path);
94 }
95
96 GtkWidget *
97 do_iconview_edit (GtkWidget *do_widget)
98 {
99   if (!window)
100     {
101       GtkWidget *icon_view;
102       GtkListStore *store;
103       GtkCellRenderer *renderer;
104
105       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
106
107       gtk_window_set_screen (GTK_WINDOW (window),
108                              gtk_widget_get_screen (do_widget));
109       gtk_window_set_title (GTK_WINDOW (window), "Editing and Drag-and-Drop");
110
111       g_signal_connect (window, "destroy",
112                         G_CALLBACK (gtk_widget_destroyed), &window);
113
114       store = create_store ();
115       fill_store (store);
116
117       icon_view = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store));
118       g_object_unref (store);
119
120       gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (icon_view),
121                                         GTK_SELECTION_SINGLE);
122       gtk_icon_view_set_item_orientation (GTK_ICON_VIEW (icon_view),
123                                           GTK_ORIENTATION_HORIZONTAL);
124       gtk_icon_view_set_columns (GTK_ICON_VIEW (icon_view), 2);
125       gtk_icon_view_set_reorderable (GTK_ICON_VIEW (icon_view), TRUE);
126
127       renderer = gtk_cell_renderer_pixbuf_new ();
128       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
129                                   renderer, TRUE);
130       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (icon_view),
131                                           renderer,
132                                           set_cell_color,
133                                           NULL, NULL);
134
135       renderer = gtk_cell_renderer_text_new ();
136       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
137                                   renderer, TRUE);
138       g_object_set (renderer, "editable", TRUE, NULL);
139       g_signal_connect (renderer, "edited", G_CALLBACK (edited), icon_view);
140       gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
141                                       renderer,
142                                       "text", COL_TEXT,
143                                       NULL);
144
145       gtk_container_add (GTK_CONTAINER (window), icon_view);
146     }
147
148   if (!gtk_widget_get_visible (window))
149     gtk_widget_show_all (window);
150   else
151     {
152       gtk_widget_destroy (window);
153       window = NULL;
154     }
155
156   return window;
157 }