1 | #include <gtk/gtk.h> |
2 | |
3 | GtkWidget *stack; |
4 | GtkWidget *switcher; |
5 | GtkWidget *; |
6 | GtkWidget *w1; |
7 | |
8 | static void |
9 | set_visible_child (GtkWidget *button, gpointer data) |
10 | { |
11 | gtk_stack_set_visible_child (GTK_STACK (stack), GTK_WIDGET (data)); |
12 | } |
13 | |
14 | static void |
15 | set_visible_child_name (GtkWidget *button, gpointer data) |
16 | { |
17 | gtk_stack_set_visible_child_name (GTK_STACK (stack), name: (const char *)data); |
18 | } |
19 | |
20 | static void |
21 | toggle_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 | |
27 | static void |
28 | toggle_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 | |
34 | static void |
35 | toggle_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 | |
44 | static void |
45 | toggle_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 | |
51 | static void |
52 | on_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 | |
70 | static void |
71 | on_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 | |
89 | static void |
90 | update_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 | |
98 | static void |
99 | update_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 | |
107 | int |
108 | main (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 | |