Bonjour je désirerai réaliser un éditeur de fichier CSS et j'ai actuellement un petit problème de gestion de mes onglets je vous explique. J'Utilise une liste doublement chaînée GList pour gérer mes onglets mais le problème ne viens pas de là.
Pour fermer mes onglets j'essaie d'avoir un bouton de fermeture en haut de l'onglet actif. Lorsque je crée un nouvel onglet le bouton de fermeture de l'onglet précédent est caché et j'affiche le bouton de fermeture sur le nouvel onglet actif.

Ainsi seul l'onglet actif possède un bouton de fermeture d'onglet. Mon problème est que lorsque je change d'onglet j'arrive pas à gérer ça. Il me fait apparaitre le bouton de fermeture sur le bouton que j'avais précédemment sélectionné.

Ex : Je suis sur l'onglet 3 je passe sur le 2 rien ne change, je passe sur le 1 il me fait apparaitre le bouton de fermeture sur l'onglet 2.

Trêve de blabla je vous montre mes fonctions :

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
 
/// Fonction d'ajout d'un autre onglet
 
void add_notebook(GtkWidget *widget, Fenetre *window)
{
 
    if(window->doc->ouvert==0)
    {
        window->doc->tous = NULL;
    }
 
    onglet *nouveau = NULL;
    onglet * onglet_precedent = NULL;
    nouveau = malloc(sizeof(onglet));
    nouveau->nom = NULL;
    nouveau->sauve = TRUE;
    gchar *nom_onglet = NULL;
 
    /// Création d'une box pour contenir le titre de l'onglet et le bouton de fermeture
 
    nouveau->onglet_box = gtk_hbox_new (FALSE, 0);
    nom_onglet = g_strdup_printf("Nouveau Document %d",window->doc->ouvert);
    nouveau->label = gtk_label_new (nom_onglet);
    gtk_box_pack_start (GTK_BOX (nouveau->onglet_box), nouveau->label, TRUE, TRUE, 0);
    nouveau->bouton = gtk_button_new ();
    nouveau->image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
    gtk_button_set_image (GTK_BUTTON (nouveau->bouton), nouveau->image);
    gtk_button_set_relief (GTK_BUTTON (nouveau->bouton), GTK_RELIEF_NONE);
    gtk_box_pack_start (GTK_BOX (nouveau->onglet_box), nouveau->bouton, TRUE, TRUE, 0);
 
    /// Ajout du nouvel onglet dans la liste doublement chainée
 
    window->doc->tous = g_list_append(window->doc->tous, nouveau);
    nouveau->fenetre_scrollable = gtk_scrolled_window_new (NULL, NULL);
    nouveau->zone_texte = GTK_TEXT_VIEW (gtk_text_view_new ());
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (nouveau->fenetre_scrollable), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    nouveau->buffer = gtk_text_view_get_buffer (nouveau->zone_texte);
 
    gtk_container_add (GTK_CONTAINER (nouveau->fenetre_scrollable), GTK_WIDGET (nouveau->zone_texte));
    nouveau->label = gtk_label_new("Nouveau document");
    window->doc->index = gtk_notebook_append_page (window->doc->onglet, nouveau->fenetre_scrollable, nouveau->onglet_box);
 
    gtk_widget_show_all(nouveau->onglet_box);
    gtk_widget_show_all(GTK_WIDGET(window->doc->onglet));
    gtk_notebook_set_current_page (window->doc->onglet, window->doc->index);
 
    /// Positionnement sur l'ancien onglet pour cacher le bouton de fermeture
 
    onglet_precedent = g_list_nth_data(window->doc->tous,window->doc->precedent);
    if(onglet_precedent != NULL)
        {
            gtk_widget_hide(onglet_precedent->bouton);
        }
    window->doc->precedent = window->doc->index;
 
    window->doc->ouvert++;
 
    g_signal_connect (G_OBJECT (nouveau->bouton), "clicked", G_CALLBACK (fermer_onglet), window);
    g_signal_connect (G_OBJECT (window->doc->onglet), "switch-page", G_CALLBACK(switch_onglet), window);
 
}
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
 
void switch_onglet(GtkNotebook *notebook,GtkNotebookPage *page,guint page_num,Fenetre *window)
{
 
    onglet *onglet_precedent = NULL;
    onglet_precedent = g_list_nth_data(window->doc->tous, window->doc->precedent);
    if(onglet_precedent != NULL)
        {
            //printf("\nOK\n");
            gtk_widget_hide(onglet_precedent->bouton);
        }
    window->doc->precedent = gtk_notebook_get_current_page(window->doc->onglet);
    printf("\nnouvel onglet courant : %d\n",window->doc->precedent);
 
    onglet_precedent = NULL;
 
    onglet_precedent = g_list_nth_data(window->doc->tous, window->doc->precedent);
    if(onglet_precedent != NULL)
        {
            gtk_widget_show_all(onglet_precedent->bouton);
        }
 
}