1#include <gtk/gtk.h>
2
3GtkWidget *stack;
4GtkWidget *switcher;
5GtkWidget *sidebar;
6GtkWidget *w1;
7
8static void
9set_visible_child (GtkWidget *button, gpointer data)
10{
11 gtk_stack_set_visible_child (GTK_STACK (stack), GTK_WIDGET (data));
12}
13
14static void
15set_visible_child_name (GtkWidget *button, gpointer data)
16{
17 gtk_stack_set_visible_child_name (GTK_STACK (stack), name: (const char *)data);
18}
19
20static void
21toggle_hhomogeneous (GtkWidget *button, gpointer data)
22{
23 gboolean active = gtk_check_button_get_active (GTK_CHECK_BUTTON (button));
24 gtk_stack_set_hhomogeneous (GTK_STACK (stack), hhomogeneous: active);
25}
26
27static void
28toggle_vhomogeneous (GtkWidget *button, gpointer data)
29{
30 gboolean active = gtk_check_button_get_active (GTK_CHECK_BUTTON (button));
31 gtk_stack_set_vhomogeneous (GTK_STACK (stack), vhomogeneous: active);
32}
33
34static void
35toggle_icon_name (GtkWidget *button, gpointer data)
36{
37 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
38 GtkStackPage *page;
39
40 page = gtk_stack_get_page (GTK_STACK (stack), child: w1);
41 g_object_set (object: page, first_property_name: "icon-name", active ? "edit-find-symbolic" : NULL, NULL);
42}
43
44static void
45toggle_transitions (GtkWidget *combo, gpointer data)
46{
47 int id = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
48 gtk_stack_set_transition_type (GTK_STACK (stack), transition: id);
49}
50
51static void
52on_back_button_clicked (GtkButton *button, gpointer user_data)
53{
54 const char *seq[] = { "1", "2", "3" };
55 const char *vis;
56 int i;
57
58 vis = gtk_stack_get_visible_child_name (GTK_STACK (stack));
59
60 for (i = 1; i < G_N_ELEMENTS (seq); i++)
61 {
62 if (g_strcmp0 (str1: vis, str2: seq[i]) == 0)
63 {
64 gtk_stack_set_visible_child_full (GTK_STACK (stack), name: seq[i - 1], transition: GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT);
65 break;
66 }
67 }
68}
69
70static void
71on_forward_button_clicked (GtkButton *button, gpointer user_data)
72{
73 const char *seq[] = { "1", "2", "3" };
74 const char *vis;
75 int i;
76
77 vis = gtk_stack_get_visible_child_name (GTK_STACK (stack));
78
79 for (i = 0; i < G_N_ELEMENTS (seq) - 1; i++)
80 {
81 if (g_strcmp0 (str1: vis, str2: seq[i]) == 0)
82 {
83 gtk_stack_set_visible_child_full (GTK_STACK (stack), name: seq[i + 1], transition: GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT);
84 break;
85 }
86 }
87}
88
89static void
90update_back_button_sensitivity (GtkStack *_stack, GParamSpec *pspec, GtkWidget *button)
91{
92 const char *vis;
93
94 vis = gtk_stack_get_visible_child_name (GTK_STACK (stack));
95 gtk_widget_set_sensitive (widget: button, sensitive: g_strcmp0 (str1: vis, str2: "1") != 0);
96}
97
98static void
99update_forward_button_sensitivity (GtkStack *_stack, GParamSpec *pspec, GtkWidget *button)
100{
101 const char *vis;
102
103 vis = gtk_stack_get_visible_child_name (GTK_STACK (stack));
104 gtk_widget_set_sensitive (widget: button, sensitive: g_strcmp0 (str1: vis, str2: "3") != 0);
105}
106
107int
108main (int argc,
109 char ** argv)
110{
111 GtkWidget *window, *box, *button, *hbox, *combo, *layout;
112 GtkWidget *w2, *w3;
113 GtkListStore* store;
114 GtkWidget *tree_view;
115 GtkTreeViewColumn *column;
116 GtkCellRenderer *renderer;
117 GtkWidget *scrolled_win;
118 int i;
119 GtkTreeIter iter;
120 GEnumClass *class;
121 GtkStackPage *page;
122
123 gtk_init ();
124
125 window = gtk_window_new ();
126 gtk_widget_set_size_request (widget: window, width: 300, height: 300);
127
128 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0);
129 gtk_window_set_child (GTK_WINDOW (window), child: box);
130
131 switcher = gtk_stack_switcher_new ();
132 gtk_box_append (GTK_BOX (box), child: switcher);
133
134 stack = gtk_stack_new ();
135
136 /* Make transitions longer so we can see that they work */
137 gtk_stack_set_transition_duration (GTK_STACK (stack), duration: 1500);
138
139 gtk_widget_set_halign (widget: stack, align: GTK_ALIGN_START);
140 gtk_widget_set_vexpand (widget: stack, TRUE);
141
142 /* Add sidebar before stack */
143 sidebar = gtk_stack_sidebar_new ();
144 gtk_stack_sidebar_set_stack (GTK_STACK_SIDEBAR (sidebar), GTK_STACK (stack));
145 layout = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 0);
146 gtk_box_append (GTK_BOX (layout), child: sidebar);
147 gtk_widget_set_hexpand (widget: stack, TRUE);
148 gtk_box_append (GTK_BOX (layout), child: stack);
149
150 gtk_box_append (GTK_BOX (box), child: layout);
151
152 gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (switcher), GTK_STACK (stack));
153
154 w1 = gtk_text_view_new ();
155 gtk_text_buffer_set_text (buffer: gtk_text_view_get_buffer (GTK_TEXT_VIEW (w1)),
156 text: "This is a\nTest\nBalh!", len: -1);
157
158 gtk_stack_add_titled (GTK_STACK (stack), child: w1, name: "1", title: "1");
159
160 w2 = gtk_button_new_with_label (label: "Gazoooooooooooooooonk");
161 gtk_stack_add_titled (GTK_STACK (stack), child: w2, name: "2", title: "2");
162 page = gtk_stack_get_page (GTK_STACK (stack), child: w2);
163 g_object_set (object: page, first_property_name: "needs-attention", TRUE, NULL);
164
165
166 scrolled_win = gtk_scrolled_window_new ();
167 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
168 hscrollbar_policy: GTK_POLICY_AUTOMATIC,
169 vscrollbar_policy: GTK_POLICY_AUTOMATIC);
170 gtk_widget_set_size_request (widget: scrolled_win, width: 100, height: 200);
171
172
173 store = gtk_list_store_new (n_columns: 1, G_TYPE_STRING);
174
175 for (i = 0; i < 40; i++)
176 gtk_list_store_insert_with_values (list_store: store, iter: &iter, position: i, 0, "Testvalule", -1);
177
178 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
179
180 gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_win), child: tree_view);
181 w3 = scrolled_win;
182
183 renderer = gtk_cell_renderer_text_new ();
184 column = gtk_tree_view_column_new_with_attributes (title: "Target", cell: renderer,
185 "text", 0, NULL);
186 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
187
188 gtk_stack_add_titled (GTK_STACK (stack), child: w3, name: "3", title: "3");
189
190 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 0);
191 gtk_box_append (GTK_BOX (box), child: hbox);
192
193 button = gtk_button_new_with_label (label: "1");
194 gtk_box_append (GTK_BOX (hbox), child: button);
195 g_signal_connect (button, "clicked", (GCallback) set_visible_child, w1);
196
197 button = gtk_button_new_with_label (label: "2");
198 gtk_box_append (GTK_BOX (hbox), child: button);
199 g_signal_connect (button, "clicked", (GCallback) set_visible_child, w2);
200
201 button = gtk_button_new_with_label (label: "3");
202 gtk_box_append (GTK_BOX (hbox), child: button);
203 g_signal_connect (button, "clicked", (GCallback) set_visible_child, w3);
204
205 button = gtk_button_new_with_label (label: "1");
206 gtk_box_append (GTK_BOX (hbox), child: button);
207 g_signal_connect (button, "clicked", (GCallback) set_visible_child_name, (gpointer) "1");
208
209 button = gtk_button_new_with_label (label: "2");
210 gtk_box_append (GTK_BOX (hbox), child: button);
211 g_signal_connect (button, "clicked", (GCallback) set_visible_child_name, (gpointer) "2");
212
213 button = gtk_button_new_with_label (label: "3");
214 gtk_box_append (GTK_BOX (hbox), child: button);
215 g_signal_connect (button, "clicked", (GCallback) set_visible_child_name, (gpointer) "3");
216
217 button = gtk_check_button_new ();
218 gtk_check_button_set_active (GTK_CHECK_BUTTON (button),
219 setting: gtk_stack_get_hhomogeneous (GTK_STACK (stack)));
220 gtk_box_append (GTK_BOX (hbox), child: button);
221 g_signal_connect (button, "clicked", (GCallback) toggle_hhomogeneous, NULL);
222
223 button = gtk_check_button_new_with_label (label: "homogeneous");
224 gtk_check_button_set_active (GTK_CHECK_BUTTON (button),
225 setting: gtk_stack_get_vhomogeneous (GTK_STACK (stack)));
226 gtk_box_append (GTK_BOX (hbox), child: button);
227 g_signal_connect (button, "clicked", (GCallback) toggle_vhomogeneous, NULL);
228
229 button = gtk_toggle_button_new_with_label (label: "Add icon");
230 g_signal_connect (button, "toggled", (GCallback) toggle_icon_name, NULL);
231 gtk_box_append (GTK_BOX (hbox), child: button);
232
233 combo = gtk_combo_box_text_new ();
234 class = g_type_class_ref (type: GTK_TYPE_STACK_TRANSITION_TYPE);
235 for (i = 0; i < class->n_values; i++)
236 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), text: class->values[i].value_nick);
237 g_type_class_unref (g_class: class);
238
239 gtk_box_append (GTK_BOX (hbox), child: combo);
240 g_signal_connect (combo, "changed", (GCallback) toggle_transitions, NULL);
241 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), index_: 0);
242
243 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 0);
244 gtk_box_append (GTK_BOX (box), child: hbox);
245
246 button = gtk_button_new_with_label (label: "<");
247 g_signal_connect (button, "clicked", (GCallback) on_back_button_clicked, stack);
248 g_signal_connect (stack, "notify::visible-child-name",
249 (GCallback)update_back_button_sensitivity, button);
250 gtk_box_append (GTK_BOX (hbox), child: button);
251
252 button = gtk_button_new_with_label (label: ">");
253 gtk_box_append (GTK_BOX (hbox), child: button);
254 g_signal_connect (button, "clicked", (GCallback) on_forward_button_clicked, stack);
255 g_signal_connect (stack, "notify::visible-child-name",
256 (GCallback)update_forward_button_sensitivity, button);
257
258
259 gtk_widget_show (widget: window);
260 while (TRUE)
261 g_main_context_iteration (NULL, TRUE);
262
263 gtk_window_destroy (GTK_WINDOW (window));
264
265 return 0;
266}
267

source code of gtk/tests/teststack.c