Chapitre 20
Les barres de progression

Les barres de progression sont utilisées pour montrer l’état d’avancement d’une opération. Elles sont plutôt faciles à utiliser, comme vous le verrez dans le programme ci-dessous. Mais, tout d’abord voyons comment créer une nouvelle barre de progression :

$progress = Gtk2::ProgressBar->new();

Maintenant que votre barre de progression est créée vous pouvez utiliser :

$progress->set_fraction($percentage );
L’argument est la quantité “réalisée”, ce qui signifie que la barre sera remplie d’une quantité variant de 0 à 100%. Cette quantité est passée à la fonction à l’aide d’un nombre réel compris entre 0.0 et 1.0.

Le sens de remplissage de la barre de progression peut être indiqué par :

$progress->set_orientation( $orientation );
L’argument $orientation qui peut prendre les valeur suivantes :

En plus de vous indiquer le degré d’avancement d’un processus, la barre de progression peut être utilisée juste pour montrer qu’il y a de l’activité. Cela peut être utile si la progression ne peut pas être mesurée par une valeur échelle. Le mode activité n’est pas affecté par le style de la barre de progression qui est décrit ci-dessus et ne s’en accomode pas. Pour indiquer qu’il y a de l’activité, on utilise la fonction suivante :

$progress->pulse();
La taille de chaque pas de l’indicateur d’activité et le nombre de blocks sont déclarés avec les fonctions suivantes :
$progress->set_pulse_step($fraction);

En mode continu, la barre de progression peut aussi afficher une chaîne de texte à l’intérieur de la glissière avec la fonction :

$progress->set_text( $text );
Pour effacer le texte de la barre de progression, il suffit de passer comme argument une chaîne vide ””. On peut récupérer le texte de la barre de progression grâce à la fonction :
$text = $progress->get_text();
Les barres de progression sont généralement utilisées avec des temps morts et d’autres fonctions de ce genre pour donner l’impression du multitâche. Voici un petit exemple d’utilisation :
barredeprogression

# !/usr/bin/perl -w


use Gtk2 ’-init’ ;

use constant TRUE => 1 ;
use constant FALSE => 0 ;

my $activity_mode = FALSE ;


my $window = Gtk2::Window->new( ”toplevel” ) ;
$window->signal_connect( ”destroy” , sub { Gtk2->main_quit ; } ) ;
$window->set_title( ”Barre de progression” ) ;
$window->set_border_width( 0 ) ;

my $vbox = Gtk2::VBox->new( FALSE, 5 ) ;
$vbox->set_border_width( 10 ) ;
$window->add( $vbox ) ;
$vbox->show() ;


# Centre les objets
my $align = Gtk2::Alignment->new( 0.5 , 0.5 , 0 , 0 ) ;
$vbox->pack_start( $align, FALSE, FALSE, 5 ) ;
$align->show() ;

# Crée la barre de progression
my $pbar = Gtk2::ProgressBar->new() ;
$align->add( $pbar ) ;
$pbar->show() ;

# Ajoute une routine timer pour mettre à jour la barre de progression
my $timer= Glib::Timeout->add(100 ,\&progress_timeout) ;

my $separator = Gtk2::HSeparator->new() ;
$vbox->pack_start( $separator, FALSE, FALSE, 0 ) ;
$separator->show() ;

# Ajoute une case à cocher pour sélectionner l’affichage ou non du texte
# dans la glissière
my $check1 = Gtk2::CheckButton->new( ”Montre le texte” ) ;
$vbox->pack_start( $check1, FALSE, TRUE, 0 ) ;
$check1->signal_connect( ”clicked” , \&show_texte) ;
$check1->show() ;

# Ajoute un bouton toggle pour choisir ou non le mode activité
$check2 = Gtk2::CheckButton->new( ”Mode activité” ) ;
$vbox->pack_start( $check2, FALSE, TRUE, 0 ) ;
$check2->signal_connect( ”clicked” ,\&activity_mode_changed ) ;
$check2->show() ;


# Un menu à option pour choisir l’orientation de la barre de progression
my $opt = Gtk2::OptionMenu->new() ;
my $menu = Gtk2::Menu->new() ;
# Premier élément du menu
my $item = make_menu_item( ”de gauche à droite” , \&cb_pos_menu_select, ’left_to_right’ ) ;
$menu->append( $item ) ;
# Second élément du menu
$item = make_menu_item( ”de droite à gauche” , \&cb_pos_menu_select, ’right_to_left’ ) ;
$menu->append( $item ) ;
# Troisième élément du menu
$item = make_menu_item( ”de haut en bas” , \&cb_pos_menu_select, ’top_to_bottom’ ) ;
$menu->append( $item ) ;
# Quatrième élément du menu
$item = make_menu_item( ”de bas en haut” , \&cb_pos_menu_select, ’bottom_to_top’ ) ;
$menu->append( $item ) ;
# On place de tout dans le menu puis dans la boîte
$opt->set_menu( $menu ) ;
$vbox->pack_start( $opt, FALSE, TRUE, 0 ) ;
$opt->show() ;

my $separator2 = Gtk2::HSeparator->new() ;
$vbox->pack_start( $separator2, FALSE, FALSE, 0 ) ;
$separator->show() ;



# Ajoute un bouton pour sortir du programme
my $button = Gtk2::Button->new_from_stock( ”gtk-quit” ) ;
$button->signal_connect( ”clicked” , sub { Gtk2->main_quit ; } ) ;
$vbox->pack_start( $button, FALSE, FALSE, 0 ) ;

# Ceci en fait le bouton par défaut.
$button->can_default( TRUE ) ;

# Ce permet au bouton d’être le bouton oncerné par les évènemnts
# Appuyer juste sur la touche “Entrée” et le bouton sera activé
$button->grab_default() ;
$button->show() ;
$window->show() ;

Gtk2->main ;

### Les fonctions de rappels

sub progress_timeout {
my ( $widget) = @_ ;
my $new_val ;
# On met à jour l’affichage de la barre de progression
# en prenant en distinguant le mode activité du mode normal
if ($activity_mode){
$pbar->set_pulse_step(0.1 ) ;
$pbar->pulse() ;
}
else {
$new_val = $pbar->get_fraction ;
$new_val = $new_val + 0.01 ;
if ($new_val > 1 ) {
$new_val = 0 ;
}
$pbar->set_fraction($new_val) ;
}
return ( TRUE ) ;
}

sub activity_mode_changed {
my ($widget)=@_ ;
# On change la valeur de la variable $activity_mode en fonction
# de l’état du bouton
if ($widget->get_active){
$activity_mode = TRUE ;
$pbar->pulse() ;
}
else {
$activity_mode = FALSE ;
$pbar->set_fraction(0.0 ) ;
}
}

sub show_texte{
my ($widget) = @_ ;
# On ajoute le texte en fonction de l’état du bouton
if ($widget->get_active){
$pbar->set_text(”Un petit texte !” ) ;
}
else {
$pbar->set_text(”” ) ;
}
}

# Les fonctions qui permettent de créer un menu rapidement

sub make_menu_item
{
my ( $name, $callback, $data ) = @_ ;
my $item ;
$item = Gtk2::MenuItem->new( $name ) ;
$item->signal_connect( ”activate” , $callback, $data ) ;
$item->show() ;
return $item ;
}

sub cb_pos_menu_select
{
my ( $item, $orientation ) = @_ ;
$pbar->set_orientation($orientation) ;
}