]> Pileus Git - ~andy/gtk/blob - tests/testtreeedit.c
9163fd2c9bd239b73a741d3a8d606cbc603b3b5f
[~andy/gtk] / tests / testtreeedit.c
1 #include <gtk/gtk.h>
2
3 typedef struct {
4   const gchar *string;
5   gboolean is_editable;
6 } ListEntry;
7
8 enum {
9   STRING_COLUMN,
10   IS_EDITABLE_COLUMN,
11   NUM_COLUMNS
12 };
13
14 static ListEntry model_strings[] =
15 {
16   {"A simple string", TRUE },
17   {"Another string!", TRUE },
18   {"Guess what, a third string. This one can't be edited", FALSE },
19   {"And then a fourth string. Neither can this", FALSE },
20   {"Multiline\nFun!", TRUE },
21   { NULL }
22 };
23
24 static GtkTreeModel *
25 create_model (void)
26 {
27   GtkListStore *model;
28   GtkTreeIter iter;
29   gint i;
30   
31   model = gtk_list_store_new (NUM_COLUMNS,
32                               G_TYPE_STRING,
33                               G_TYPE_BOOLEAN);
34
35   for (i = 0; model_strings[i].string != NULL; i++)
36     {
37       gtk_list_store_append (model, &iter);
38
39       gtk_list_store_set (model, &iter,
40                           STRING_COLUMN, model_strings[i].string,
41                           IS_EDITABLE_COLUMN, model_strings[i].is_editable,
42                           -1);
43     }
44   
45   return GTK_TREE_MODEL (model);
46 }
47
48 static void
49 toggled (GtkCellRendererToggle *cell,
50          gchar                 *path_string,
51          gpointer               data)
52 {
53   GtkTreeModel *model = GTK_TREE_MODEL (data);
54   GtkTreeIter iter;
55   GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
56   gboolean value;
57
58   gtk_tree_model_get_iter (model, &iter, path);
59   gtk_tree_model_get (model, &iter, IS_EDITABLE_COLUMN, &value, -1);
60
61   value = !value;
62   gtk_list_store_set (GTK_LIST_STORE (model), &iter, IS_EDITABLE_COLUMN, value, -1);
63
64   gtk_tree_path_free (path);
65 }
66
67 static void
68 edited (GtkCellRendererText *cell,
69         gchar               *path_string,
70         gchar               *new_text,
71         gpointer             data)
72 {
73   GtkTreeModel *model = GTK_TREE_MODEL (data);
74   GtkTreeIter iter;
75   GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
76
77   gtk_tree_model_get_iter (model, &iter, path);
78   gtk_list_store_set (GTK_LIST_STORE (model), &iter, STRING_COLUMN, new_text, -1);
79
80   gtk_tree_path_free (path);
81 }
82
83 static gboolean
84 button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer callback_data)
85 {
86         /* Deselect if people click outside any row. */
87         if (event->window == gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget))
88             && !gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
89                                                event->x, event->y, NULL, NULL, NULL, NULL)) {
90                 gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)));
91         }
92
93         /* Let the default code run in any case; it won't reselect anything. */
94         return FALSE;
95 }
96
97 gint
98 main (gint argc, gchar **argv)
99 {
100   GtkWidget *window;
101   GtkWidget *scrolled_window;
102   GtkWidget *tree_view;
103   GtkTreeModel *tree_model;
104   GtkCellRenderer *renderer;
105   
106   gtk_init (&argc, &argv);
107
108   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
109   gtk_window_set_title (GTK_WINDOW (window), "GtkTreeView editing sample");
110   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
111
112   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
113   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
114   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
115   gtk_container_add (GTK_CONTAINER (window), scrolled_window);
116
117   tree_model = create_model ();
118   tree_view = gtk_tree_view_new_with_model (tree_model);
119   g_signal_connect (tree_view, "button_press_event", G_CALLBACK (button_press_event), NULL);
120   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
121   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
122
123   renderer = gtk_cell_renderer_text_new ();
124   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
125                                                -1, "String",
126                                                renderer,
127                                                "text", STRING_COLUMN,
128                                                "editable", IS_EDITABLE_COLUMN,
129                                                NULL);
130
131   g_signal_connect (G_OBJECT (renderer), "edited",
132                     G_CALLBACK (edited), tree_model);
133   renderer = gtk_cell_renderer_toggle_new ();
134   g_signal_connect (G_OBJECT (renderer), "toggled",
135                     G_CALLBACK (toggled), tree_model);
136   
137   g_object_set (G_OBJECT (renderer),
138                 "xalign", 0.0,
139                 NULL);
140   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
141                                                -1, "Editable",
142                                                renderer,
143                                                "active", IS_EDITABLE_COLUMN,
144                                                NULL);
145   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
146   
147   gtk_window_set_default_size (GTK_WINDOW (window),
148                                650, 400);
149
150   gtk_widget_show_all (window);
151   gtk_main ();
152
153   return 0;
154 }