#!/usr/bin/perl -w # # GTK - The GIMP Toolkit # Copyright (C) 1999 Red Hat, Inc. # Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> # Copyright (C) 2003 Matthias Clasen <mclasen@redhat.com> # Copyright (C) 2005 Carlos Garnacho Parro <carlosg@gnome.org> # Copyright (C) 2006 muppet <scott at asofyet dot org> # # All rights reserved. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # use strict; use Gtk2 -init; use Glib ':constants'; sub get_test_page { return Gtk2::Label->new (shift); } sub complete_cb { my ($check, $data) = @_; $data->{assistant}->set_page_complete ($data->{page}, $check->get_active); } sub add_completion_test_page { my ($assistant, $text, $visible, $complete) = @_; my $page = Gtk2::VBox->new; my $check = Gtk2::CheckButton->new_with_label ("Complete"); $page->add (Gtk2::Label->new ($text)); $page->add ($check); $check->set_active ($complete); my %pdata = ( assistant => $assistant, page => $page, ); $check->signal_connect (toggled => \&complete_cb, \%pdata); $page->show_all if $visible; $assistant->append_page ($page); $assistant->set_page_title ($page, $text); $assistant->set_page_complete ($page, $complete); return $page; } sub cancel_callback { my $widget = shift; print "cancel\n"; $widget->hide; } sub close_callback { my $widget = shift; print "close\n"; $widget->hide; } sub apply_callback { my $widget = shift; print "apply\n"; } sub progress_timeout { my $assistant = shift; my $current_page = $assistant->get_current_page; my $page = $assistant->get_nth_page ($current_page); my $progress = $page->child; my $value = $progress->get_fraction; $value += 0.1; $progress->set_fraction ($value); if ($value >= 1.0) { $assistant->set_page_complete ($page, TRUE); return FALSE; } return TRUE; } sub prepare_callback { my ($assistant, $page) = @_; if ($page->isa ('Gtk2::Label')) { print "prepare: ".$page->get_text."\n"; } elsif ($assistant->get_page_type ($page) eq 'progress') { my $progress = $page->child; $assistant->set_page_complete ($page, FALSE); $progress->set_fraction (0.0); Glib::Timeout->add (300, \&progress_timeout, $assistant); } else { print "prepare: ".$assistant->get_current_page,"\n"; } } sub create_simple_assistant { my $widget = shift; my $assistant = $widget->{assistant}; if (!$assistant) { $assistant = Gtk2::Assistant->new; $assistant->set_default_size (400, 300); $assistant->signal_connect (cancel => \&cancel_callback); $assistant->signal_connect (close => \&close_callback); $assistant->signal_connect (apply => \&apply_callback); $assistant->signal_connect (prepare => \&prepare_callback); my $page = get_test_page ("Page 1"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 1"); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("Page 2"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 2"); $assistant->set_page_type ($page, 'confirm'); $assistant->set_page_complete ($page, TRUE); } if (!$assistant->visible) { $assistant->show; } else { $assistant->destroy; $assistant = undef; } $widget->{assistant} = $assistant; } sub visible_cb { my ($check, $page) = @_; $page->set (visible => $check->get_active); } sub create_generous_assistant { my ($widget) = @_; my $assistant = $widget->{assistant}; if (!$assistant) { $assistant = Gtk2::Assistant->new; $assistant->set_default_size (400, 300); $assistant->signal_connect (cancel => \&cancel_callback); $assistant->signal_connect (close => \&close_callback); $assistant->signal_connect (apply => \&apply_callback); $assistant->signal_connect (prepare => \&prepare_callback); my $page = get_test_page ("Introduction"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Introduction"); $assistant->set_page_type ($page, 'intro'); $assistant->set_page_complete ($page, TRUE); $page = add_completion_test_page ($assistant, "Content", TRUE, FALSE); my $next = add_completion_test_page ($assistant, "More Content", TRUE, TRUE); my $check = Gtk2::CheckButton->new ("Next page visible"); $check->set_active (TRUE); $check->signal_connect (toggled => \&visible_cb, $next); $check->show; $page->add ($check); add_completion_test_page ($assistant, "Even More Content", TRUE, TRUE); $page = get_test_page ("Confirmation"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Confirmation"); $assistant->set_page_type ($page, 'confirm'); $assistant->set_page_complete ($page, TRUE); $page = Gtk2::Alignment->new (0.5, 0.5, 0.9, 0.0); $page->add (Gtk2::ProgressBar->new ()); $page->show_all; $assistant->append_page ($page); $assistant->set_page_title ($page, "Progress"); $assistant->set_page_type ($page, 'progress'); $page = get_test_page ("Summary"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Summary"); $assistant->set_page_type ($page, 'summary'); $assistant->set_page_complete ($page, TRUE); } if (!$assistant->visible) { $assistant->show; } else { $assistant->destroy; $assistant = undef; } $widget->{assistant} = $assistant; } my $selected_branch = 'A'; sub select_branch { my ($widget, $branch) = @_; $selected_branch = $branch; } sub nonlinear_assistant_forward_page { my ($current_page, $data) = @_; if ($current_page == 0) { return $selected_branch eq 'A' ? 1 : 2; } elsif ($current_page == 1 || $current_page == 2) { return 3; } else { return -1; } } sub create_nonlinear_assistant { my ($widget) = @_; my $assistant = $widget->{assistant}; if (!$assistant) { $assistant = Gtk2::Assistant->new (); $assistant->set_default_size (400, 300); $assistant->signal_connect (cancel => \&cancel_callback); $assistant->signal_connect (close => \&close_callback); $assistant->signal_connect (apply => \&apply_callback); $assistant->signal_connect (prepare => \&prepare_callback); $assistant->set_forward_page_func (\&nonlinear_assistant_forward_page); my $page = Gtk2::VBox->new (FALSE, 6); my $button = Gtk2::RadioButton->new_with_label (undef, "branch A"); $page->pack_start ($button, FALSE, FALSE, 0); $button->signal_connect (toggled => \&select_branch, 'A'); $button->set_active (TRUE); $button = Gtk2::RadioButton->new_with_label ($button->get_group, "branch B"); $page->pack_start ($button, FALSE, FALSE, 0); $button->signal_connect (toggled => \&select_branch, 'B'); $page->show_all; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 1"); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("Page 2A"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 2A"); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("Page 2B"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 2B"); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("Confirmation"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Confirmation"); $assistant->set_page_type ($page, 'confirm'); $assistant->set_page_complete ($page, TRUE); } if (!$assistant->visible) { $assistant->show; } else { $assistant->destroy; $assistant = undef; } $widget->{assistant} = $assistant; } sub looping_assistant_forward_page { my ($current_page, $assistant) = @_; print "@_\n"; if ($current_page == 0) { return 1; } elsif ($current_page == 1) { return 2; } elsif ($current_page == 2) { return 3; } elsif ($current_page == 3) { my $page = $assistant->get_nth_page ($current_page); return $page->get_active ? 0 : 4; } else { return -1; } } sub create_looping_assistant { my $widget = shift; my $assistant = $widget->{assistant}; if (!$assistant) { $assistant = Gtk2::Assistant->new (); $assistant->set_default_size (400, 300); $assistant->signal_connect (cancel => \&cancel_callback); $assistant->signal_connect (close => \&close_callback); $assistant->signal_connect (apply => \&apply_callback); $assistant->signal_connect (prepare => \&prepare_callback); $assistant->set_forward_page_func (\&looping_assistant_forward_page, $assistant); my $page = get_test_page ("Introduction"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Introduction"); $assistant->set_page_type ($page, 'intro'); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("Content"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Content"); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("More content"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "More content"); $assistant->set_page_complete ($page, TRUE); $page = Gtk2::CheckButton->new_with_label ("Loop?"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Loop?"); $assistant->set_page_complete ($page, TRUE); $page = get_test_page ("Confirmation"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Confirmation"); $assistant->set_page_type ($page, 'confirm'); $assistant->set_page_complete ($page, TRUE); } if (!$assistant->visible) { $assistant->show; } else { $assistant->destroy; $assistant = undef; } $widget->{assistant} = $assistant; } sub create_full_featured_assistant { my $widget = shift; my $assistant = $widget->{assistant}; if (!$assistant) { $assistant = Gtk2::Assistant->new (); $assistant->set_default_size (400, 300); my $button = Gtk2::Button->new_from_stock ('stop'); $button->show; $assistant->add_action_widget ($button); $assistant->signal_connect (cancel => \&cancel_callback); $assistant->signal_connect (close => \&close_callback); $assistant->signal_connect (apply => \&apply_callback); $assistant->signal_connect (prepare => \&prepare_callback); my $page = get_test_page ("Page 1"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 1"); $assistant->set_page_complete ($page, TRUE); # set a side image my $pixbuf = $page->render_icon ('gtk-dialog-warning', 'dialog'); $assistant->set_page_side_image ($page, $pixbuf); # set a header image $pixbuf = $page->render_icon ('gtk-dialog-info', 'dialog'); $assistant->set_page_header_image ($page, $pixbuf); $page = get_test_page ("Invisible page"); $assistant->append_page ($page); $page = get_test_page ("Page 3"); $page->show; $assistant->append_page ($page); $assistant->set_page_title ($page, "Page 3"); $assistant->set_page_type ($page, 'confirm'); $assistant->set_page_complete ($page, TRUE); # set a header image $pixbuf = $page->render_icon ('gtk-dialog-info', 'dialog'); $assistant->set_page_header_image ($page, $pixbuf); } if (!$assistant->visible) { $assistant->show; } else { $assistant->destroy; $assistant = undef; } $widget->{assistant} = $assistant; } { Gtk2::Widget->set_default_direction ('rtl') if $ENV{'RTL'}; my $window = Gtk2::Window->new; $window->signal_connect (destroy => sub { Gtk2->main_quit }); $window->signal_connect (delete_event => sub { FALSE }); my $box = Gtk2::VBox->new; $window->add ($box); my @tests = ( { text => "simple assistant", func => \&create_simple_assistant }, { text => "generous assistant", func => \&create_generous_assistant }, { text => "nonlinear assistant", func => \&create_nonlinear_assistant }, { text => "looping assistant", func => \&create_looping_assistant }, { text => "full featured assistant", func => \&create_full_featured_assistant }, ); foreach my $test (@tests) { my $button = Gtk2::Button->new ($test->{text}); $button->signal_connect (clicked => $test->{func}); $box->pack_start ($button, TRUE, TRUE, 0); } $window->show_all; Gtk2->main (); }