Programmation GTK2 en Pascal/GtkSpinButton

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkSpinButton permet de gérer la saisie d'une valeur numérique compris entre deux bornes. Il se présente comme une zone de texte dans laquelle on peut saisir un nombre à laquelle est accolée deux flèches qui permettent d'incrémenter ou de décrémenter la valeur.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkEntry
              └─GtkSpinButton

Utilisation de base[modifier | modifier le wikicode]

Création[modifier | modifier le wikicode]

Comme pour les curseurs (GtkHScale et GtkVScale), il y a deux méthodes pour créer un GtkSpinButton.

La première nécessite la création préalable d'un ajustement :

function gtk_spin_button_new(adjustment : PGtkAdjustment; climb_rate : gdouble; digits : guint) : PGtkWidget;

Le paramètre climb_rate qui doit être compris entre 0,0 et 1,0 est la valeur d'accélération quand on appuie longtemps sur une des flèches. À 0, la vitesse de défilement des nombres est constante, à 1,0 elle s'accélère à mesure qu'on laisse longtemps la flèche enfoncée.

Le paramètre digits indique combien de décimales doivent être affichées.

La deuxième fonction permet d'indiquer tout de suite les bornes de saisie :

function gtk_spin_button_new_with_range(min : gdouble; max : gdouble; step : gdouble) : PGtkWidget;

Le paramètre step est le pas d'incrément ou de décrément de la valeur.

Affichage de la valeur[modifier | modifier le wikicode]

Le nombre de décimales peut-être modifié directement :

procedure gtk_spin_button_set_digits(spin_button : PGtkSpinButton; digits : guint);

Valeur saisie[modifier | modifier le wikicode]

La valeur peut-être modifiée par l'utilisateur en tapant sur les touches numériques ou à la souris en cliquant sur les flèches. Par programme, on peut également avec la fonction :

procedure gtk_spin_button_set_value(spin_button : PGtkSpinButton; value : gdouble);

Le paramètre value est la nouvelle valeur.

Quelle que soit la méthode de mise-à-jour, à chaque modification, le signal « value_changed » est émis.

Pour récupérer la valeur saisie, il y a les fonctions, selon le format désiré :

function gtk_spin_button_get_value_as_float(spin_button : PGtkSpinButton) : gdouble;
function gtk_spin_button_get_value_as_int(spin_button : PGtkSpinButton) : gint;

Programme exemple[modifier | modifier le wikicode]

Comme exemple, nous allons créer une fenêtre comportant un GtkSpinButton, un GtkButton et un GtkLabel. Quand on cliquera sur le bouton, on affichera le texte du GtkSpinButton dans le GtkLabel.

Voilà le fichier gtk028.pas :

program gtk028;

uses glib2, gtk2;

type
  TFenetrePrincipale = record
    pFenetre     : PGtkWidget;
    pVBox        : PGtkWidget;
    pChampEntree : PGtkWidget;
    pBouton      : PGtkWidget;
    pLabel       : PGtkWidget;
  end;
  PFenetrePrincipale = ^TFenetrePrincipale;

procedure OnBtnClick(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
  pFenPrinc : PFenetrePrincipale;
  Valeur : GDouble;
  Texte : PGChar;
begin
  // Récuperation des données de la fenêtre principale (qui sont dans AData)
  pFenPrinc := PFenetrePrincipale(AData);

  // Récuperation du texte contenu dans le GtkSpinButton
  Valeur := gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(pFenPrinc^.pChampEntree));
  Texte := g_strdup_printf('%f', [Valeur]); 

  // Modification du texte contenu dans le GtkLabel 
  gtk_label_set_text(GTK_LABEL(pFenPrinc^.pLabel), Texte);
  g_free(Texte);
end;

var
  pFenPrinc : PFenetrePrincipale;
begin
  pFenPrinc := g_malloc(SizeOf(TFenetrePrincipale));

  gtk_init(@argc, @argv);
  pFenPrinc^.pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(pFenPrinc^.pFenetre), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(pFenPrinc^.pFenetre), 320, 200);
  gtk_container_set_border_width(GTK_CONTAINER(pFenPrinc^.pFenetre), 4);
  gtk_window_set_title(GTK_WINDOW(pFenPrinc^.pFenetre), 'Gtk028 : GtkSpinButton');
  gtk_signal_connect(pGTKOBJECT(pFenPrinc^.pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

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

  // Création du GtkSpinButton
  pFenPrinc^.pChampEntree := gtk_spin_button_new_with_range(0, 100, 0.1);
  // Nombre de décimales
  gtk_spin_button_set_digits(GTK_SPIN_BUTTON(pFenPrinc^.pChampEntree), 2);
  gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pChampEntree, TRUE, FALSE, 0);

  pFenPrinc^.pBouton := gtk_button_new_with_label('Copier');
  gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pBouton, TRUE, FALSE, 0);
  g_signal_connect(pGTKOBJECT(pFenPrinc^.pBouton), 'clicked', 
    GTK_SIGNAL_FUNC(@OnBtnClick), gpointer(pFenPrinc));

  pFenPrinc^.pLabel := gtk_label_new(NULL);
  gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pLabel, TRUE, FALSE, 0);

  gtk_widget_show_all(pFenPrinc^.pFenetre);
  gtk_main;
  g_free(pFenPrinc);
end.

Voilà ce que donne l'exécution du programme gtk028 après quelques clics et appuie sur « entrée » :

Saisie de données : GtkEntry ~ GtkHScale ~ GtkVScale ~ GtkSpinButton