Object +-- Widget +-- Container +-- Table
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.
Tout d'abord, la fonction qui permet de créer un table :
$table = new Gtk::Table( $num_rows, $num_columns, $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 Gtk::Table(). Ainsi si vous spécifiez lignes (rows)= 3
et colonnes=2, la disposition ressemblera à ceci :
0 1 2 0+-----+-----+ | | | 1+-----+-----+ | | | 2+-----+-----+ | | | 3+-----+-----+
Remarquez que l'origine du repère est en haut à gauche.
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
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
:
'fill' si la case est plus grande que le widget et que 'fill'
est spécifié, le widget s'étendra pour remplir tout l'espace vide.
'shrink' : si on a alloué moins d'espace que requis pour le widget (habituellement
quand l'utilisateur redimensionne la fenêtre) alors le widget devrait normalement
dépasser du fond de la fenêtre et ne plus être visible. Si 'shrink' est
spécifié, les widgets seront réduits avec la table.
'expand' obligera la table à occuper tout l'espace restant dans la fenêtre.
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 options x et y et de padding. Les options x et y par défaut
sont ['fill', 'expand'] et les padding x et y valent 0.
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-SPMamp;>set_row_spacings( $spacing ); $table-SPMamp;>set_col_spacings( $spacing );
Noter qu'avec ces appels, la dernière ligne et la dernière colonne ne reçoivent pas d'espace.
Si vous voulez redimensionner une table après l'avoir créée, vous pouvez utiliser :
$table->resize( $rows, $columns );
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.
Ici, nous créons une fenêtre avec 3 boutons dans une table
. 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
à :
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $window;
my $button;
my $table;
$window = new Gtk::Window( "toplevel" );
$window->signal_connect( "delete_event", sub { Gtk->exit( 0 ); } );
$window->title( "Table" );
$window->border_width( 20 );
$table = new Gtk::Table( 2, 2, $true );
$window->add( $table );
$button = new Gtk::Button( "button 1" );
$button->signal_connect( "clicked", \&ButtonClicked, "button 1" );
# Insère le bouton 1 dans la case en haut à gauche de la table
$table->attach_defaults( $button, 0, 1, 0, 1 );
$button->show();
# Crée un second bouton
$button = new Gtk::Button( "button 2" );
$button->signal_connect( "clicked", \&ButtonClicked, "button 2" );
# Insère le bouton2 dans la case en haut à droite de la table
$table->attach_defaults( $button, 1, 2, 0, 1 );
$button->show();
# Crée le bouton "Quit"
$button = new Gtk::Button( "Quit" );
$button->signal_connect( "clicked", sub { Gtk->exit( 0 ); } );
# Insère le bouton''quit'' dans les deux cases du bas
$table->attach_defaults( $button, 0, 2, 1, 2 );
$button->show();
$table->show();
$window->show();
main Gtk;
exit( 0 );
### Rappels
sub ButtonClicked { my ( $button, $text ) = @_; print( "Hello again $text was pressed\n" ); }