]> Pileus Git - ~andy/gtk/blob - tests/testassistant.c
GtkAssistant tests
[~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 static void
35 cancel_callback (GtkWidget *widget)
36 {
37   g_print ("cancel\n");
38
39   gtk_widget_hide (widget);
40 }
41
42 static void
43 close_callback (GtkWidget *widget)
44 {
45   g_print ("close\n");
46
47   gtk_widget_hide (widget);
48 }
49
50 static void
51 apply_callback (GtkWidget *widget)
52 {
53   g_print ("apply\n");
54 }
55
56 static gboolean
57 progress_timeout (GtkWidget *assistant)
58 {
59   GtkWidget *page, *progress;
60   gint current_page;
61   gdouble value;
62
63   current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (assistant));
64   page = gtk_assistant_get_nth_page (GTK_ASSISTANT (assistant), current_page);
65   progress = GTK_BIN (page)->child;
66
67   value  = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress));
68   value += 0.1;
69   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), value);
70
71   if (value >= 1.0)
72     {
73       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
74       return FALSE;
75     }
76
77   return TRUE;
78 }
79
80 static void
81 prepare_callback (GtkWidget *widget, GtkWidget *page)
82 {
83   if (GTK_IS_LABEL (page))
84     g_print ("prepare: %s\n", gtk_label_get_text (GTK_LABEL (page)));
85   else if (gtk_assistant_get_page_type (GTK_ASSISTANT (widget), page) == GTK_ASSISTANT_PAGE_PROGRESS)
86     {
87       GtkWidget *progress;
88
89       progress = GTK_BIN (page)->child;
90       gtk_assistant_set_page_complete (GTK_ASSISTANT (widget), page, FALSE);
91       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), 0.0);
92       g_timeout_add (300, (GSourceFunc) progress_timeout, widget);
93     }
94   else
95     g_print ("prepare: %d\n", gtk_assistant_get_current_page (GTK_ASSISTANT (widget)));
96 }
97
98 static void
99 create_simple_assistant (GtkWidget *widget)
100 {
101   static GtkWidget *assistant = NULL;
102
103   if (!assistant)
104     {
105       GtkWidget *page;
106
107       assistant = gtk_assistant_new ();
108       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
109
110       g_signal_connect (G_OBJECT (assistant), "cancel",
111                         G_CALLBACK (cancel_callback), NULL);
112       g_signal_connect (G_OBJECT (assistant), "close",
113                         G_CALLBACK (close_callback), NULL);
114       g_signal_connect (G_OBJECT (assistant), "apply",
115                         G_CALLBACK (apply_callback), NULL);
116       g_signal_connect (G_OBJECT (assistant), "prepare",
117                         G_CALLBACK (prepare_callback), NULL);
118
119       page = get_test_page ("Page 1");
120       gtk_widget_show (page);
121       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
122       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
123       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
124
125       page = get_test_page ("Page 2");
126       gtk_widget_show (page);
127       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
128       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
129       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
130       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
131     }
132
133   if (!GTK_WIDGET_VISIBLE (assistant))
134     gtk_widget_show (assistant);
135   else
136     {
137       gtk_widget_destroy (assistant);
138       assistant = NULL;
139     }
140 }
141
142 static void
143 create_generous_assistant (GtkWidget *widget)
144 {
145   static GtkWidget *assistant = NULL;
146
147   if (!assistant)
148     {
149       GtkWidget *page;
150
151       assistant = gtk_assistant_new ();
152       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
153
154       g_signal_connect (G_OBJECT (assistant), "cancel",
155                         G_CALLBACK (cancel_callback), NULL);
156       g_signal_connect (G_OBJECT (assistant), "close",
157                         G_CALLBACK (close_callback), NULL);
158       g_signal_connect (G_OBJECT (assistant), "apply",
159                         G_CALLBACK (apply_callback), NULL);
160       g_signal_connect (G_OBJECT (assistant), "prepare",
161                         G_CALLBACK (prepare_callback), NULL);
162
163       page = get_test_page ("Introduction");
164       gtk_widget_show (page);
165       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
166       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Introduction");
167       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_INTRO);
168       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
169
170       page = get_test_page ("Content");
171       gtk_widget_show (page);
172       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
173       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Content");
174       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
175
176       page = get_test_page ("More content");
177       gtk_widget_show (page);
178       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
179       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "More content");
180       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
181       
182       page = get_test_page ("Confirmation");
183       gtk_widget_show (page);
184       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
185       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
186       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
187       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
188
189       page = gtk_alignment_new (0.5, 0.5, 0.9, 0.0);
190       gtk_container_add (GTK_CONTAINER (page), gtk_progress_bar_new ());
191       gtk_widget_show_all (page);
192       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
193       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Progress");
194       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_PROGRESS);
195
196       page = get_test_page ("Summary");
197       gtk_widget_show (page);
198       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
199       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Summary");
200       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_SUMMARY);
201       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
202     }
203
204   if (!GTK_WIDGET_VISIBLE (assistant))
205     gtk_widget_show (assistant);
206   else
207     {
208       gtk_widget_destroy (assistant);
209       assistant = NULL;
210     }
211 }
212
213 static gchar selected_branch = 'A';
214
215 static void
216 select_branch (GtkWidget *widget, gchar branch)
217 {
218   selected_branch = branch;
219 }
220
221 static gint
222 nonlinear_assistant_forward_page (gint current_page, gpointer data)
223 {
224   switch (current_page)
225     {
226     case 0:
227       if (selected_branch == 'A')
228         return 1;
229       else
230         return 2;
231     case 1:
232     case 2:
233       return 3;
234     default:
235       return -1;
236     }
237 }
238
239 static void
240 create_nonlinear_assistant (GtkWidget *widget)
241 {
242   static GtkWidget *assistant = NULL;
243
244   if (!assistant)
245     {
246       GtkWidget *page, *button;
247
248       assistant = gtk_assistant_new ();
249       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
250
251       g_signal_connect (G_OBJECT (assistant), "cancel",
252                         G_CALLBACK (cancel_callback), NULL);
253       g_signal_connect (G_OBJECT (assistant), "close",
254                         G_CALLBACK (close_callback), NULL);
255       g_signal_connect (G_OBJECT (assistant), "apply",
256                         G_CALLBACK (apply_callback), NULL);
257       g_signal_connect (G_OBJECT (assistant), "prepare",
258                         G_CALLBACK (prepare_callback), NULL);
259
260       gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant),
261                                            nonlinear_assistant_forward_page,
262                                            NULL, NULL);
263
264       page = gtk_vbox_new (FALSE, 6);
265
266       button = gtk_radio_button_new_with_label (NULL, "branch A");
267       gtk_box_pack_start (GTK_BOX (page), button, FALSE, FALSE, 0);
268       g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (select_branch), GINT_TO_POINTER ('A'));
269       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
270       
271       button = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
272                                                 "branch B");
273       gtk_box_pack_start (GTK_BOX (page), button, FALSE, FALSE, 0);
274       g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (select_branch), GINT_TO_POINTER ('B'));
275
276       gtk_widget_show_all (page);
277       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
278       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
279       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
280       
281       page = get_test_page ("Page 2A");
282       gtk_widget_show (page);
283       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
284       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2A");
285       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
286
287       page = get_test_page ("Page 2B");
288       gtk_widget_show (page);
289       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
290       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2B");
291       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
292
293       page = get_test_page ("Confirmation");
294       gtk_widget_show (page);
295       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
296       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
297       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
298       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
299     }
300
301   if (!GTK_WIDGET_VISIBLE (assistant))
302     gtk_widget_show (assistant);
303   else
304     {
305       gtk_widget_destroy (assistant);
306       assistant = NULL;
307     }
308 }
309
310 static gint
311 looping_assistant_forward_page (gint current_page, gpointer data)
312 {
313   switch (current_page)
314     {
315     case 0:
316       return 1;
317     case 1:
318       return 2;
319     case 2:
320       return 3;
321     case 3:
322       {
323         GtkAssistant *assistant;
324         GtkWidget *page;
325
326         assistant = (GtkAssistant*) data;
327         page = gtk_assistant_get_nth_page (assistant, current_page);
328
329         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (page)))
330           return 0;
331         else
332           return 4;
333       }
334     case 4:
335     default:
336       return -1;
337     }
338 }
339
340 static void
341 create_looping_assistant (GtkWidget *widget)
342 {
343   static GtkWidget *assistant = NULL;
344
345   if (!assistant)
346     {
347       GtkWidget *page;
348
349       assistant = gtk_assistant_new ();
350       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
351
352       g_signal_connect (G_OBJECT (assistant), "cancel",
353                         G_CALLBACK (cancel_callback), NULL);
354       g_signal_connect (G_OBJECT (assistant), "close",
355                         G_CALLBACK (close_callback), NULL);
356       g_signal_connect (G_OBJECT (assistant), "apply",
357                         G_CALLBACK (apply_callback), NULL);
358       g_signal_connect (G_OBJECT (assistant), "prepare",
359                         G_CALLBACK (prepare_callback), NULL);
360
361       gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant),
362                                            looping_assistant_forward_page,
363                                            assistant, NULL);
364
365       page = get_test_page ("Introduction");
366       gtk_widget_show (page);
367       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
368       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Introduction");
369       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_INTRO);
370       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
371
372       page = get_test_page ("Content");
373       gtk_widget_show (page);
374       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
375       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Content");
376       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
377
378       page = get_test_page ("More content");
379       gtk_widget_show (page);
380       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
381       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "More content");
382       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
383
384       page = gtk_check_button_new_with_label ("Loop?");
385       gtk_widget_show (page);
386       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
387       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Loop?");
388       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
389       
390       page = get_test_page ("Confirmation");
391       gtk_widget_show (page);
392       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
393       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
394       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
395       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
396     }
397
398   if (!GTK_WIDGET_VISIBLE (assistant))
399     gtk_widget_show (assistant);
400   else
401     {
402       gtk_widget_destroy (assistant);
403       assistant = NULL;
404     }
405 }
406
407 struct {
408   gchar *text;
409   void  (*func) (GtkWidget *widget);
410 } buttons[] =
411   {
412     { "simple assistant",    create_simple_assistant },
413     { "generous assistant",  create_generous_assistant },
414     { "nonlinear assistant", create_nonlinear_assistant },
415     { "looping assistant",   create_looping_assistant },
416   };
417
418 int
419 main (int argc, gchar *argv[])
420 {
421   GtkWidget *window, *box, *button;
422   gint i;
423
424   gtk_init (&argc, &argv);
425
426   if (g_getenv ("RTL"))
427     gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
428
429   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
430
431   g_signal_connect (G_OBJECT (window), "destroy",
432                     G_CALLBACK (gtk_main_quit), NULL);
433   g_signal_connect (G_OBJECT (window), "delete-event",
434                     G_CALLBACK (gtk_false), NULL);
435
436   box = gtk_vbox_new (FALSE, 6);
437   gtk_container_add (GTK_CONTAINER (window), box);
438
439   for (i = 0; i < G_N_ELEMENTS (buttons); i++)
440     {
441       button = gtk_button_new_with_label (buttons[i].text);
442
443       if (buttons[i].func)
444         g_signal_connect (G_OBJECT (button), "clicked",
445                           G_CALLBACK (buttons[i].func), NULL);
446
447       gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
448     }
449
450   gtk_widget_show_all (window);
451   gtk_main ();
452
453   return 0;
454 }