Chapitre 10
La barre d’outils

La barre d’outils est très utile pour placer en dessous du menu les commandes les plus utilisées comme faire/défaire, nouveau, ouvrir, sauvegarde, etc. Un widge Gtk2::Toolbar est indispensable pour à toute bonne application.

Utiliser une barre d’outils

Comme pour tous les autres widget, c’est très simple :

$toolbar = Gtk2::Toolbar->new();

GtkToolbar étant un container, après l’avoir créée, il va falloir y ajouter des widgets. Cela se divise en 2 catégories.

Voici les premières fonctions qui permettent d’ajouter un bouton avec du texte et (ou) un icône :

$toolbar->append_item ($text, $tooltip_text, $tooltip_private_text,  
          $icon, $callback, $user_data);  
$toolbar->prepend_item ($text, $tooltip_text, $tooltip_private_text,  
          $icon, $callback, $user_data);  
$toolbar->insert_item ($text,$tooltip_text,$tooltip_private_text,  
          $icon, $callback, $user_data, $position);

La première fonction ajoute un bouton à la suite des autres boutons, la seconde l’ajoute en première position et la dernière à une position spécifique. Le paramètre $text n’est autre que le label du bouton. Le troisième paramètre, $tooltip_text, est le texte de la bulle d’aide. Le paramètre suivant, tooltip_private_text, n’est plus utilisé car la partie qui gère ce paramètre est obsolète. Il faut donc mettre ce paramètre à undef. Le paramètre $icon est là pour définir l’image qui sera associée au bouton. Les deux paramètres servent à connecter une fonction de rappel au clic sur le bouton. Le paramètre callback est en fait le nom de la fonction de rappel et $user_data est la donnée supplémentaire à passer à la fonction de rappel. Et pour terminer, la fonction insert_item possède un paramètre supplémentaire position qui détermine à quelle position le bouton doit être ajouté. Si cette valeur est soit trop grande, soit négative, cette fonction aura le même effect que append_item.

Ensuite il est possible de créer des éléments selon un type de widget prédéfini, comme Gtk2::RadioButton, Gtk2::ToggleButton, Gtk2::Button :

$toolbar->append_element ( $type, $widget, $text,  
          $tooltip_text, $tooltip_private_text, $icon, $callback, $user_data);  
$toolbar->prepend_element ( $type, $widget, $text,  
          $tooltip_text, $tooltip_private_text, $icon, $callback, $user_data);  
$toolbar->insert_element ( $type, $widget, $text,  
          $tooltip_text, $tooltip_private_text, $icon, $callback, $user_data,$position);

La majorité des paramètres de ces fonctions ont été détaillés précédemment, nous n’allons donc étudier que les nouveaux. Tout d’abord, le paramètre $type permet de définir le type de widget que nous allons ajouter, et peut prendre une de ces valeurs :

Il y a ensuite le paramètre $widget qui doit être utiliser dans deux cas. Le premier cas est bien entendu, si nous ajoutons un élément de type 'widget'. Alors $widget sera en fait le widget que nous voulons ajouter.

Le deuxième cas est si nous ajoutons un élément de type 'radiobutton'. Nous avons vu que les boutons radio fonctionnaient par groupe, alors dans ce cas, pour grouper les boutons radios le paramètre $widget doit être un bouton radio ajouté précédemment pour que Gtk2-Perl puisse les grouper. Bien sûr, s’il s’agit du premier bouton radio, il faut mettre widget à undef. Dans tous les autres cas, le paramètre widget doit obligatoirement être undef.

Et maintenant, voila les fonctions pour ajouter n’importe quel type de widget :

$toolbar->append_widget ($widget, $tooltip_text, $tooltip_private_text);  
$toolbar->prepend_widget ($widget, $tooltip_text, $tooltip_private_text);  
$toolbar->insert_widget ($widget, $tooltip_text, $tooltip_private_text, $position );

Cette fois, tout est simple, le paramètre $widget est simplement le widget que nous voulons ajouter. Il faudra tout de même connecter manuellement les signaux du widget ajouté.

Pour finir, il est possible d’utiliser les StockItem pour créer un bouton. Voici la fonction qui permet cela :

$toolbar->insert_stock ($stock_id, $tooltip_text, $tooltip_private_text,  
          $callback, $user_data, $position);

Le paramètre $stock_id est tout simplement l’identifiant du GtkStockItem qui figurera sur le bouton.

Les espaces

Nous avons déjà vu que les fonctions de type *_element permettaient d’ajouter un espace pour rendre plus claire la barre d’outils. Il existe en plus de cela trois autres fonctions :

$toolbar->append_space();  
$toolbar->prepend_space();  
$toolbar->insert_space( $position );

Comme d’habitude la première fonction ajoute un espace à la suite des autres éléments, la deuxième au tout début de la barre d’outils et la troisième à une position particulière.

Pour supprimer un espace de la barre d’outils, il existe cette fonction :

$toolbar->remove_space($position);

Orientation de la barre d’outils.

La barre d’outils peut être orienter verticalement ou horizontalement et cela à n’importe quel moment a l’aide de cette fonction :

$toolbar->set_orientation( $orientation) ;

Le paramètre $orientation peut prendre deux valeurs :

Et, cette fonction permet de connaître l’orientation de la barre d’outils :

$toolbar->get_orientation();

Les styles.

Il est possible de changer la façon d’afficher certains éléments de la barre d’outils : afficher que le texte, seulement les icônes ou les deux. Voila la fonction qui permet de contrôler cela :

$toolbar->set_style( $style) ;

Le paramètre style peut prendre 4 valeurs différentes :

Et pour finir, cette fonction permet de connaître le style de la barre d’outils :

$toolbar->get_style();

La taille des icônes.

Enfin pour terminer, Gtk2-Perl nous offre la possibilité de modifier la taille des icônes de la barre d’outils avec cette fonction :

$toolbar->set_icon_size( $icon_size);

Le paramètre $icon_size est du type GtkIconSize que nous avons déjà rencontré dans le chapitre sur les images. Nous allons tout de même rappeler les différentes valeurs possibles qui sont les suivantes :

Et bien sûr, pour connaître la taille des icônes, nous avons la fonction :

$toolbar->get_icon_size();

Exemple.

Dans cet exemple, nous allons juste créer une barre d’outils dans laquelle nous allons ajouter quelques boutons dont deux d’entre eux permettront de changer l’orientation de la barre d’outils, une image et une zone de saisie. Vous remarquerez que le texte associé à l’icône n’est pas défini par l’utilisateur ce qui fait que le texte affiché est “suivant” alors que la flêche sert à placer la barre horizontalement. Un jour, je prendrais peut-être le temps de voir comment faire cela !

La méthode pour insérer l’image n’est certainement pas la plus pratique. Vous pouvez voir une autre approche en analisant le code de appwindow.pl fourni parmi les exemples de Gtk2-Perl.

toolbar1

# !/usr/bin/perl -w

use strict ;
use Gtk2 ’-init’ ;
use constant TRUE => 1 ;
use constant FALSE => 0 ;


# l’image que l’on veut insérer dans la barre au format xpm

my @gtk_xpm = ( ’32 39 5 1’ ,
’. c none’ ,
’+ c black’ ,
’@ c #3070E0’ ,
’# c #F05050’ ,
’$ c #35E035’ ,
’................+...............’ ,
’..............+++++.............’ ,
’............+++++@@++...........’ ,
’..........+++++@@@@@@++.........’ ,
’........++++@@@@@@@@@@++........’ ,
’......++++@@++++++++@@@++.......’ ,
’.....+++@@@+++++++++++@@@++.....’ ,
’...+++@@@@+++@@@@@@++++@@@@+....’ ,
’..+++@@@@+++@@@@@@@@+++@@@@@++..’ ,
’.++@@@@@@+++@@@@@@@@@@@@@@@@@@++’ ,
’.+#+@@@@@@++@@@@+++@@@@@@@@@@@@+’ ,
’.+##++@@@@+++@@@+++++@@@@@@@@$@.’ ,
’.+###++@@@@+++@@@+++@@@@@++$$$@.’ ,
’.+####+++@@@+++++++@@@@@+@$$$$@.’ ,
’.+#####+++@@@@+++@@@@++@$$$$$$+.’ ,
’.+######++++@@@@@@@++@$$$$$$$$+.’ ,
’.+#######+##+@@@@+++$$$$$$@@$$+.’ ,
’.+###+++##+##+@@++@$$$$$$++$$$+.’ ,
’.+###++++##+##+@@$$$$$$$@+@$$@+.’ ,
’.+###++++++#+++@$$@+@$$@++$$$@+.’ ,
’.+####+++++++#++$$@+@$$++$$$$+..’ ,
’.++####++++++#++$$@+@$++@$$$$+..’ ,
’.+#####+++++##++$$++@+++$$$$$+..’ ,
’.++####+++##+#++$$+++++@$$$$$+..’ ,
’.++####+++####++$$++++++@$$$@+..’ ,
’.+#####++#####++$$+++@++++@$@+..’ ,
’.+#####++#####++$$++@$$@+++$@@..’ ,
’.++####++#####++$$++$$$$$+@$@++.’ ,
’.++####++#####++$$++$$$$$$$$+++.’ ,
’.+++####+#####++$$++$$$$$$$@+++.’ ,
’..+++#########+@$$+@$$$$$$+++...’ ,
’...+++########+@$$$$$$$$@+++....’ ,
’.....+++######+@$$$$$$$+++......’ ,
’......+++#####+@$$$$$@++........’ ,
’.......+++####+@$$$$+++.........’ ,
’.........++###+$$$@++...........’ ,
’..........++##+$@+++............’ ,
’...........+++++++..............’ ,
’.............++++...............’ ) ;


my $item ;

# la fenêtre principale
my $window = Gtk2::Window->new(’toplevel’ ) ;
$window->signal_connect( ”destroy” , sub { Gtk2->main_quit() ; } ) ;
$window->set_title(”La barre d’outils” ) ;
$window->set_default_size(200 ,80 ) ;

my $vbox = Gtk2::VBox->new(FALSE,0 ) ;
$window->add($vbox) ;

#Création de la barre d’outils
my $toolbar = Gtk2::Toolbar->new() ;
$vbox->pack_start($toolbar,FALSE,FALSE,0 ) ;

$toolbar->insert_stock(’gtk-new’ ,’Nouveau’ ,undef,\&on_clicked,’Nouveau’ ,-1 ) ;
$toolbar->insert_stock(’gtk-open’ ,’Ouvrir’ ,undef,\&on_clicked,’Ouvrir’ ,-1 ) ;
$toolbar->insert_stock(’gtk-save’ ,’Enregistrer’ ,undef,\&on_clicked,’Enregistrer’ ,-1 ) ;
$toolbar->insert_stock(’gtk-quit’ ,’Quitter’ ,undef,\&quitter,undef,-1 ) ;

# Insertion d’un espace
$toolbar->insert_space(10 ) ;

# On veut maintenant insérer une image dans la barre d’outils.
# On crée d’abord un objet Gtk2::Gdk::Pixbuf à partir du fichier xpm
# présent plus haut.
my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_xpm_data(@gtk_xpm ) ;

# Nous devons ensuite créer une image car il faut que l’objet à ajouter
# à la barre soit un héritier de Gtk2::Widget.
my $image = Gtk2::Image->new_from_pixbuf($pixbuf) ;
my $icon_button = $toolbar->append_item (”Image” , ”Une petite image” , undef,
$image, \&on_clicked, ’Image’ ) ;

# Insertion d’un espace
$toolbar->insert_space(10 ) ;

# Création à partir de stock. Ces deux icônes permettent de changer
# l’orientation de la barre
$toolbar->insert_stock(’gtk-go-forward’ ,’horizontale’ ,undef,\&on_orientation_change,’horizontal’ ,-1 ) ;
$toolbar->insert_stock(’gtk-go-down’ ,’verticale’ ,undef,\&on_orientation_change,’vertical’ ,-1 ) ;

# Insertion d’un espace
$toolbar->insert_space(10 ) ;

# Insérer une zone de saisie se fait très facilement.
my $entry = Gtk2::Entry->new() ;
$toolbar->append_widget( $entry, ”Une petite zone de saisie” , undef ) ;


# On règle la taille des icônes
$toolbar->set_icon_size(’button’ ) ;

# Affichage uniquement des icônes
$toolbar->set_style(’icons’ ) ;

##### Un menu à options pour changer la taille des icônes
my $opt1 = new Gtk2::OptionMenu() ;
my $menu1 = new Gtk2::Menu() ;
my $hbox1 = Gtk2::HBox->new(TRUE,0 ) ;
$vbox->pack_start($hbox1,FALSE,FALSE,0 ) ;
my $label1 = Gtk2::Label->new (”Taille des icônes” ) ;
$hbox1->pack_start($label1,FALSE,FALSE,0 ) ;
# on automatise le création des options
my @choix_taille=(’menu’ ,’small-toolbar’ ,’large-toolbar’ ,’button’ ,’dnd’ ,’dialog’ ) ;
foreach (@choix_taille) {
$item = make_menu_item( $_, \&change_taille_icone,$_ ) ;
$menu1->append( $item) ;
}
# On place le tout dans le menu puis dans la boîte
$opt1->set_menu( $menu1 ) ;
$hbox1->pack_start( $opt1, FALSE, FALSE, 0 ) ;

##### Un menu options pour changer le style de la barre
my $opt2 = new Gtk2::OptionMenu() ;
my $menu2 = new Gtk2::Menu() ;
my $hbox2 = Gtk2::HBox->new(TRUE,0 ) ;
$vbox->pack_start($hbox2,FALSE,FALSE,0 ) ;
my $label2 = Gtk2::Label->new (”Style” ) ;
$hbox2->pack_start($label2,FALSE,FALSE,0 ) ;
my @choix_style=(’icons’ ,’text’ ,’both’ ,’both-horiz’ ) ;
foreach (@choix_style) {
$item = make_menu_item( $_, \&change_style,$_ ) ;
$menu2->append( $item) ;
}
# On place le tout dans le menu puis dans la boîte
$opt2->set_menu( $menu2 ) ;
$hbox2->pack_start( $opt2, FALSE, FALSE, 0 ) ;

$window->show_all() ;

Gtk2->main() ;

sub on_orientation_change {
my ($self,$orientation) = @_ ;
$toolbar->set_orientation($orientation) ;
}

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

sub change_taille_icone {
my ( $item, $taille ) = @_ ;
$toolbar->set_icon_size($taille) ;
}

sub change_style {
my ( $item, $style ) = @_ ;
$toolbar->set_style($style) ;
}

sub on_clicked {
my ( $item, $message ) = @_ ;
print ”Vous avez clické sur $message !\n” ;
}

sub quitter{
Gtk2->main_quit() ;
}