]> Pileus Git - ~andy/gtk/blob - tests/testassistant.c
bb23720a6425debb89b13f8bc77967699e99ddc7
[~andy/gtk] / tests / testassistant.c
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, write to the
22  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 02111-1307, USA.
24  */
25
26 #include <gtk/gtk.h>
27
28 static GtkWidget*
29 get_test_page (const gchar *text)
30 {
31   return gtk_label_new (text);
32 }
33
34 typedef struct {
35   GtkAssistant *assistant;
36   GtkWidget    *page;
37 } PageData;
38
39 static void
40 complete_cb (GtkWidget *check, 
41              gpointer   data)
42 {
43   PageData *pdata = data;
44   gboolean complete;
45
46   complete = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check));
47
48   gtk_assistant_set_page_complete (pdata->assistant,
49                                    pdata->page,
50                                    complete);
51 }
52              
53 static GtkWidget *
54 add_completion_test_page (GtkWidget   *assistant,
55                           const gchar *text, 
56                           gboolean     visible,
57                           gboolean     complete)
58 {
59   GtkWidget *page;
60   GtkWidget *check;
61   PageData *pdata;
62
63   page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
64   check = gtk_check_button_new_with_label ("Complete");
65
66   gtk_container_add (GTK_CONTAINER (page), gtk_label_new (text));
67   gtk_container_add (GTK_CONTAINER (page), check);
68   
69   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), complete);
70
71   pdata = g_new (PageData, 1);
72   pdata->assistant = GTK_ASSISTANT (assistant);
73   pdata->page = page;
74   g_signal_connect (G_OBJECT (check), "toggled", 
75                     G_CALLBACK (complete_cb), pdata);
76
77
78   if (visible)
79     gtk_widget_show_all (page);
80
81   gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
82   gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, text);
83   gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, complete);
84
85   return page;
86 }
87
88 static void
89 cancel_callback (GtkWidget *widget)
90 {
91   g_print ("cancel\n");
92
93   gtk_widget_hide (widget);
94 }
95
96 static void
97 close_callback (GtkWidget *widget)
98 {
99   g_print ("close\n");
100
101   gtk_widget_hide (widget);
102 }
103
104 static void
105 apply_callback (GtkWidget *widget)
106 {
107   g_print ("apply\n");
108 }
109
110 static gboolean
111 progress_timeout (GtkWidget *assistant)
112 {
113   GtkWidget *page, *progress;
114   gint current_page;
115   gdouble value;
116
117   current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (assistant));
118   page = gtk_assistant_get_nth_page (GTK_ASSISTANT (assistant), current_page);
119   progress = gtk_bin_get_child (GTK_BIN (page));
120
121   value  = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress));
122   value += 0.1;
123   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), value);
124
125   if (value >= 1.0)
126     {
127       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
128       return FALSE;
129     }
130
131   return TRUE;
132 }
133
134 static void
135 prepare_callback (GtkWidget *widget, GtkWidget *page)
136 {
137   if (GTK_IS_LABEL (page))
138     g_print ("prepare: %s\n", gtk_label_get_text (GTK_LABEL (page)));
139   else if (gtk_assistant_get_page_type (GTK_ASSISTANT (widget), page) == GTK_ASSISTANT_PAGE_PROGRESS)
140     {
141       GtkWidget *progress;
142
143       progress = gtk_bin_get_child (GTK_BIN (page));
144       gtk_assistant_set_page_complete (GTK_ASSISTANT (widget), page, FALSE);
145       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), 0.0);
146       gdk_threads_add_timeout (300, (GSourceFunc) progress_timeout, widget);
147     }
148   else
149     g_print ("prepare: %d\n", gtk_assistant_get_current_page (GTK_ASSISTANT (widget)));
150 }
151
152 static void
153 create_simple_assistant (GtkWidget *widget)
154 {
155   static GtkWidget *assistant = NULL;
156
157   if (!assistant)
158     {
159       GtkWidget *page;
160
161       assistant = gtk_assistant_new ();
162       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
163
164       g_signal_connect (G_OBJECT (assistant), "cancel",
165                         G_CALLBACK (cancel_callback), NULL);
166       g_signal_connect (G_OBJECT (assistant), "close",
167                         G_CALLBACK (close_callback), NULL);
168       g_signal_connect (G_OBJECT (assistant), "apply",
169                         G_CALLBACK (apply_callback), NULL);
170       g_signal_connect (G_OBJECT (assistant), "prepare",
171                         G_CALLBACK (prepare_callback), NULL);
172
173       page = get_test_page ("Page 1");
174       gtk_widget_show (page);
175       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
176       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
177       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
178
179       page = get_test_page ("Page 2");
180       gtk_widget_show (page);
181       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
182       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
183       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
184       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
185     }
186
187   if (!gtk_widget_get_visible (assistant))
188     gtk_widget_show (assistant);
189   else
190     {
191       gtk_widget_destroy (assistant);
192       assistant = NULL;
193     }
194 }
195
196 static void
197 create_anonymous_assistant (GtkWidget *widget)
198 {
199   static GtkWidget *assistant = NULL;
200
201   if (!assistant)
202     {
203       GtkWidget *page;
204
205       assistant = gtk_assistant_new ();
206       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
207
208       g_signal_connect (G_OBJECT (assistant), "cancel",
209                         G_CALLBACK (cancel_callback), NULL);
210       g_signal_connect (G_OBJECT (assistant), "close",
211                         G_CALLBACK (close_callback), NULL);
212       g_signal_connect (G_OBJECT (assistant), "apply",
213                         G_CALLBACK (apply_callback), NULL);
214       g_signal_connect (G_OBJECT (assistant), "prepare",
215                         G_CALLBACK (prepare_callback), NULL);
216
217       page = get_test_page ("Page 1");
218       gtk_widget_show (page);
219       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
220       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
221
222       page = get_test_page ("Page 2");
223       gtk_widget_show (page);
224       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
225       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
226       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
227     }
228
229   if (!gtk_widget_get_visible (assistant))
230     gtk_widget_show (assistant);
231   else
232     {
233       gtk_widget_destroy (assistant);
234       assistant = NULL;
235     }
236 }
237
238 static void
239 visible_cb (GtkWidget *check, 
240             gpointer   data)
241 {
242   GtkWidget *page = data;
243   gboolean visible;
244
245   visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check));
246
247   g_object_set (G_OBJECT (page), "visible", visible, NULL);
248 }
249
250 static void
251 create_generous_assistant (GtkWidget *widget)
252 {
253   static GtkWidget *assistant = NULL;
254
255   if (!assistant)
256     {
257       GtkWidget *page, *next, *check;
258       PageData  *pdata;
259
260       assistant = gtk_assistant_new ();
261       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
262
263       g_signal_connect (G_OBJECT (assistant), "cancel",
264                         G_CALLBACK (cancel_callback), NULL);
265       g_signal_connect (G_OBJECT (assistant), "close",
266                         G_CALLBACK (close_callback), NULL);
267       g_signal_connect (G_OBJECT (assistant), "apply",
268                         G_CALLBACK (apply_callback), NULL);
269       g_signal_connect (G_OBJECT (assistant), "prepare",
270                         G_CALLBACK (prepare_callback), NULL);
271
272       page = get_test_page ("Introduction");
273       gtk_widget_show (page);
274       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
275       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Introduction");
276       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_INTRO);
277       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
278
279       page = add_completion_test_page (assistant, "Content", TRUE, FALSE);
280       next = add_completion_test_page (assistant, "More Content", TRUE, TRUE);
281
282       check = gtk_check_button_new_with_label ("Next page visible");
283       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
284       g_signal_connect (G_OBJECT (check), "toggled", 
285                         G_CALLBACK (visible_cb), next);
286       gtk_widget_show (check);
287       gtk_container_add (GTK_CONTAINER (page), check);
288       
289       add_completion_test_page (assistant, "Even More Content", TRUE, TRUE);
290
291       page = get_test_page ("Confirmation");
292       gtk_widget_show (page);
293       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
294       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
295       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
296       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
297
298       page = gtk_alignment_new (0.5, 0.5, 0.9, 0.0);
299       gtk_container_add (GTK_CONTAINER (page), gtk_progress_bar_new ());
300       gtk_widget_show_all (page);
301       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
302       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Progress");
303       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_PROGRESS);
304
305       page = gtk_check_button_new_with_label ("Summary complete");
306       gtk_widget_show (page);
307       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
308       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Summary");
309       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_SUMMARY);
310
311       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (page),
312                                     gtk_assistant_get_page_complete (GTK_ASSISTANT (assistant),
313                                                                      page));
314
315       pdata = g_new (PageData, 1);
316       pdata->assistant = GTK_ASSISTANT (assistant);
317       pdata->page = page;
318       g_signal_connect (page, "toggled",
319                       G_CALLBACK (complete_cb), pdata);
320     }
321
322   if (!gtk_widget_get_visible (assistant))
323     gtk_widget_show (assistant);
324   else
325     {
326       gtk_widget_destroy (assistant);
327       assistant = NULL;
328     }
329 }
330
331 static gchar selected_branch = 'A';
332
333 static void
334 select_branch (GtkWidget *widget, gchar branch)
335 {
336   selected_branch = branch;
337 }
338
339 static gint
340 nonlinear_assistant_forward_page (gint current_page, gpointer data)
341 {
342   switch (current_page)
343     {
344     case 0:
345       if (selected_branch == 'A')
346         return 1;
347       else
348         return 2;
349     case 1:
350     case 2:
351       return 3;
352     default:
353       return -1;
354     }
355 }
356
357 static void
358 create_nonlinear_assistant (GtkWidget *widget)
359 {
360   static GtkWidget *assistant = NULL;
361
362   if (!assistant)
363     {
364       GtkWidget *page, *button;
365
366       assistant = gtk_assistant_new ();
367       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
368
369       g_signal_connect (G_OBJECT (assistant), "cancel",
370                         G_CALLBACK (cancel_callback), NULL);
371       g_signal_connect (G_OBJECT (assistant), "close",
372                         G_CALLBACK (close_callback), NULL);
373       g_signal_connect (G_OBJECT (assistant), "apply",
374                         G_CALLBACK (apply_callback), NULL);
375       g_signal_connect (G_OBJECT (assistant), "prepare",
376                         G_CALLBACK (prepare_callback), NULL);
377
378       gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant),
379                                            nonlinear_assistant_forward_page,
380                                            NULL, NULL);
381
382       page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
383
384       button = gtk_radio_button_new_with_label (NULL, "branch A");
385       gtk_box_pack_start (GTK_BOX (page), button, FALSE, FALSE, 0);
386       g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (select_branch), GINT_TO_POINTER ('A'));
387       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
388       
389       button = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
390                                                 "branch B");
391       gtk_box_pack_start (GTK_BOX (page), button, FALSE, FALSE, 0);
392       g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (select_branch), GINT_TO_POINTER ('B'));
393
394       gtk_widget_show_all (page);
395       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
396       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
397       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
398       
399       page = get_test_page ("Page 2A");
400       gtk_widget_show (page);
401       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
402       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
403       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
404
405       page = get_test_page ("Page 2B");
406       gtk_widget_show (page);
407       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
408       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
409       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
410
411       page = get_test_page ("Confirmation");
412       gtk_widget_show (page);
413       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
414       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
415       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
416       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
417     }
418
419   if (!gtk_widget_get_visible (assistant))
420     gtk_widget_show (assistant);
421   else
422     {
423       gtk_widget_destroy (assistant);
424       assistant = NULL;
425     }
426 }
427
428 static gint
429 looping_assistant_forward_page (gint current_page, gpointer data)
430 {
431   switch (current_page)
432     {
433     case 0:
434       return 1;
435     case 1:
436       return 2;
437     case 2:
438       return 3;
439     case 3:
440       {
441         GtkAssistant *assistant;
442         GtkWidget *page;
443
444         assistant = (GtkAssistant*) data;
445         page = gtk_assistant_get_nth_page (assistant, current_page);
446
447         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (page)))
448           return 0;
449         else
450           return 4;
451       }
452     case 4:
453     default:
454       return -1;
455     }
456 }
457
458 static void
459 create_looping_assistant (GtkWidget *widget)
460 {
461   static GtkWidget *assistant = NULL;
462
463   if (!assistant)
464     {
465       GtkWidget *page;
466
467       assistant = gtk_assistant_new ();
468       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
469
470       g_signal_connect (G_OBJECT (assistant), "cancel",
471                         G_CALLBACK (cancel_callback), NULL);
472       g_signal_connect (G_OBJECT (assistant), "close",
473                         G_CALLBACK (close_callback), NULL);
474       g_signal_connect (G_OBJECT (assistant), "apply",
475                         G_CALLBACK (apply_callback), NULL);
476       g_signal_connect (G_OBJECT (assistant), "prepare",
477                         G_CALLBACK (prepare_callback), NULL);
478
479       gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant),
480                                            looping_assistant_forward_page,
481                                            assistant, NULL);
482
483       page = get_test_page ("Introduction");
484       gtk_widget_show (page);
485       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
486       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Introduction");
487       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_INTRO);
488       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
489
490       page = get_test_page ("Content");
491       gtk_widget_show (page);
492       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
493       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Content");
494       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
495
496       page = get_test_page ("More content");
497       gtk_widget_show (page);
498       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
499       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "More content");
500       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
501
502       page = gtk_check_button_new_with_label ("Loop?");
503       gtk_widget_show (page);
504       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
505       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Loop?");
506       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
507       
508       page = get_test_page ("Confirmation");
509       gtk_widget_show (page);
510       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
511       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
512       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
513       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
514     }
515
516   if (!gtk_widget_get_visible (assistant))
517     gtk_widget_show (assistant);
518   else
519     {
520       gtk_widget_destroy (assistant);
521       assistant = NULL;
522     }
523 }
524
525 static void
526 toggle_invisible (GtkButton *button, GtkAssistant *assistant)
527 {
528   GtkWidget *page;
529
530   page = gtk_assistant_get_nth_page (assistant, 1);
531
532   gtk_widget_set_visible (page, !gtk_widget_get_visible (page));
533 }
534
535 static void
536 create_full_featured_assistant (GtkWidget *widget)
537 {
538   static GtkWidget *assistant = NULL;
539
540   if (!assistant)
541     {
542       GtkWidget *page, *button;
543
544       assistant = gtk_assistant_new ();
545       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
546
547       button = gtk_button_new_from_stock (GTK_STOCK_STOP);
548       gtk_widget_show (button);
549       gtk_assistant_add_action_widget (GTK_ASSISTANT (assistant), button);
550       g_signal_connect (button, "clicked",
551                         G_CALLBACK (toggle_invisible), assistant);
552
553       g_signal_connect (G_OBJECT (assistant), "cancel",
554                         G_CALLBACK (cancel_callback), NULL);
555       g_signal_connect (G_OBJECT (assistant), "close",
556                         G_CALLBACK (close_callback), NULL);
557       g_signal_connect (G_OBJECT (assistant), "apply",
558                         G_CALLBACK (apply_callback), NULL);
559       g_signal_connect (G_OBJECT (assistant), "prepare",
560                         G_CALLBACK (prepare_callback), NULL);
561
562       page = get_test_page ("Page 1");
563       gtk_widget_show (page);
564       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
565       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
566       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
567
568       page = get_test_page ("Invisible page");
569       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
570       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
571       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
572
573       page = get_test_page ("Page 3");
574       gtk_widget_show (page);
575       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
576       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 3");
577       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
578       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
579     }
580
581   if (!gtk_widget_get_visible (assistant))
582     gtk_widget_show (assistant);
583   else
584     {
585       gtk_widget_destroy (assistant);
586       assistant = NULL;
587     }
588 }
589
590 struct {
591   gchar *text;
592   void  (*func) (GtkWidget *widget);
593 } buttons[] =
594   {
595     { "simple assistant",        create_simple_assistant },
596     { "anonymous assistant",        create_anonymous_assistant },
597     { "generous assistant",      create_generous_assistant },
598     { "nonlinear assistant",     create_nonlinear_assistant },
599     { "looping assistant",       create_looping_assistant },
600     { "full featured assistant", create_full_featured_assistant },
601   };
602
603 int
604 main (int argc, gchar *argv[])
605 {
606   GtkWidget *window, *box, *button;
607   gint i;
608
609   gtk_init (&argc, &argv);
610
611   if (g_getenv ("RTL"))
612     gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
613
614   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
615
616   g_signal_connect (G_OBJECT (window), "destroy",
617                     G_CALLBACK (gtk_main_quit), NULL);
618   g_signal_connect (G_OBJECT (window), "delete-event",
619                     G_CALLBACK (gtk_false), NULL);
620
621   box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
622   gtk_container_add (GTK_CONTAINER (window), box);
623
624   for (i = 0; i < G_N_ELEMENTS (buttons); i++)
625     {
626       button = gtk_button_new_with_label (buttons[i].text);
627
628       if (buttons[i].func)
629         g_signal_connect (G_OBJECT (button), "clicked",
630                           G_CALLBACK (buttons[i].func), NULL);
631
632       gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
633     }
634
635   gtk_widget_show_all (window);
636   gtk_main ();
637
638   return 0;
639 }