Chapitre 17
Les notebooks

Le widget Notebook est une collection de “pages” qui se recouvrent, chaque page contient des informations différentes et seule l’une des pages est visible. Ce widget est devenu très commun dernièrement dans la programmation GUI, et c’est un bon moyen de montrer des blocks d’informations similaires tout en garantissant une séparation de leurs affichages.

La première fonction, bien évidemment, sert à créer un nouveau notebook :

$notebook = Gtk2::Notebook->new();
Détaillons les fonctions qui permettent de manipuler notre notebook fraîechement créé.

La première que nous rencontrerons sert à positionner les indicateurs de pages. Ces indicateurs de pages ou “tabs” c’est ainsi qu’ils sont référencés, peuvent être positionnés de quatre manières : en haut, en bas, à gauche ou à droite.

$notebook->set_tab_pos( $position );
ou $position peut être :

Ensuite, voyons comment ajouter des pages au notebook. Il existe trois moyens d’ajouter des pages à un Notebook. Les deux premiers sont presque similaires :

$notebook->append_page( $child, $tab_label );  
$notebook->prepend_page( $child, $tab_label );
Les fonctions ajoutent des pages les pages à la fin ou au début du notebook. $child est le widget qui est placé dans la page du notebook, et $tab_label est le label pour la page ajoutée. Le widget $child doit être créé séparément, et est typiquement un ensemble de déclarations d’options placés dans un autre widget conteneur, comme une table par exemple.

La dernière fonction pour ajouter des pages à un notebook contient toutes les propriétés des deux précédentes mais permet de spécifier à quelle position vous voulez placer la page.

$notebook->insert_page( $child, $tab_label, $position );
Les paramètres sont les mêmes que pour append et prepend avec un paramètre supplémentaire, $position. Ce paramètre indique la position de la page à insérer sachant que la première page possède la position zéro.

Maintenant que nous savons comment ajouter des pages, voyons comment les enlever.

$notebook->remove_page( $page_num );
Cette fonction enlève la page $page_num du notebook. Nous retrouvons la page courante à l’aide de :
$notebook->get_current_page();
Nous retrouvons le numéro de la page courante à l’aide de :
$notebook->page_num( $child );
Cette fonction retourne -1 si $child n’est pas une page du $notebook.

Si vous voulez changer le numéro de page d’un enfant, vous pouvez utiliser :

$notebook->reorder_child( $child, $position );
Les deux fonctions suivantes sont de simples appels qui permettent de bouger vers l’avant ou l’arrière les pages du notebook. Il suffit de fournir à chaque appel de fonction le widget notebook sur lequel on veut agir. Notez que, quand le notebook est sur la dernière page et que next_page() est appelé, le notebook se retrouvera sur la première page. De même, quand on est sur la première page et que l’on appelle prev_page(), on se retrouve sur la dernière page.
$notebook->next_page();  
$notebook->prev_page();
La fonction suivante déclare une page active. Si vous voulez que le notebook soit ouvert en page 5 par exemple, vous utiliserez cette fonction. Sans cette fonction , la page par défaut est la première.
$notebook->set_current_page( $page_num );
Les deux fonctions suivantes ajoutent ou enlèvent respectivement les indicateurs des pages et les bords du notebook.
$notebook->set_show_tabs( $show_tabs );  
$notebook->set_show_border( $show_border );
$show_tabs et $show_border sont des valeurs booléennes.

La fonction suivante est utile quand vous avez un grand nombre de pages, et que l’affichage des indicateurs de pages pose problème. Cela permet de faire défiler les tabs en utilisant deux boutons flèches.

$notebook->set_scrollable( $scrollable );
La largeur des bords autour du bookmark peut être déclarée avec :
$notebook->set_tab_border( $border_width );
Vous pouvez également décider si tous les indicateurs de pages sont de la même taille ou non :
$notebook->set_homogeneous_tabs( $homogeneous );
$homogeneous est une valeur vraie ou fausse.

Exemple

Maintenant voyons un exemple. Il est inspiré du code de textgtk.c qui est fourni avec la distribution GTK. Ce petit programme crée une fenêtre avec un notebook et six boutons. Le notebook contient 11 pages, ajoutées selon les trois méthodes, au début, à la fin ou insérées. Les boutons vous permettent de décaler la position des indicateurs de pages, ajouter ou enlever les indicateurs ou les bords, enlever une page, changer les pages de deux manières ( en avant , en arrière ) et de sortir du programme.

notebook

# !/usr/bin/perl -w

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

my $i ;
my $bufferf ;
my $bufferl ;
my $button ;
my $label ;
my $frame ;
my $window = Gtk2::Window->new(”toplevel” ) ;
$window->signal_connect( ”delete_event” , sub { Gtk2->main_quit() ; } ) ;
$window->set_border_width( 10 ) ;

my $table = Gtk2::Table->new( 3 , 6 , FALSE ) ;
$window->add( $table ) ;

# Crée un nouveau notebook, détermine la position des onglets
my $notebook = Gtk2::Notebook->new() ;
$notebook->set_tab_pos( ’top’ ) ;
$table->attach_defaults( $notebook, 0 , 6 , 0 , 1 ) ;
$notebook->show() ;

# Ajoutons quelques pages à la fin du notebook
for ( $i = 0 ; $i < 5 ; $i++ )
{
$bufferf = ”Append Frame ” . ( $i + 1 ) ;
$bufferl = ”Page ” . ( $i + 1 ) ;

$frame = Gtk2::Frame->new( $bufferf ) ;
$frame->set_border_width( 10 ) ;
$frame->set_size_request( 100 , 75 ) ;
$frame->show() ;

$label = Gtk2::Label->new( $bufferf ) ;
$frame->add( $label ) ;
$label->show() ;
$label = new Gtk2::Label( $bufferl ) ;
$notebook->append_page( $frame, $label ) ;
}

# Maintenant ajoutons une page à une marque spécifique
my $checkbutton = Gtk2::CheckButton->new( ”Cliquez moi, s’il vous plaît !” ) ;
$checkbutton->set_size_request( 100 , 75 ) ;
$checkbutton->show() ;

$label = Gtk2::Label->new( ”Page ajoutée” ) ;
$notebook->insert_page( $checkbutton, $label, 2 ) ;

# Maintenant, enfin, ajoutons des pages au début du notebook
for ( $i = 5 ; $i < 10 ; $i++ )
{
$bufferf = ”Prepend Frame ” . ( $i + 1 ) ;
$bufferl = ”Page ” . ( $i + 1 ) ;

$frame = Gtk2::Frame->new( $bufferf ) ;
$frame->set_border_width( 10 ) ;
$frame->set_size_request( 100 , 75 ) ;
$frame->show() ;

$label = Gtk2::Label->new( $bufferf ) ;
$frame->add( $label ) ;
$label->show() ;

$label =Gtk2::Label->new( $bufferl ) ;
$notebook->prepend_page( $frame, $label ) ;
}

# Indiquons à quel page ouvrir le notebook (page 4)
$notebook->set_current_page(3 ) ;

# Crée une brochette de boutons
$button = Gtk2::Button->new_from_stock( ’gtk-close’ ) ;
$button->signal_connect( ”clicked” , sub { Gtk2->main_quit() ; } ) ;
$table->attach_defaults( $button, 0 , 1 , 1 , 2 ) ;
$button->show() ;

$button = Gtk2::Button->new( ”Page suivante” ) ;
$button->signal_connect( ”clicked” , sub { $notebook->next_page() ; } ) ;
$table->attach_defaults( $button, 1 , 2 , 1 , 2 ) ;
$button->show() ;

$button = Gtk2::Button->new( ”Page précédent” ) ;
$button->signal_connect( ”clicked” , sub { $notebook->prev_page() ; } ) ;
$table->attach_defaults( $button, 2 , 3 , 1 , 2 ) ;
$button->show() ;

$button = Gtk2::Button->new( ”Position des onglets” ) ;
$button->signal_connect( ”clicked” , \&rotate_book, $notebook ) ;
$table->attach_defaults( $button, 3 , 4 , 1 , 2 ) ;
$button->show() ;

$button = Gtk2::Button->new( ”Onglet ou pas” ) ;
$button->signal_connect( ”clicked” , \&tabsborder_book, $notebook ) ;
$table->attach_defaults( $button, 4 , 5 , 1 , 2 ) ;
$button->show() ;

$button = Gtk2::Button->new(”Supprimer la page” ) ;
$button->signal_connect( ”clicked” , \&remove_book, $notebook ) ;
$table->attach_defaults( $button, 5 , 6 , 1 , 2 ) ;
$button->show() ;

$table->show() ;
$window->show() ;
Gtk2->main ;

### Routines
# Cette fonction décale la position des tabs
sub rotate_book {
my ( $button, $notebook ) = @_ ;
my %rotate = ( top => ’right’ ,
right => ’bottom’ ,
bottom => ’left’ ,
left => ’top’ ) ;
$notebook->set_tab_pos( $rotate{ $notebook->get_tab_pos()} ) ;
}

# Ajoute/Enlève les tabs des pages et les bords
sub tabsborder_book {
my ( $button, $notebook ) = @_ ;
my $tval = FALSE ;
my $bval = FALSE ;

if ( $notebook->get_show_tabs == 0 )
{
$tval = TRUE ;
}
if ( $notebook->get_show_border == 0 )
{
$bval = TRUE ;
}
$notebook->set_show_tabs( $tval ) ;
$notebook->set_show_border( $bval ) ;
}

# Enlève une page du notebook
sub remove_book {
my ( $button, $notebook ) = @_ ;
my $page ;
$page = $notebook->get_current_page() ;
$notebook->remove_page( $page ) ;

# On a besoin de rafraîchir le widget. Cela force
# le widget à se redessiner
$notebook->queue_draw() ;
}