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
26static GtkWidget*
27get_test_page (const char *text)
28{
29 return gtk_label_new (str: text);
30}
31
32typedef struct {
33 GtkAssistant *assistant;
34 GtkWidget *page;
35} PageData;
36
37static void
38complete_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
51static GtkWidget *
52add_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
85static void
86cancel_callback (GtkWidget *widget)
87{
88 g_print (format: "cancel\n");
89
90 gtk_widget_hide (widget);
91}
92
93static void
94close_callback (GtkWidget *widget)
95{
96 g_print (format: "close\n");
97
98 gtk_widget_hide (widget);
99}
100
101static void
102apply_callback (GtkWidget *widget)
103{
104 g_print (format: "apply\n");
105}
106
107static gboolean
108progress_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
130static void
131prepare_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
145static void
146create_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
187static void
188create_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
227static void
228visible_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
239static void
240create_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
318static char selected_branch = 'A';
319
320static void
321select_branch (GtkWidget *widget, char branch)
322{
323 selected_branch = branch;
324}
325
326static int
327nonlinear_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
344static void
345create_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
412static int
413looping_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
442static void
443create_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
504static void
505toggle_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
514static void
515create_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
572static void
573flip_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
595static void
596create_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
655struct {
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
669static void
670quit_cb (GtkWidget *widget,
671 gpointer data)
672{
673 gboolean *done = data;
674
675 *done = TRUE;
676
677 g_main_context_wakeup (NULL);
678}
679
680int
681main (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

source code of gtk/tests/testassistant.c