Bonjour à tous,

J'ai un double problème avec le code suivant, qui concerne l'usage des gtk_scrolled_window et l'ajout dynamique d'éléments dans une gtk_box. Peut-être dois-je faire ici deux posts différents (si tel est le cas, merci de me le dire, je modifierai ce post), mais il me semble que ces deux problèmes sont liés. Le code suivant est un code exemple qui montre de quoi il s'agit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* travail sur les scrolled barres et les implémentations dynamiques de v box */
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
 
GtkWidget* vbox; /* v box princale */
GtkWidget* vbox2;
GtkAdjustment *verticalAdjust;
GtkWidget* barre; /* scrolled windows */
 
int main(int argc,char **argv)
{
    GtkWidget* pWindow;
    GtkWidget* pLabel[20];
    GtkWidget* boutton;
    int i;
    char tempo[20];
 
    void suite(GtkWidget *widget, gpointer pData); /* fonction call back si boutton clicked */
 
    gtk_init(&argc,&argv);
    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(pWindow), "scrolled barre et construction de vbox");
    gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    /* Creation des labels */
    for (i=0; i<20;i++)
    {
            pLabel[i]=gtk_label_new(NULL);
            (void)sprintf(tempo,"label %2d",i);
            gtk_label_set_text (pLabel[i], tempo);
    }
    /* on les mets dans une v box */
    vbox2=gtk_vbox_new(FALSE, 0);
    for (i=0; i<20;i++)
        gtk_box_pack_start(GTK_BOX(vbox2), pLabel[i], TRUE, TRUE, 0);
    /* creation d'une autre v box (principale) */
    vbox=gtk_vbox_new(FALSE, 0);
    /* creation du widget avec barre de défilement */
    barre=gtk_scrolled_window_new(NULL, NULL);
    /* on ne veux que la barre verticale - if needed */
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(barre), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
    /* on ne veux pas de bord autour */
    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(barre), GTK_SHADOW_NONE);
    /* on met la barre à droite */
    gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(barre), GTK_CORNER_BOTTOM_RIGHT);
    /* on déroule tout en bas */
    verticalAdjust=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(barre));
    gtk_adjustment_set_value(verticalAdjust, verticalAdjust->upper);
    gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(barre), verticalAdjust);
    /* creation d'un bouton et on le met dans la v box principale */
    boutton=gtk_button_new_with_label("ajout d'un label");
    gtk_box_pack_start(GTK_BOX(vbox), boutton, FALSE, FALSE, 0);
    /* on met la v box dans le widget avec barre de défilement*/
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(barre), vbox2);
    /* On ajoute le widget avec barre de défilement a l'intérieur de la v box principale */
    gtk_box_pack_start(GTK_BOX(vbox), barre, TRUE, TRUE, 0);
    gtk_container_add(GTK_CONTAINER(pWindow), vbox);
    /* Connexion des signaux */
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(G_OBJECT(boutton), "clicked", G_CALLBACK(suite), NULL);
    /* Affichage de la fenêtré et de tout ce qu'il contient */
    gtk_widget_show_all(pWindow);
    gtk_main();
    return EXIT_SUCCESS;
}
void suite(GtkWidget *window, gpointer data)
{
    GtkWidget* label=NULL;
    label=gtk_label_new("un autre label");
    /* on rajoute un élément à la v box */
    gtk_box_pack_start(GTK_BOX(vbox2),label, TRUE, TRUE, 0);
    /* et on déroule tout en bas */
    verticalAdjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(barre));
    gtk_adjustment_set_value(verticalAdjust, verticalAdjust->upper);
    gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(barre), verticalAdjust);
}
Cliquer sur le bouton, comme vous pouvez le voir, a deux missions :

1) Rajouter un label à la box verticale, et
2) scrolling tout en bas la scroll barre.

Les deux questions que j'ai sont les suivantes :

1) Les lignes de code 46 à 49 doivent faire un scrolling tout en bas par défaut (avant tout click sur le bouton) de la scroll barre. Ca ne fonctionne pas. Seul un(des) click(s) sur le bouton (i.e., le code de la fonction callback) le fait correctement. Pourquoi ? C'est exactement le même code qu'il y a aux deux endroits !

2) L'ajout d'un label à la box verticale (fait dans la fonction callback) ne fonctionne pas. Pourquoi ? Ne peut-on pas ajouter quelque chose à un gtk_box une fois qu'elle est insérée dans un widget ? Si oui, comment fait alors ? Doit-on tout "démonter", ajouter, et tout "remonter" ? Ca me parait bien lourd.

Merci d'avance pour toute aide sur ces deux points.

Cordialement, Eric.