Programmation GTK2 en Pascal/GtkDialog

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkDialog permet de gérer un style de fenêtre particulier : les boîtes de dialogue. Elles permettent de demander à l'utilisateur des informations ou de poser des questions.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkWindow
                      └─GtkDialog

Utilisation de base[modifier | modifier le wikicode]

Composition de la boîte de dialogue[modifier | modifier le wikicode]

Une boîte de dialogue de type GtkDialog est constituée de trois éléments :

  • un conteneur GtkVBox global qui contiendra tous les contrôles affichés ;
  • un contrôle GtkHSeparator qui sert de séparation entre la zone de saisie et la zone des boutons ;
  • un conteneur GtkHBox qui contiendra les boutons de réponse.

On peut donc ainsi distinguer deux zones différentes :

  • la zone de travail au-dessus de la GtkHSeparator ;
  • la zone de réponse au-dessous de la GtkHSeparator

Création de la fenêtre[modifier | modifier le wikicode]

La fonction de création est un peu plus complexe que d'habitude :

function gtk_dialog_new_with_buttons(title : Pgchar; parent : PGtkWindow; 
  flags : TGtkDialogFlags; first_button_text : Pgchar; args : array of const) : PGtkWidget;

Le premier paramètre title n'est autre que le titre de la boîte de dialogue.

Le deuxième paramètre parent sert à désigner la fenêtre parente. Cette valeur peut être égale à NULL.

Le troisième paramètre flags permet de définir certains paramètres de la boîte de dialogue. Ce paramètre peut prendre trois valeurs différentes :

  • GTK_DIALOG_MODAL : créer une boîte de dialogue modale, c'est à dire que tant que l'utilisateur n'a pas cliqué sur un des boutons de réponse, les autres fenêtres seront figées ;
  • GTK_DIALOG_DESTROY_WITH_PARENT : la boîte de dialogue est détruite si la fenêtre parente est détruite ;
  • GTK_DIALOG_NO_SEPARATOR : la ligne de séparation entre la zone de travail et la zone de réponse n'est pas affichée.

Enfin, le dernier paramètre est plutôt une liste de paramètres permettant de définir les boutons de la boîte de dialogue ainsi que les réponses qui leurs sont associées. Pour chaque bouton que nous voulons ajouter, il faut définir le texte du bouton et le type de réponse qui sera envoyé lorsque nous cliquerons sur le bouton. Le texte du bouton peut, comme pour tous les boutons, être un texte normal, un texte avec raccourci (de la forme "_Quitter") ou même une valeur de type GtkStockItem dont voici une toute partie de la liste :

  • GTK_STOCK_OK ;
  • GTK_STOCK_CANCEL ;
  • GTK_STOCK_YES ;
  • GTK_STOCK_NO ;
  • GTK_STOCK_SAVE.

La valeur de la réponse, peut être un élément de type GtkResponseType ou bien une valeur entière positive que nous pouvons définir nous-mêmes. Le plus simple étant bien sûr d'utiliser les valeurs classiques définies par le type GtkResponseType dont voici la liste :

  • GTK_RESPONSE_NONE ;
  • GTK_RESPONSE_REJECT ;
  • GTK_RESPONSE_ACCEPT ;
  • GTK_RESPONSE_DELETE_EVENT ;
  • GTK_RESPONSE_OK ;
  • GTK_RESPONSE_CANCEL ;
  • GTK_RESPONSE_CLOSE ;
  • GTK_RESPONSE_YES ;
  • GTK_RESPONSE_NO ;
  • GTK_RESPONSE_APPLY ;
  • GTK_RESPONSE_HELP.

Une fois que tous les boutons ont été définis, il faut le dire à notre fonction de création. Pour cela, il suffit de terminer la liste des paramètres par NULL.

Ajout d'éléments dans la zone de travail[modifier | modifier le wikicode]

La majeure partie des éléments de la boîte de dialogue sont maintenant créés. Il reste cependant à ajouter les éléments de la zone de travail pour que la boîte soit complète. Une fois que ceux-ci sont créés, il suffit de les ajouter dans la boîte de dialogue avec la fonction gtk_box_pack_start.

La question est maintenant de savoir comment passer la GtkVBox en paramètre à la fonction gtk_box_pack_start. Nous allons tout simplement utiliser l'opérateur ^. pour l'élément GtkDialog de cette manière :

GTK_DIALOG(nom_de_la_fenêtre)^.vbox;

La boîte de dialogue est maintenant complète.

Affichage de la boîte de dialogue[modifier | modifier le wikicode]

L'affichage de la boîte de dialogue comporte deux étapes. Tout d'abord, il faut demander d'afficher tout le contenu de la GtkVBox qui est inclus dans la boîte de dialogue avec la fonction gtk_widget_show_all.

Ensuite il faut afficher la boîte de dialogue elle-même et attendre la réponse de l'utilisateur avec cette fonction :

function gtk_dialog_run(dialog : PGtkDialog) : gint;

Le paramètre de cette fonction étant de type PGtkDialog il faut utiliser la fonction de conversion GTK_DIALOG().

Cette fonction affiche l'intégralité de la boîte de dialogue, mais rentre aussi dans une boucle récursive qui ne s'arrêtera que lorsque l'utilisateur cliquera sur un des boutons de retour. La valeur de retour correspond à la valeur associée au bouton cliqué. Si, par hasard, l'utilisateur quitte la boîte de dialogue en cliquant sur la croix de celle-ci, gtk_dialog_run renvoie GTK_DELETE_EVENT.

Une fois la valeur de retour connue, il ne reste plus qu'à agir en conséquence.

Programme exemple[modifier | modifier le wikicode]

L'exemple de ce chapitre est constitué d'une fenêtre principale dans laquelle nous allons ajouter un GtkButton et un GtkLabel. Lorsque l'utilisateur clique sur le GtkButton, une boîte de dialogue apparaîtra et demandera à l'utilisateur de saisir son nom. Cette boîte de dialogue sera constituée d'une GtkEntry, d'un GtkButton « OK » et d'un GtkButton « Annuler ». Si l'utilisateur clique sur « OK » le contenu de la GtkEntry sera copié dans le GtkLabel de la fenêtre principale tandis que s'il clique sur « Annuler » on affichera « Vous n'avez rien saisi. » dans le GtkLabel.

Voici le fichier gtk003.pas, pour faire simple il a été utilisé des variables globales ce qui n'est pas forcément à conseiller :

program gtk003;

uses glib2, gtk2;

var
  pWindow : PGtkWidget;
  pLabel  : PGtkWidget;

procedure LancerBoite;
var
  pBoite : PGtkWidget;
  pChampSaisie : PGtkWidget;
  Nom : PGChar;
begin
  // Creation de la boîte de dialogue 
  ///1 bouton Valider (« Ok »)
  ///1 bouton Annuler 
  pBoite := gtk_dialog_new_with_buttons('Saisie du nom',
        GTK_WINDOW(pWindow),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK, [GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
        NULL]);

  // Creation de la zone de saisie 
  pChampSaisie := gtk_entry_new();
  gtk_entry_set_text(GTK_ENTRY(pChampSaisie), 'Saisissez votre nom');

  // Insertion de la zone de saisie dans la boîte de dialogue 
  // Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox 
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)^.vbox), pChampSaisie, TRUE, FALSE, 0);

  // Affichage des éléments de la boîte de dialogue 
  gtk_widget_show_all(GTK_DIALOG(pBoite)^.vbox); 

  // On lance la boîte de dialogue et on récupère la réponse 
  case gtk_dialog_run(GTK_DIALOG(pBoite)) of
    // L'utilisateur valide
    GTK_RESPONSE_OK : begin
      Nom := gtk_entry_get_text(GTK_ENTRY(pChampSaisie));
      gtk_label_set_text(GTK_LABEL(pLabel), Nom);
    end;
    // L'utilisateur annule 
    GTK_RESPONSE_CANCEL, GTK_RESPONSE_DELETE_EVENT : begin
      gtk_label_set_text(GTK_LABEL(pLabel), 'Vous n''avez rien saisi !');
    end;
    else begin
      gtk_label_set_text(GTK_LABEL(pLabel), 'Réponse inattendue !');
    end;
  end;

  // Destruction de la boîte de dialogue 
  gtk_widget_destroy(pBoite);
end;

procedure OnDestroy(widget : PGtkwidget; data : pgpointer); cdecl;
begin
  gtk_main_quit;
end;

var
  pVBox	  : PGtkWidget;
  pBouton : PGtkWidget;
begin
  gtk_init(@argc, @argv);
  pWindow := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
  gtk_window_set_title(GTK_WINDOW(pWindow), 'Fenêtre principale');
  gtk_signal_connect(pGTKOBJECT(pWindow), 'destroy', GTK_SIGNAL_FUNC(@OnDestroy), NULL);

  // Création de la GtkVBox
  pVBox := gtk_vbox_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

  // Création du bouton
  pBouton := gtk_button_new_with_label('Cliquez ici pour saisir votre nom');
  gtk_box_pack_start(GTK_BOX(pVBox), pBouton, FALSE, TRUE, 0);

  // Création du label
  pLabel := gtk_label_new(NULL);
  gtk_box_pack_start(GTK_BOX(pVBox), pLabel, FALSE, FALSE, 0);

  // Connexion du signal « clicked » pour ouvrir la boîte de dialogue 
  g_signal_connect(pGTKOBJECT(pBouton), 'clicked', GTK_SIGNAL_FUNC(@LancerBoite), NULL);

  gtk_widget_show_all(pWindow);
  gtk_main;
end.

Voila ce que donne l'exécution du programme gtk003 :

La fenêtre principale s'affiche et on clique sur le bouton « Cliquez ici pour saisir votre nom »

Dans la fenêtre de dialogue, on a saisi « Didier » puis cliqué sur « Valider »

Modèle:Programmation GTK2 en Pascal/Fenêtres