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