1 | /* |
2 | * GTK - The GIMP Toolkit |
3 | * Copyright (C) 1999 Red Hat, Inc. |
4 | * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> |
5 | * Copyright (C) 2003 Matthias Clasen <mclasen@redhat.com> |
6 | * Copyright (C) 2005 Carlos Garnacho Parro <carlosg@gnome.org> |
7 | * |
8 | * All rights reserved. |
9 | * |
10 | * This library is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU Lesser General Public |
12 | * License as published by the Free Software Foundation; either |
13 | * version 2 of the License, or (at your option) any later version. |
14 | * |
15 | * This library is distributed in the hope that it will be useful, |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 | * Lesser General Public License for more details. |
19 | * |
20 | * You should have received a copy of the GNU Lesser General Public |
21 | * License along with this library. If not, see <http://www.gnu.org/licenses/>. |
22 | */ |
23 | |
24 | #include <gtk/gtk.h> |
25 | |
26 | static GtkWidget* |
27 | get_test_page (const char *text) |
28 | { |
29 | return gtk_label_new (str: text); |
30 | } |
31 | |
32 | typedef struct { |
33 | GtkAssistant *assistant; |
34 | GtkWidget *page; |
35 | } PageData; |
36 | |
37 | static void |
38 | complete_cb (GtkWidget *check, |
39 | gpointer data) |
40 | { |
41 | PageData *pdata = data; |
42 | gboolean complete; |
43 | |
44 | complete = gtk_check_button_get_active (GTK_CHECK_BUTTON (check)); |
45 | |
46 | gtk_assistant_set_page_complete (assistant: pdata->assistant, |
47 | page: pdata->page, |
48 | complete); |
49 | } |
50 | |
51 | static GtkWidget * |
52 | add_completion_test_page (GtkWidget *assistant, |
53 | const char *text, |
54 | gboolean visible, |
55 | gboolean complete) |
56 | { |
57 | GtkWidget *page; |
58 | GtkWidget *check; |
59 | PageData *pdata; |
60 | |
61 | page = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0); |
62 | check = gtk_check_button_new_with_label (label: "Complete" ); |
63 | |
64 | gtk_box_append (GTK_BOX (page), child: gtk_label_new (str: text)); |
65 | gtk_box_append (GTK_BOX (page), child: check); |
66 | |
67 | gtk_check_button_set_active (GTK_CHECK_BUTTON (check), setting: complete); |
68 | |
69 | pdata = g_new (PageData, 1); |
70 | pdata->assistant = GTK_ASSISTANT (assistant); |
71 | pdata->page = page; |
72 | g_signal_connect (G_OBJECT (check), "toggled" , |
73 | G_CALLBACK (complete_cb), pdata); |
74 | |
75 | |
76 | gtk_widget_set_visible (widget: page, visible); |
77 | |
78 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
79 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: text); |
80 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, complete); |
81 | |
82 | return page; |
83 | } |
84 | |
85 | static void |
86 | cancel_callback (GtkWidget *widget) |
87 | { |
88 | g_print (format: "cancel\n" ); |
89 | |
90 | gtk_widget_hide (widget); |
91 | } |
92 | |
93 | static void |
94 | close_callback (GtkWidget *widget) |
95 | { |
96 | g_print (format: "close\n" ); |
97 | |
98 | gtk_widget_hide (widget); |
99 | } |
100 | |
101 | static void |
102 | apply_callback (GtkWidget *widget) |
103 | { |
104 | g_print (format: "apply\n" ); |
105 | } |
106 | |
107 | static gboolean |
108 | progress_timeout (GtkWidget *assistant) |
109 | { |
110 | GtkWidget *progress; |
111 | int current_page; |
112 | double value; |
113 | |
114 | current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (assistant)); |
115 | progress = gtk_assistant_get_nth_page (GTK_ASSISTANT (assistant), page_num: current_page); |
116 | |
117 | value = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress)); |
118 | value += 0.1; |
119 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), fraction: value); |
120 | |
121 | if (value >= 1.0) |
122 | { |
123 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page: progress, TRUE); |
124 | return FALSE; |
125 | } |
126 | |
127 | return TRUE; |
128 | } |
129 | |
130 | static void |
131 | prepare_callback (GtkWidget *widget, GtkWidget *page) |
132 | { |
133 | if (GTK_IS_LABEL (page)) |
134 | g_print (format: "prepare: %s\n" , gtk_label_get_text (GTK_LABEL (page))); |
135 | else if (gtk_assistant_get_page_type (GTK_ASSISTANT (widget), page) == GTK_ASSISTANT_PAGE_PROGRESS) |
136 | { |
137 | gtk_assistant_set_page_complete (GTK_ASSISTANT (widget), page, FALSE); |
138 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (page), fraction: 0.0); |
139 | g_timeout_add (interval: 300, function: (GSourceFunc) progress_timeout, data: widget); |
140 | } |
141 | else |
142 | g_print (format: "prepare: %d\n" , gtk_assistant_get_current_page (GTK_ASSISTANT (widget))); |
143 | } |
144 | |
145 | static void |
146 | create_simple_assistant (GtkWidget *widget) |
147 | { |
148 | static GtkWidget *assistant = NULL; |
149 | |
150 | if (!assistant) |
151 | { |
152 | GtkWidget *page; |
153 | |
154 | assistant = gtk_assistant_new (); |
155 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
156 | |
157 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
158 | G_CALLBACK (cancel_callback), NULL); |
159 | g_signal_connect (G_OBJECT (assistant), "close" , |
160 | G_CALLBACK (close_callback), NULL); |
161 | g_signal_connect (G_OBJECT (assistant), "apply" , |
162 | G_CALLBACK (apply_callback), NULL); |
163 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
164 | G_CALLBACK (prepare_callback), NULL); |
165 | |
166 | page = get_test_page (text: "Page 1" ); |
167 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
168 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 1" ); |
169 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
170 | |
171 | page = get_test_page (text: "Page 2" ); |
172 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
173 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 2" ); |
174 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_CONFIRM); |
175 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
176 | } |
177 | |
178 | if (!gtk_widget_get_visible (widget: assistant)) |
179 | gtk_widget_show (widget: assistant); |
180 | else |
181 | { |
182 | gtk_window_destroy (GTK_WINDOW (assistant)); |
183 | assistant = NULL; |
184 | } |
185 | } |
186 | |
187 | static void |
188 | create_anonymous_assistant (GtkWidget *widget) |
189 | { |
190 | static GtkWidget *assistant = NULL; |
191 | |
192 | if (!assistant) |
193 | { |
194 | GtkWidget *page; |
195 | |
196 | assistant = gtk_assistant_new (); |
197 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
198 | |
199 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
200 | G_CALLBACK (cancel_callback), NULL); |
201 | g_signal_connect (G_OBJECT (assistant), "close" , |
202 | G_CALLBACK (close_callback), NULL); |
203 | g_signal_connect (G_OBJECT (assistant), "apply" , |
204 | G_CALLBACK (apply_callback), NULL); |
205 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
206 | G_CALLBACK (prepare_callback), NULL); |
207 | |
208 | page = get_test_page (text: "Page 1" ); |
209 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
210 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
211 | |
212 | page = get_test_page (text: "Page 2" ); |
213 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
214 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_CONFIRM); |
215 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
216 | } |
217 | |
218 | if (!gtk_widget_get_visible (widget: assistant)) |
219 | gtk_widget_show (widget: assistant); |
220 | else |
221 | { |
222 | gtk_window_destroy (GTK_WINDOW (assistant)); |
223 | assistant = NULL; |
224 | } |
225 | } |
226 | |
227 | static void |
228 | visible_cb (GtkWidget *check, |
229 | gpointer data) |
230 | { |
231 | GtkWidget *page = data; |
232 | gboolean visible; |
233 | |
234 | visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (check)); |
235 | |
236 | g_object_set (G_OBJECT (page), first_property_name: "visible" , visible, NULL); |
237 | } |
238 | |
239 | static void |
240 | create_generous_assistant (GtkWidget *widget) |
241 | { |
242 | static GtkWidget *assistant = NULL; |
243 | |
244 | if (!assistant) |
245 | { |
246 | GtkWidget *page, *next, *check; |
247 | PageData *pdata; |
248 | |
249 | assistant = gtk_assistant_new (); |
250 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
251 | |
252 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
253 | G_CALLBACK (cancel_callback), NULL); |
254 | g_signal_connect (G_OBJECT (assistant), "close" , |
255 | G_CALLBACK (close_callback), NULL); |
256 | g_signal_connect (G_OBJECT (assistant), "apply" , |
257 | G_CALLBACK (apply_callback), NULL); |
258 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
259 | G_CALLBACK (prepare_callback), NULL); |
260 | |
261 | page = get_test_page (text: "Introduction" ); |
262 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
263 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Introduction" ); |
264 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_INTRO); |
265 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
266 | |
267 | page = add_completion_test_page (assistant, text: "Content" , TRUE, FALSE); |
268 | next = add_completion_test_page (assistant, text: "More Content" , TRUE, TRUE); |
269 | |
270 | check = gtk_check_button_new_with_label (label: "Next page visible" ); |
271 | gtk_check_button_set_active (GTK_CHECK_BUTTON (check), TRUE); |
272 | g_signal_connect (G_OBJECT (check), "toggled" , |
273 | G_CALLBACK (visible_cb), next); |
274 | gtk_box_append (GTK_BOX (page), child: check); |
275 | |
276 | add_completion_test_page (assistant, text: "Even More Content" , TRUE, TRUE); |
277 | |
278 | page = get_test_page (text: "Confirmation" ); |
279 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
280 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Confirmation" ); |
281 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_CONFIRM); |
282 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
283 | |
284 | page = gtk_progress_bar_new (); |
285 | gtk_widget_set_halign (widget: page, align: GTK_ALIGN_FILL); |
286 | gtk_widget_set_valign (widget: page, align: GTK_ALIGN_CENTER); |
287 | gtk_widget_set_margin_start (widget: page, margin: 20); |
288 | gtk_widget_set_margin_end (widget: page, margin: 20); |
289 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
290 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Progress" ); |
291 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_PROGRESS); |
292 | |
293 | page = gtk_check_button_new_with_label (label: "Summary complete" ); |
294 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
295 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Summary" ); |
296 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_SUMMARY); |
297 | |
298 | gtk_check_button_set_active (GTK_CHECK_BUTTON (page), |
299 | setting: gtk_assistant_get_page_complete (GTK_ASSISTANT (assistant), |
300 | page)); |
301 | |
302 | pdata = g_new (PageData, 1); |
303 | pdata->assistant = GTK_ASSISTANT (assistant); |
304 | pdata->page = page; |
305 | g_signal_connect (page, "toggled" , |
306 | G_CALLBACK (complete_cb), pdata); |
307 | } |
308 | |
309 | if (!gtk_widget_get_visible (widget: assistant)) |
310 | gtk_widget_show (widget: assistant); |
311 | else |
312 | { |
313 | gtk_window_destroy (GTK_WINDOW (assistant)); |
314 | assistant = NULL; |
315 | } |
316 | } |
317 | |
318 | static char selected_branch = 'A'; |
319 | |
320 | static void |
321 | select_branch (GtkWidget *widget, char branch) |
322 | { |
323 | selected_branch = branch; |
324 | } |
325 | |
326 | static int |
327 | nonlinear_assistant_forward_page (int current_page, gpointer data) |
328 | { |
329 | switch (current_page) |
330 | { |
331 | case 0: |
332 | if (selected_branch == 'A') |
333 | return 1; |
334 | else |
335 | return 2; |
336 | case 1: |
337 | case 2: |
338 | return 3; |
339 | default: |
340 | return -1; |
341 | } |
342 | } |
343 | |
344 | static void |
345 | create_nonlinear_assistant (GtkWidget *widget) |
346 | { |
347 | static GtkWidget *assistant = NULL; |
348 | |
349 | if (!assistant) |
350 | { |
351 | GtkWidget *page, *button, *group; |
352 | |
353 | assistant = gtk_assistant_new (); |
354 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
355 | |
356 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
357 | G_CALLBACK (cancel_callback), NULL); |
358 | g_signal_connect (G_OBJECT (assistant), "close" , |
359 | G_CALLBACK (close_callback), NULL); |
360 | g_signal_connect (G_OBJECT (assistant), "apply" , |
361 | G_CALLBACK (apply_callback), NULL); |
362 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
363 | G_CALLBACK (prepare_callback), NULL); |
364 | |
365 | gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant), |
366 | page_func: nonlinear_assistant_forward_page, |
367 | NULL, NULL); |
368 | |
369 | page = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 6); |
370 | |
371 | button = gtk_check_button_new_with_label (label: "branch A" ); |
372 | gtk_box_append (GTK_BOX (page), child: button); |
373 | g_signal_connect (G_OBJECT (button), "toggled" , G_CALLBACK (select_branch), GINT_TO_POINTER ('A')); |
374 | gtk_check_button_set_active (GTK_CHECK_BUTTON (button), TRUE); |
375 | group = button; |
376 | |
377 | button = gtk_check_button_new_with_label (label: "branch B" ); |
378 | gtk_check_button_set_group (GTK_CHECK_BUTTON (button), GTK_CHECK_BUTTON (group)); |
379 | gtk_box_append (GTK_BOX (page), child: button); |
380 | g_signal_connect (G_OBJECT (button), "toggled" , G_CALLBACK (select_branch), GINT_TO_POINTER ('B')); |
381 | |
382 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
383 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 1" ); |
384 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
385 | |
386 | page = get_test_page (text: "Page 2A" ); |
387 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
388 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 2" ); |
389 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
390 | |
391 | page = get_test_page (text: "Page 2B" ); |
392 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
393 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 2" ); |
394 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
395 | |
396 | page = get_test_page (text: "Confirmation" ); |
397 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
398 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Confirmation" ); |
399 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_CONFIRM); |
400 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
401 | } |
402 | |
403 | if (!gtk_widget_get_visible (widget: assistant)) |
404 | gtk_widget_show (widget: assistant); |
405 | else |
406 | { |
407 | gtk_window_destroy (GTK_WINDOW (assistant)); |
408 | assistant = NULL; |
409 | } |
410 | } |
411 | |
412 | static int |
413 | looping_assistant_forward_page (int current_page, gpointer data) |
414 | { |
415 | switch (current_page) |
416 | { |
417 | case 0: |
418 | return 1; |
419 | case 1: |
420 | return 2; |
421 | case 2: |
422 | return 3; |
423 | case 3: |
424 | { |
425 | GtkAssistant *assistant; |
426 | GtkWidget *page; |
427 | |
428 | assistant = (GtkAssistant*) data; |
429 | page = gtk_assistant_get_nth_page (assistant, page_num: current_page); |
430 | |
431 | if (gtk_check_button_get_active (GTK_CHECK_BUTTON (page))) |
432 | return 0; |
433 | else |
434 | return 4; |
435 | } |
436 | case 4: |
437 | default: |
438 | return -1; |
439 | } |
440 | } |
441 | |
442 | static void |
443 | create_looping_assistant (GtkWidget *widget) |
444 | { |
445 | static GtkWidget *assistant = NULL; |
446 | |
447 | if (!assistant) |
448 | { |
449 | GtkWidget *page; |
450 | |
451 | assistant = gtk_assistant_new (); |
452 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
453 | |
454 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
455 | G_CALLBACK (cancel_callback), NULL); |
456 | g_signal_connect (G_OBJECT (assistant), "close" , |
457 | G_CALLBACK (close_callback), NULL); |
458 | g_signal_connect (G_OBJECT (assistant), "apply" , |
459 | G_CALLBACK (apply_callback), NULL); |
460 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
461 | G_CALLBACK (prepare_callback), NULL); |
462 | |
463 | gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant), |
464 | page_func: looping_assistant_forward_page, |
465 | data: assistant, NULL); |
466 | |
467 | page = get_test_page (text: "Introduction" ); |
468 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
469 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Introduction" ); |
470 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_INTRO); |
471 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
472 | |
473 | page = get_test_page (text: "Content" ); |
474 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
475 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Content" ); |
476 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
477 | |
478 | page = get_test_page (text: "More content" ); |
479 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
480 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "More content" ); |
481 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
482 | |
483 | page = gtk_check_button_new_with_label (label: "Loop?" ); |
484 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
485 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Loop?" ); |
486 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
487 | |
488 | page = get_test_page (text: "Confirmation" ); |
489 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
490 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Confirmation" ); |
491 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_CONFIRM); |
492 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
493 | } |
494 | |
495 | if (!gtk_widget_get_visible (widget: assistant)) |
496 | gtk_widget_show (widget: assistant); |
497 | else |
498 | { |
499 | gtk_window_destroy (GTK_WINDOW (assistant)); |
500 | assistant = NULL; |
501 | } |
502 | } |
503 | |
504 | static void |
505 | toggle_invisible (GtkButton *button, GtkAssistant *assistant) |
506 | { |
507 | GtkWidget *page; |
508 | |
509 | page = gtk_assistant_get_nth_page (assistant, page_num: 1); |
510 | |
511 | gtk_widget_set_visible (widget: page, visible: !gtk_widget_get_visible (widget: page)); |
512 | } |
513 | |
514 | static void |
515 | create_full_featured_assistant (GtkWidget *widget) |
516 | { |
517 | static GtkWidget *assistant = NULL; |
518 | |
519 | if (!assistant) |
520 | { |
521 | GtkWidget *page, *button; |
522 | |
523 | assistant = gtk_assistant_new (); |
524 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
525 | |
526 | button = gtk_button_new_with_label (label: "_Stop" ); |
527 | gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); |
528 | gtk_assistant_add_action_widget (GTK_ASSISTANT (assistant), child: button); |
529 | g_signal_connect (button, "clicked" , |
530 | G_CALLBACK (toggle_invisible), assistant); |
531 | |
532 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
533 | G_CALLBACK (cancel_callback), NULL); |
534 | g_signal_connect (G_OBJECT (assistant), "close" , |
535 | G_CALLBACK (close_callback), NULL); |
536 | g_signal_connect (G_OBJECT (assistant), "apply" , |
537 | G_CALLBACK (apply_callback), NULL); |
538 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
539 | G_CALLBACK (prepare_callback), NULL); |
540 | |
541 | page = get_test_page (text: "Page 1" ); |
542 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
543 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 1" ); |
544 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
545 | |
546 | page = get_test_page (text: "Invisible page" ); |
547 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
548 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 2" ); |
549 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
550 | |
551 | page = gtk_file_chooser_widget_new (action: GTK_FILE_CHOOSER_ACTION_OPEN); |
552 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
553 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Filechooser" ); |
554 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
555 | |
556 | page = get_test_page (text: "Page 3" ); |
557 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
558 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 3" ); |
559 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_CONFIRM); |
560 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
561 | } |
562 | |
563 | if (!gtk_widget_get_visible (widget: assistant)) |
564 | gtk_widget_show (widget: assistant); |
565 | else |
566 | { |
567 | gtk_window_destroy (GTK_WINDOW (assistant)); |
568 | assistant = NULL; |
569 | } |
570 | } |
571 | |
572 | static void |
573 | flip_pages (GtkButton *button, GtkAssistant *assistant) |
574 | { |
575 | GtkWidget *page; |
576 | char *title; |
577 | |
578 | page = gtk_assistant_get_nth_page (assistant, page_num: 1); |
579 | |
580 | g_object_ref (page); |
581 | |
582 | title = g_strdup (str: gtk_assistant_get_page_title (assistant, page)); |
583 | |
584 | gtk_assistant_remove_page (assistant, page_num: 1); |
585 | gtk_assistant_insert_page (assistant, page, position: 2); |
586 | |
587 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title); |
588 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
589 | |
590 | g_object_unref (object: page); |
591 | g_free (mem: title); |
592 | } |
593 | |
594 | |
595 | static void |
596 | create_page_flipping_assistant (GtkWidget *widget) |
597 | { |
598 | static GtkWidget *assistant = NULL; |
599 | |
600 | if (!assistant) |
601 | { |
602 | GtkWidget *page, *button; |
603 | |
604 | assistant = gtk_assistant_new (); |
605 | gtk_window_set_default_size (GTK_WINDOW (assistant), width: 400, height: 300); |
606 | |
607 | button = gtk_button_new_with_label (label: "_Flip" ); |
608 | gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); |
609 | gtk_assistant_add_action_widget (GTK_ASSISTANT (assistant), child: button); |
610 | g_signal_connect (button, "clicked" , |
611 | G_CALLBACK (flip_pages), assistant); |
612 | |
613 | g_signal_connect (G_OBJECT (assistant), "cancel" , |
614 | G_CALLBACK (cancel_callback), NULL); |
615 | g_signal_connect (G_OBJECT (assistant), "close" , |
616 | G_CALLBACK (close_callback), NULL); |
617 | g_signal_connect (G_OBJECT (assistant), "apply" , |
618 | G_CALLBACK (apply_callback), NULL); |
619 | g_signal_connect (G_OBJECT (assistant), "prepare" , |
620 | G_CALLBACK (prepare_callback), NULL); |
621 | |
622 | page = get_test_page (text: "Page 1" ); |
623 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
624 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 1" ); |
625 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
626 | |
627 | page = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0); |
628 | gtk_box_append (GTK_BOX (page), |
629 | child: get_test_page (text: "Page 2" )); |
630 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
631 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 2" ); |
632 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
633 | |
634 | page = get_test_page (text: "Page 3" ); |
635 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
636 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Page 3" ); |
637 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
638 | |
639 | page = get_test_page (text: "Summary" ); |
640 | gtk_assistant_append_page (GTK_ASSISTANT (assistant), page); |
641 | gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, title: "Summary" ); |
642 | gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, type: GTK_ASSISTANT_PAGE_SUMMARY); |
643 | gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE); |
644 | } |
645 | |
646 | if (!gtk_widget_get_visible (widget: assistant)) |
647 | gtk_widget_show (widget: assistant); |
648 | else |
649 | { |
650 | gtk_window_destroy (GTK_WINDOW (assistant)); |
651 | assistant = NULL; |
652 | } |
653 | } |
654 | |
655 | struct { |
656 | const char *text; |
657 | void (*func) (GtkWidget *widget); |
658 | } buttons[] = |
659 | { |
660 | { "simple assistant" , create_simple_assistant }, |
661 | { "anonymous assistant" , create_anonymous_assistant }, |
662 | { "generous assistant" , create_generous_assistant }, |
663 | { "nonlinear assistant" , create_nonlinear_assistant }, |
664 | { "looping assistant" , create_looping_assistant }, |
665 | { "full featured assistant" , create_full_featured_assistant }, |
666 | { "page-flipping assistant" , create_page_flipping_assistant }, |
667 | }; |
668 | |
669 | static void |
670 | quit_cb (GtkWidget *widget, |
671 | gpointer data) |
672 | { |
673 | gboolean *done = data; |
674 | |
675 | *done = TRUE; |
676 | |
677 | g_main_context_wakeup (NULL); |
678 | } |
679 | |
680 | int |
681 | main (int argc, char *argv[]) |
682 | { |
683 | GtkWidget *window, *box, *button; |
684 | int i; |
685 | gboolean done = FALSE; |
686 | |
687 | gtk_init (); |
688 | |
689 | if (g_getenv (variable: "RTL" )) |
690 | gtk_widget_set_default_direction (dir: GTK_TEXT_DIR_RTL); |
691 | |
692 | window = gtk_window_new (); |
693 | gtk_window_set_hide_on_close (GTK_WINDOW (window), TRUE); |
694 | |
695 | g_signal_connect (G_OBJECT (window), "destroy" , G_CALLBACK (quit_cb), &done); |
696 | |
697 | box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 6); |
698 | gtk_window_set_child (GTK_WINDOW (window), child: box); |
699 | |
700 | for (i = 0; i < G_N_ELEMENTS (buttons); i++) |
701 | { |
702 | button = gtk_button_new_with_label (label: buttons[i].text); |
703 | |
704 | if (buttons[i].func) |
705 | g_signal_connect (G_OBJECT (button), "clicked" , |
706 | G_CALLBACK (buttons[i].func), NULL); |
707 | |
708 | gtk_box_append (GTK_BOX (box), child: button); |
709 | } |
710 | |
711 | gtk_widget_show (widget: window); |
712 | |
713 | while (!done) |
714 | g_main_context_iteration (NULL, TRUE); |
715 | |
716 | return 0; |
717 | } |
718 | |