Programmation GTK/Barres de progression


Les barres de progression sont utilisées pour afficher la progression d'une opération. Elles sont très simple à utiliser comme vous pourrez le constater en étudiant le code ci-dessous. Commençons d'abord par l'appel permettant de créer une nouvelle barre.

 GtkWidget *gtk_progress_bar_new (void);

Maintenant que la barre est créée, nous pouvons l'utiliser.

 void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);

Le premier paramètre est la barre de progression sur laquelle on veut agir, et le second est le pourcentage « effectué », signifiant le remplissage de la barres de 0 à 100 % (réel compris entre 0 et 1).

Les barres de progression sont généralement utilisées avec les délais d'expiration ou autres fonctions identiques (voir la section sur Expirations, fonctions d'E/S et d'attente) pour donner l'illusion du multi-tâches. Toutes emploient la fonction gtk_progress_bar_update de la même façon.

Voici un exemple de barre de progression mise à jour par des expirations. Ce code montre aussi comment réinitialiser une barre.

 #include <gtk/gtk.h>
 
 static int ptimer = 0;
 int pstat = TRUE;
 
 /* Cette fonction incrémente et met à jour la barre de progression,
  * elle la réinitialise si pstat vaut FALSE */
 
 gint progress (gpointer data)
 {
    gfloat pvalue;
     
    /* récupération de la valeur courante de la barre */
 
    pvalue = GTK_PROGRESS_BAR (data)->percentage;
     
    if ((pvalue >= 1.0) || (pstat == FALSE)) {
        pvalue = 0.0;
        pstat = TRUE;
    }
    pvalue += 0.01;
    
    gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);
    
    return TRUE;
 }

 /* Cette fonction signale une réinitialisation de la barre */
 
 void progress_r (void)
 { 
    pstat = FALSE;  
 }

 void destroy (GtkWidget *widget, gpointer *data)
 {
    gtk_main_quit ();
 }

 int main (int argc, char *argv[])
 {
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *label;
    GtkWidget *table;
    GtkWidget *pbar;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (destroy), NULL);
    
    gtk_container_border_width (GTK_CONTAINER (window), 10);
    
    table = gtk_table_new(3,2,TRUE);
    gtk_container_add (GTK_CONTAINER (window), table);
    
    label = gtk_label_new ("Exemple de barre de progression");
    gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2,0,1);
    gtk_widget_show(label);
    
    /* Crée une barre, la place dans la table et l'affiche */
 
    pbar = gtk_progress_bar_new ();
    gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0,2,1,2);
    gtk_widget_show (pbar);
    
    /* Configure le délai d'expiration pour gérer automatiquement la
     *  mise à jour de la barre */ 
 
    ptimer = gtk_timeout_add (100, progress, pbar);
    
    /* Ce bouton indique à la barre qu'elle doit se réinitialiser */
 
    button = gtk_button_new_with_label ("Reset");
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (progress_r), NULL);
    gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,2,3);
    gtk_widget_show(button);
    
    button = gtk_button_new_with_label ("Annuler");
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (destroy), NULL);
    
    gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,2,3);
    gtk_widget_show (button);
    
    gtk_widget_show(table);
    gtk_widget_show(window);
    
    gtk_main ();
    
    return 0;
 }

Dans ce petit programme, il y a quatre parties concernant le fonctionnement général des barres de progression, nous les étudierons dans l'ordre de leurs appels.

 pbar = gtk_progress_bar_new ();

Cet appel crée une nouvelle barre, nommée pbar.

 ptimer = gtk_timeout_add (100, progress, pbar);

Cet appel utilise des délais d'expiration pour permettre un intervalle de temps constant. ces délais ne sont pas nécessaires à l'utilisation des barres de progression.

 pvalue = GTK_PROGRESS_BAR (data)->percentage;

Ce code assigne à pvalue la valeur du pourcentage de la barre.

 gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);

Finalement, ce code met à jour la barre avec la valeur de pvalue.

Et c'est tout ce qu'il y a à savoir sur les barres de progression. Amusez-vous bien.