Programmation GTK2 en Pascal/GtkVScale

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkVScale est un curseur vertical qui permet de sélectionner une valeur numérique.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkRange
              └─GtkScale
                  └─GtkVScale

Utilisation de base[modifier | modifier le wikicode]

Création[modifier | modifier le wikicode]

La création d'un curseur se fait grâce à la fonction :

function gtk_vscale_new(adjustment : PGtkAdjustment) : PGtkWidget;

Le paramètre adjustment est l'ajustement que le curseur doit représenter. Le même ajustement peut être attribué à plusieurs curseurs sur la même fenêtre. Le déplacement de l'un entrainera le déplacement des autres.

La création d'un ajustement qui est un type PGtkObject se fait grâce à la fonction :

function gtk_adjustment_new(value : gdouble; lower : gdouble; upper : gdouble; 
  step_increment : gdouble; page_increment : gdouble; page_size : gdouble) : PGtkObject;

Le paramètre value représente la valeur actuelle de l'ajustement, les paramètres lower et upper sont les valeurs mini et maxi, donc les valeurs quand le curseur sera respectivement à gauche et à droite. Le paramètre step_increment est la valeur qui est utilisée pour incrémenter ou décrémenter la valeur de l'ajustement quand on bouge le curseur d'une position. Les autres paramètres doivent être utilisés pour les ascenseurs.

On peut en fait créer un curseur plus rapidement en utilisant la fonction :

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

Il n'y a pas d'ajustement à fournir, juste les valeurs min et max, ainsi que le pas, step.

Affichage de la valeur[modifier | modifier le wikicode]

Par défaut, la valeur est affichée près du curseur. On peut changer cela avec la fonction :

procedure gtk_scale_set_draw_value(scale : PGtkScale; draw_value : gboolean);

Le paramètre scale est le curseur et si on met FALSE dans draw_value, la valeur ne sera pas affichée. TRUE l'affiche.

On peut également déterminer le nombre de chiffres après la virgule on désire afficher avec la fonction :

procedure gtk_scale_set_digits(scale : PGtkScale; digits : gint);

Le paramètre digits permet d'indiquer le nombre de chiffres désirés.

Une dernière fonction permet de décider de l'emplacement de l'affichage de la valeur, par défaut celui-ci étant au dessus du curseur :

procedure gtk_scale_set_value_pos(scale : PGtkScale; pos : TGtkPositionType);

Le paramètre pos peut prendre les valeurs :

  • GTK_POS_LEFT, pour la valeur placée à gauche du curseur ;
  • GTK_POS_RIGHT, pour la valeur à droite ;
  • GTK_POS_TOP, pour la valeur au dessus ;
  • GTK_POS_BOTTOM, pour la valeur en dessous.

Position du curseur[modifier | modifier le wikicode]

C'est l'objet GtkRange dont GtkHScale hérite les propriétés qui gère la position du curseur. Pour positionner le curseur, on a donc la fonction :

procedure gtk_range_set_value(range : PGtkRange; value : gdouble);

Le paramètre value donne la valeur.

Pour récupérer la position du curseur, on utilisera :

function gtk_range_get_value(range : PGtkRange) : gdouble;

À noter qu'à chaque déplacement, un signal « value_changed » est émis.

Programme exemple[modifier | modifier le wikicode]

Dans une fenêtre, on va placer un curseur vertical pouvant aller de 0 à 100 avec comme valeur initiale 50 et l'affichage de la valeur à droite. On aura un bouton et un label, le bouton permettant d'afficher la valeur dans le label.

Voilà le fichier gtk027.pas :

program gtk027;

uses glib2, gtk2;

type
  TFenetrePrincipale = record
    pFenetre     : PGtkWidget;
    pHBox        : PGtkWidget;
    pVBox        : PGtkWidget;
    pCurseur     : 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 GtkHScale
  Valeur := gtk_range_get_value(GTK_RANGE(pFenPrinc^.pCurseur));
  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), 'Gtk026 : Curseur');
  gtk_signal_connect(pGTKOBJECT(pFenPrinc^.pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  pFenPrinc^.pHBox := gtk_hbox_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pFenPrinc^.pFenetre), pFenPrinc^.pHBox);

  // Création du GtkVScale
  pFenPrinc^.pCurseur := gtk_vscale_new_with_range(0, 100, 1);
  // Position du curseur
  gtk_range_set_value(GTK_RANGE(pFenPrinc^.pCurseur), 50);
  // Affichage de 2 chiffres après la virgule
  gtk_scale_set_digits(GTK_SCALE(pFenPrinc^.pCurseur), 2);
  // Affichage de la valeur à droite
  gtk_scale_set_value_pos(GTK_SCALE(pFenPrinc^.pCurseur), GTK_POS_RIGHT);
  gtk_box_pack_start(GTK_BOX(pFenPrinc^.pHBox), pFenPrinc^.pCurseur, TRUE, FALSE, 0);

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

  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 gtk027 après avoir déplacé le curseur et cliqué sur le bouton :

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