Programmation GTK2 en Pascal/GtkCheckButton

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkCheckButton permet de gérer les cases à cocher. Comme c'est un contrôle qui peut prendre deux états, coché ou pas, il dérive directement du GtkToggleButton.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkButton
                      └─GtkToggleButton
                          └─GtkCheckButton

Utilisation de base[modifier | modifier le wikicode]

Création[modifier | modifier le wikicode]

Une fois encore, la syntaxe et l'utilisation des fonctions de création restent classiques :

function gtk_check_button_new : PGtkWidget;
function gtk_check_button_new_with_label(_label : Pgchar) : PGtkWidget;
function gtk_check_button_new_with_mnemonic(_label : Pgchar) : PGtkWidget;

Pour le reste, il faut utiliser les fonctions et signaux du contrôle GtkToggleButton.

Programme exemple[modifier | modifier le wikicode]

Nous allons reprendre l'exemple du contrôle GtkToggleButton mais cette fois-ci avec un GtkCheckButton.

Voilà le fichier gtk022.pas :

program gtk022;

uses glib2, gtk2;

procedure OnBtnAEtatToggle(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
  Etat : GBoolean;
  Inconsistent : GBoolean;
  LabelBtn : PGChar;
  LabelEtat, LabelIncons : PGChar;
begin
  // Récuperation de l'état du bouton
  Etat := gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(APWidget));
  // Récuperation de l'aspect du bouton 
  Inconsistent := gtk_toggle_button_get_inconsistent(GTK_TOGGLE_BUTTON(APWidget));

  // Construction du label du bouton 
  if Etat then
    LabelEtat := g_strdup('Coché')
  else
    LabelEtat := g_strdup('Décoché');
  if Inconsistent then
    LabelIncons := g_strdup('Modifié')
  else
    LabelIncons := g_strdup('Normal');
  LabelBtn := g_strdup_printf('État : %s/Aspect : %s', [LabelEtat, LabelIncons]);

  // Modification du label du bouton 
  gtk_button_set_label(GTK_BUTTON(APWidget), LabelBtn);

  // Libération des chaînes
  g_free(LabelBtn);
  g_free(LabelEtat);
  g_free(LabelIncons);
end;

procedure OnBtnMajEtatClick(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
  Etat : GBoolean;
begin
  // Récuperation de l'état du bouton
  Etat := gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(AData));

  // Modification de l'état du bouton
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(AData), Etat <> TRUE);
end;

procedure OnBtnMajAspectClick(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
  Inconsistent : GBoolean;
begin
  // Récuperation de l'aspect du bouton
  Inconsistent := gtk_toggle_button_get_inconsistent(GTK_TOGGLE_BUTTON(AData));

  // Modification de l'aspect du bouton 
  gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(AData), Inconsistent <> TRUE);

  // On emet le signal « toggle » pour changer le texte du bouton 
  gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(AData));
end;

var
  pFenetre     : PGtkWidget;
  pVBox        : PGtkWidget;
  pCaseACocher : PGtkWidget;
  pBtnMajEtat  : PGtkWidget;
  pBtnMajAspect : 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_container_set_border_width(GTK_CONTAINER(pFenetre), 4);
  gtk_window_set_title(GTK_WINDOW(pFenetre), 'Gtk022 : Case à cocher');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  pVBox := gtk_vbox_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création de la case à cocher
  pCaseACocher := gtk_check_button_new_with_label('État : Décoché/Aspect : Normal');
  gtk_box_pack_start(GTK_BOX(pVBox), pCaseACocher, FALSE, FALSE, 5);
  g_signal_connect(pGTKOBJECT(pCaseACocher), 'toggled', GTK_SIGNAL_FUNC(@OnBtnAEtatToggle), NULL);

  // Création du bouton de changement d'état
  pBtnMajEtat := gtk_button_new_with_label('Changer état');
  gtk_box_pack_start(GTK_BOX(pVBox), pBtnMajEtat, FALSE, FALSE, 5);
  g_signal_connect(pGTKOBJECT(pBtnMajEtat), 'clicked', GTK_SIGNAL_FUNC(@OnBtnMajEtatClick), pCaseACocher);

  // Création du bouton de changement d'aspect
  pBtnMajAspect := gtk_button_new_with_label('Changer aspect');
  gtk_box_pack_start(GTK_BOX(pVBox), pBtnMajAspect, FALSE, FALSE, 5);
  g_signal_connect(pGTKOBJECT(pBtnMajAspect), 'clicked', GTK_SIGNAL_FUNC(@OnBtnMajAspectClick), pCaseACocher);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

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

Programmation GTK2 en Pascal - gtk022-1.png

Puis après avoir cliqué sur la case à cocher :

Programmation GTK2 en Pascal - gtk022-2.png

Puis après avoir cliqué sur le bouton de changement d'aspect :

Programmation GTK2 en Pascal - gtk022-3.png

Boutons : GtkButton ~ GtkToggleButton ~ GtkCheckButton ~ GtkRadioButton