Programmation GTK/Barres de progression

Un livre de Wikilivres.
Programmation GTK
Programmation GTK
Programmation GTK
Sommaire
Modifier ce modèle ce sommaire


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.