Les conteneurs

Pour le moment, nous n’avons vu que la fenêtre, qui est un conteneur ne pouvant contenir qu’un seul widget. Il s’agissait du conteneur Gtk::Bin, dont Gtk::Window hérite. Mais ceci n’est pas suffisant pour faire une interface graphique, nous allons donc voir les autres conteneurs disponibles.

Les boîtes

Les boîtes sont un type de conteneur très simple, semblables à n’importe quel carton dans lequel on jette des revues : elles s’empilent les unes au dessus des autres, dans l’ordre dans lequel on les a jetées. Il existe des boîtes verticales (Gtk::VBox) et des boîtes horizontales (Gtk::HBox), qui héritent toutes les deux de l’objet générique Gtk::Box. Lorsque l’on crée une boîte, on indique si elle est homogène, c’est à dire si tous les éléments à l’intérieur ont droit au même espace, et on indique aussi l’espace vide laissé entre deux éléments. Une fois la boîte créée, on peut lui ajouter des éléments au début (pack_start) ou à la fin (pack_end), et c’est tout ce que vous avez besoin de savoir !

Voyons quelques exemples de boîtes

window = Gtk::Window.new
window.set_title('VBox homogene')
window.signal_connect('destroy') { Gtk.main_quit }
vbox = Gtk::VBox.new(true, 6)
vbox.pack_start(Gtk::Button.new('Un'))
vbox.pack_start(Gtk::Button.new('Deux'))
vbox.pack_start(Gtk::Button.new('Trois'))
window.add(vbox)
window.show_all

Le résultat devrait ressembler à cela :

En réalité, les méthodes pack_start et pack_end peuvent prendre plus de paramètres. Ces paramètres sont, dans l’ordre, expand, fill et padding. Pour expliquer ces paramètres, nous devons préciser un peu le fonctionnement des boîtes dans GTK. Un widget placé dans un conteneur demande une certaine quantité d’espace, et est alloué une certaine quantité d’espace, qui peut être différente de la quantité demandée. Par exemple, lorsque l’on agrandit la fenêtre, les widgets se voient allouer un espace peut-être plus grand que celui qui était strictement nécessaire. Voyons comment cet espace sera utilisé.

Tout d’abord, si la boîte était homogène, l’espace dont elle dispose est réparti équitablement entre tous les widgets qu’elle contient. Si une boîte verticale dispose de 450 pixels et contient trois boutons, chaque bouton se verra attribuer 150 pixels, moins la valeur du padding, qui est un espace vide laissé entre chaque widget. Il y a alors deux cas possibles : si le champ fill est à true, alors le widget occupera l’intégralité de cet espace, même s’il n’en avait pas besoin. Si le champ fill est à false, alors le widget n’occupera que l’espace nécessaire, l’espace supplémentaire étant laissé vide.

D’autre part, si la boîte n’est pas homogène, alors le paramètre expand entre en jeu. Ce paramètre indique si le widget désire se voir attribuer une partie de l’espace supplémentaire ou non. Si une boîte dispose de 150 pixels en plus, et contient trois boutons, dont deux ont le champ expand à true, alors chacun d’entre eux se verra attribuer 75 pixels (moins le padding). Si les trois boutons ont expand à true, ils se voient attribuer chacun 50 pixels (moins le padding). Enfin, le champ fill est toujours applicable, et indique si l’espace “en plus” est utilisé par le widget, ou laissé vide. Voyons un exemple

window = Gtk::Window.new
window.set_title('VBox 2')
window.signal_connect('destroy') { Gtk.main_quit }
vbox = Gtk::VBox.new(true, 6)
vbox.pack_start(Gtk::Button.new('Un'), false)
vbox.pack_start(Gtk::Button.new('Deux'), true, false)
vbox.pack_start(Gtk::Button.new('Trois'), true, true)
window.add(vbox)
window.show_all

Dans cet exemple, nous pouvons voir que le premier bouton ne s’étend pas, il n’obtient donc que l’espace nécessaire, même si nous agrandissons la fenêtre. Le deuxième bouton s’étend, mais ne remplit pas l’espace en plus, qui est donc laissé vide. Notez que les deux « vides » sur l’image appartiennent au deuxième bouton. Enfin, le troisième bouton s’étend et remplit l’espace en plus, ce qui est le comportement par défaut.

Enfin, le dernier paramètre, le padding, peut-être spécifié à la suite des autres attributs, et indique l’espace vide qui doit être placé avant et après le widget :

vbox.pack_start(Gtk::Button.new('Trois'), true, true, 12)

Bien sûr, tous les exemples que nous avons donnés sont valables pour les boîtes horizontales. Vous pouvez les essayer en ne changeant que la création de la boîte, en remplaçant VBox par HBox. Vous constaterez au passage que le paramètre fill n’affecte que la dimension de la boîte : la hauteur pour une boîte verticale, la largeur pour une boîte horizontale.

Les tables

Une table (Gtk::Table) est un conteneur un peu plus complexe qu’une boîte, très semblable aux tableaux en HTML. Elle se définit par son nombre de rangées, son nombre de colonnes, et le fait qu’elle soit homogène ou non. Si elle est homogène, toutes ses cases ont la même taille. Une fois votre table créée, vous pouvez y déposer (attacher) des widgets, en indiquant dans quelle(s) case(s), vous voulez les mettre. Un widget peut s’étaler sur plusieurs cases, mais une case ne peut contenir qu’un seul widget au maximum.

Lorsque vous voulez attacher un widget dans une table, vous commencez par spécifier la colonne de départ (gauche), puis la colonne de fin (droite), la rangée de départ (haut) et la rangée de fin (bas). Voyons un exemple.

table = Gtk::Table.new(4,5)
b1 = Gtk::Button.new('Un')
table.attach(b1, 0, 2, 0, 2)
b2 = Gtk::Button.new('Deux')
table.attach(b2, 3, 4, 0, 1)
b3 = Gtk::Button.new('Trois')
table.attach(b3, 3, 4, 1, 2)
b4 = Gtk::Button.new('Quatre')
table.attach(b4, 0, 4, 2, 3)
window.add(table)

Il est bien sûr possible de choisir si les widgets s’étendent et remplissent tout l’espace alloué, ainsi que spécifier un padding. Pour cela, la méthode attach prend des paramètres supplémentaires, qui sont les suivants :

  • xoptions, yoptions

    Peuvent être Gtk::EXPAND, Gtk::FILL ou Gtk::SHRINK, ou une combinaison de ces

    paramètres ( Gtk::EXPAND | Gtk::FILL). Spécifient les options pour l’agencement horizontal (xoptions) et vertical (yoptions). Les attributs EXPAND et FILL ont la même signification que ci-dessus, et SHRINK indique que le widget doit prendre le minimum d’espace possible.
  • xpadding, ypadding

Valeurs de padding horizontal et vertical pour le widget attaché.

table = Gtk::Table.new(4,5)
b1 = Gtk::Button.new('Un')
table.attach(b1, 0, 2, 0, 2, Gtk::SHRINK)
b2 = Gtk::Button.new('Deux')
table.attach(b2, 3, 4, 0, 1, Gtk::EXPAND)
b3 = Gtk::Button.new('Trois')
table.attach(b3, 3, 4, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK)
b4 = Gtk::Button.new('Quatre')
table.attach(b4, 0, 4, 2, 3)

Sommaire
Précédent : IHM-GTK : Les évènements Suivant : IHM-GTK : Boutons