Chapitre 4
Les tables

Découvrons une autre manière de ranger : les tables. Elles peuvent être extrêmement utiles dans certaines situations. Utiliser des tables consiste à créer une grille dans laquelle nous plaçons les widgets. Les widgets peuvent prendre autant de cases que nous le souhaitons.

Créer un table

Tout d’abord, la fonction qui permet de créer un table :

$table = Gtk2::Table->new( $nb_lignes, $nb_colonnes, $homogeneous );

Le premier argument est le nombre de lignes et le second, évidemment le nombre de colonnes. L’argument $homogeneous sert à déterminer la manière dont les cases de la table sont dimensionnées. Si $homogeneous est une valeur vraie, les cases sont dimensionnées en fonction de la plus grande ? Si $homogeneous est une valeur fausse, la taille de la case est dictée par le plus petit widget de la ligne et le plus large de la colonne.

Les colonnes et les lignes sont disposées de 0 à n ou n est le nombre spécifié à l’appel  new Gtk2::Table(). Ainsi si vous spécifiez 3 lignes et 2 colonnes, la disposition ressemblera à ceci :

       0          1          2  
      0+----------+----------+  
       |          |          |  
      1+----------+----------+  
       |          |          |  
      2+----------+----------+  
       |          |          |  
      3+----------+----------+  

Remarquez que l’origine du repère est en haut à gauche.

Lier les widgets à la table

Pour placer un widget dans une case, on utilise :

$table->attach( $child, $left_attach, $right_attach, $top_attach, $bottom_attach,  
                $xoptions, $yoptions, $xpadding, $ypadding );

Sur la gauche de l’appel de fonction, la table que vous avez créée et le premier argument est le widget que vous souhaitez placer dans la table.

Les arguments $right_attach et $left_attach déterminent où placer le widget et combien de cases utiliser. Si vous voulez un bouton dans la case droite du bas de notre table 2 2 et voulez remplir cette entrée uniquement, alors :

$left_attach = 1  
$right_attach = 2  
$top_attach = 1  
$bottom_attach = 2

Maintenant si vous voulez qu’un widget occupe toute la ligne supérieure de notre table, vous devrez définir :

$left_attach = 0  
$right_attach = 2  
$top_attach = 0  
$bottom_attach = 1

$xoptions et  $yoptions servent à spécifier les options de rangements et peuvent être combinées pour permettre multiples options.

Ces options sont :

Si vous souhaitez spécifier une de ces options, vous l’encadrez entre apostrophe comme ceci : 'option'. Mais si vous voulez combiner ces options, vous devrez les placer dans une liste anonyme comme ceci :

['option1', 'option2']

padding comme pour les boîtes, crée une zone claire autour du widget en pixel.

Une variation de attach() est attach_defaults() qui permet de vous dispenser des arguments $xoptions, $yoptions, $xpadding et $ypadding. Les valeurs par défaut de $xoptions et $yoptions sont  ['fill', 'expand'] et celles de $xpadding et $ypadding sont initialisées à 0.

Espacement entre lignes et colonnes

Nous avons aussi les fonctions set_row_spacing() et set_col_spacing() qui placent des espaces entre les lignes (et les colonnes) , ou entre certaines lignes et certaines colonnes.

$table->set_row_spacing( $row, $spacing );  
$table->set_col_spacing( $column, $spacing );

Notez que pour les colonnes, l’espace est placé à la droite de la colonne et pour les lignes, l’espace est placé dessous.

Vous pouvez aussi déclarer un espace consistant pour toutes les colonnes et les lignes avec :

$table->set_row_spacings( $spacing );  
$table->set_col_spacings( $spacing );

Noter qu’avec ces appels, la dernière ligne et la dernière colonne ne reçoivent pas d’espace.

Redimensionner une table.

Si vous voulez redimensionner une table après l’avoir créée, vous pouvez utiliser :

$table->resize( $rows, $columns );

Déclarer la propriété homogeneous

Si vous voulez changer la valeur de la propriété  homogeneous sur une table existante, vous pouvez utiliser :

$table->set_homogeneous( $homogeneous );

L’argument $homogeneous est une valeur vraie ou fausse.

Exemple

Ici, nous créons une fenêtre avec 3 boutons dans une table 2 2. Les deux premiers sont placés dans la ligne du haut. Un troisième, le bouton “quitter” est placé dans la ligne inférieure, occupant les deux colonnes. Cela doit ressembler à :

table

# !/usr/bin/perl -w

use Gtk2 ’-init’ ;

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

# Création de la fenêtre
my $window = Gtk2::Window->new( ’toplevel’ ) ;
$window->signal_connect(’delete_event’ , sub { Gtk2->main_quit ; } ) ;
$window->set_title( ’Table’ ) ;
$window->set_border_width(20 ) ;

# Création de la table
my $table = Gtk2::Table->new(2 ,2 ,TRUE) ;
$window->add( $table ) ;

# Création du premier bouton
$button1 = Gtk2::Button->new( ’bouton 1’ ) ;
$button1->signal_connect(’clicked’ , \&ButtonClicked, ’bouton 1’ ) ;

# Insère le bouton 1 dans la case en haut à gauche de la table
$table->attach_defaults( $button1, 0 , 1 , 0 , 1 ) ;
$button1->show() ;

# Création d’ un second bouton
my $button2 = Gtk2::Button->new( ’bouton 2’ ) ;
$button2->signal_connect( ’clicked’ , \&ButtonClicked, ’bouton 2’ ) ;

# Insère le bouton2 dans la case en haut à droite de la table
$table->attach_defaults( $button2, 1 , 2 , 0 , 1 ) ;
$button2->show() ;

# Crée le bouton ’Quit’
my $button3 = Gtk2::Button->new( ’Quitter’ ) ;
$button3->signal_connect( ’clicked’ , sub { Gtk2->main_quit ; } ) ;

# Insère le bouton”quit” dans les deux cases du bas
$table->attach_defaults( $button3, 0 , 2 , 1 , 2 ) ;

# Montre les divers éléments
$button1->show() ;
$button2->show() ;
$button3->show() ;
$table->show() ;
$window->show() ;

# On lance la boucle principale
Gtk2->main ;

### onction de rappel
sub ButtonClicked {
my ( $button, $text ) = @_ ;
print( ”Vous avez pressé le $text \n” ) ;
}