Programmation GTK2 en Pascal/GtkToggleToolButton

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkToggleToolButton permet de gérer un élément de barre d'outils de type bouton poussoir qui ne peut prendre que deux états : enfoncé ou relâché.

C'est une nouveauté de la version 2.6 de Gtk+.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkToolItem
                      └─GtkToolButton
                          ├─GtkMenuToolButton
                          └─GtkToggleToolButton
                              └─GtkRadioToolButton

Utilisation de base[modifier | modifier le wikicode]

Création[modifier | modifier le wikicode]

Pour créer un bouton poussoir pour une barre d'outils, Gtk+ permet l'utilisation de deux fonctions différentes :

function gtk_toggle_tool_button_new : PGtkToolItem;
function gtk_toggle_tool_button_new_from_stock(stock_id : Pgchar) : PGtkToolItem;

La première fonction permet de créer un bouton poussoir. Il sera d'apparence « blanche ». Il faut utiliser les fonctions de son ancêtre GtkToolButton pour y ajouter un label et/ou une image.

La deuxième fonction permet également de créer un bouton poussoir en utilisant les GtkStockItem qui est une structure contenant les informations sur le label et l'image à afficher. Gtk+ comporte déjà beaucoup de GtkStockItem prédéfinis (en tout cas les plus courant). Le paramètre stock_id est donc l'identifiant du GtkStockItem à utiliser.

NB : Contrairement aux fonctions usuelles de Gtk+ de création de contrôles, ces fonctions ne renvoient pas un PGtkWidget mais un PGtkToolItem.

État du bouton[modifier | modifier le wikicode]

Il peut être intéressant de connaître l'état du bouton pour agir en conséquence. Une fois encore, rien de plus simple on utilise la fonction :

function gtk_toggle_tool_button_get_active(button : PGtkToggleButton) : gboolean;

Cette dernière nous renvoie TRUE si le bouton est enfoncé et FALSE sinon. Afin de pouvoir utiliser le paramètre toggle_button qui est le bouton dont on veut connaître l'état, il faut utiliser la fonction GTK_TOGGLE_BUTTON.

Pour modifier l'état du bouton, c'est aussi simple :

procedure gtk_toggle_tool_button_set_active(button : PGtkToggleButton; is_active : gboolean);

Il suffit de mettre le paramètre is_active à TRUE si l'on veut enfoncer le bouton ou à FALSE pour le relâcher.

Quand l'état du bouton change, par l'action de l'utilisateur ou du programme, un signal « toggled » est émis.

Programme exemple[modifier | modifier le wikicode]

Nous allons créer dans une fenêtre une barre d'outils avec deux boutons poussoir, créés chacun avec les deux fonctions disponibles.

Voilà le fichier gtk045.pas :

program gtk045;

uses glib2, gtk2;

procedure gtk_toolbar_insert(toolbar : PGtkToolbar; item : PGtkToolItem; pos : gint); cdecl;
  external gtklib name 'gtk_toolbar_insert';

var
  pFenetre     : PGtkWidget;
  pVBox        : PGtkWidget;
  pBarreOutils : PGtkWidget;
  pBoutonPoussoir1 : PGtkToolItem;
  pBoutonPoussoir2 : PGtkToolItem;
  pLabel       : 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), 'Gtk045 : Barre d''outils');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', G_CALLBACK(@gtk_main_quit), NULL);

  // Création de la GtkVBox
  pVBox := gtk_vbox_new(FALSE, 5);
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création de la barre d'outils
  pBarreOutils := gtk_toolbar_new;
  gtk_box_pack_start(GTK_BOX(pVBox), pBarreOutils, FALSE, FALSE, 0);

  // Création des boutons poussoir
  pBoutonPoussoir1 := gtk_toggle_tool_button_new_from_stock(GTK_STOCK_OPEN);
  gtk_toolbar_insert(GTK_TOOLBAR(pBarreOutils), pBoutonPoussoir1, -1);

  pBoutonPoussoir2 := gtk_toggle_tool_button_new;
  gtk_toolbar_insert(GTK_TOOLBAR(pBarreOutils), pBoutonPoussoir2, -1);
  gtk_tool_button_set_label(GTK_TOOL_BUTTON(pBoutonPoussoir2), 'Btn 2');

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

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

Voilà ce que donne l'exécution du programme gtk045 juste après le lancement :

Puis après avoir cliqué sur les deux boutons :


Barre d'outils : GtkToolbar ~ GtkToolItem ~ GtkToolButton ~ GtkMenuToolButton ~ GtkToggleToolButton ~ GtkRadioToolButton ~ GtkSeparatorToolItem