Programmation GTK2 en Pascal/GtkBox

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkBox est un contrôle conteneur que nous n'allons pas utiliser directement mais plutôt par la biais de deux contrôles fils qui sont GtkHBox et GtkVBox. Le but principal d'une GtkBox (qu'elle soit H ou V) et de pouvoir contenir plusieurs contrôles dans une même boite. Les contrôles sont pour ainsi dire empiler les uns sur les autres. Nous allons donc étudier les quelques fonctions de ce contrôle qui nous sont utiles.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBox

Utilisation de base[modifier | modifier le wikicode]

Ajout de contrôle[modifier | modifier le wikicode]

Avant de pouvoir ajouter un contrôle dans une GtkHBox ou GtkVBox, il faut savoir que pour une GtkBox il existe la notion de premier et de dernier contrôle. Nous allons donc pouvoir ajouter des contrôles soit par le début soit par la fin avec une de ces deux fonctions :

procedure gtk_box_pack_start(box : PGtkBox; child : PGtkWidget; expand : gboolean; 
  fill : gboolean; padding : guint);
procedure gtk_box_pack_end(box : PGtkBox; child : PGtkWidget; expand : gboolean; 
  fill : gboolean; padding : guint);

La première fonction ajoute un contrôle par le début de la GtkBox et la deuxième par la fin.

Pour les paramètres, ils sont les mêmes pour les deux fonctions. Le premier, box, est en fait le contrôle conteneur dans lequel nous allons insérer le contrôle child qui vient en deuxième paramètre.

Le troisième paramètre, expand nécessite un petite explication. Nous ne le voyons pas ici, mais lors de la création d'une GtkHBox ou GtkVBox, il faut définir une propriété appelée homogeneous. Cette propriété détermine si les contrôles qui sont à l'intérieur de la GtkBox vont se partager l'intégralité de l'espace fourni, ou alors réserver uniquement la place qui leur est nécessaire (la fonction pour mettre à jour cette propriété est gtk_box_set_homogeneous).

Petit exemple, nous avons un espace de 3 pixels dans lequel nous voulons insérer deux contrôles de 1 pixel. Si le paramètre homogeneous est à TRUE, chaque contrôle réservera un espace de 1,5 pixel. Au contraire si il est à FALSE, chaque contrôle réservera un espace de 1 pixel, laissant donc un espace libre de 1 pixel à la fin. Revenons donc au paramètre expand. Si la GtkBox est homogène, la valeur de ce paramètre n'a aucune importance. Par contre si la GtkBox n'est pas homogène, le fait de mettre expand à TRUE à un contrôle va lui permettre de partager l'espace restant dans la GtkBox avec les autres contrôles qui auront été insérés avec expand à TRUE.

Reprenons notre exemple. La GtkBox n'est pas homogène, donc normalement chaque contrôle va réserver 1 pixel de l'espace. Si nous mettons le premier contrôle avec expand à TRUE et le deuxième avec expand à FALSE, le deuxième contrôle réservera un espace de 1 pixel, le premier aussi mais il doit se partager l'espace libre (1 pixel) avec les autres contrôles qui ont aussi la propriété expand à TRUE. Comme il est tout seul avec cette propriété, il va donc réserver 2 pixels.

Le paramètre fill permet de définir si le contrôle enfant occupe toute la zone qui lui est réservée. Il n'est utilisé que si expand est à TRUE.

Et enfin, le paramètre padding permet d'ajouter de l'espace autour du contrôle.

À noter les deux fonctions :

procedure gtk_box_pack_start_defaults(box : PGtkBox; widget : PGtkWidget);
procedure gtk_box_pack_end_defaults(box : PGtkBox; widget : PGtkWidget);

Elles sont équivalentes aux deux fonctions ci-dessus avec les trois derniers paramètres positionnés par défaut : expand est à TRUE, fill est à TRUE et padding est à 0.

Programme exemple[modifier | modifier le wikicode]

Dans cet exemple, nous allons insérer un bouton dans la GtkVBox, deux boutons dans une GtkHBox elle-même dans la GtkVBox puis enfin un bouton dans la GtkVBox, afin d'étudier les fonctions d'ajout du contrôle GtkBox.

Voilà le fichier gtk005.pas :

program gtk005;

uses glib2, gtk2;

var
  pFenetre : PGtkWidget;
  pVBox	   : PGtkWidget;
  pHBox    : PGtkWidget;
  pBouton  : array [1..4] of PGtkWidget;
begin
  gtk_init(@argc, @argv);
  pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(pFenetre), 320, 200);
  gtk_window_set_title(GTK_WINDOW(pFenetre), 'Gtk005 : GtkBox');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  // Création de la GtkVBox
  pVBox := gtk_vbox_new(TRUE, 0);
  // Ajout de la GtkVBox dans la fenêtre
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création des boutons
  pBouton[1] := gtk_button_new_with_label('Bouton 1');
  pBouton[2] := gtk_button_new_with_label('Bouton 2');
  pBouton[3] := gtk_button_new_with_label('Bouton 3');
  pBouton[4] := gtk_button_new_with_label('Bouton 4');

  // Ajout du bouton 1 dans la GtkVBox 
  gtk_box_pack_start(GTK_BOX(pVBox), pBouton[1], TRUE, FALSE, 0);

  // Creation de la « boîte » horizontale 
  pHBox := gtk_hbox_new(TRUE, 0);

  // Ajout de la GtkHBox dans la GtkVBox 
  gtk_box_pack_start(GTK_BOX(pVBox), pHBox, TRUE, TRUE, 0);

  // Ajout des boutons 2 et 3 dans la GtkHBox 
  gtk_box_pack_start(GTK_BOX(pHBox), pBouton[2], TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(pHBox), pBouton[3], TRUE, FALSE, 0);

  // Ajout du dernier bouton dans la GtkVBox 
  gtk_box_pack_start(GTK_BOX(pVBox), pBouton[4], TRUE, TRUE, 0);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

Voilà ce que donne l'exécution du programme gtk005 :

Récapitulatif des paramètres de gtk_box_pack_start pour chaque bouton :

Bouton expand fill
n° 1 True False
n° 2 True True
n° 3 True False
n° 4 True True

Conteneurs : GtkContainer ~ GtkBox ~ GtkBinGtkHBox ~ GtkVBox ~ GtkTable ~ GtkNotebook