IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

[Gtk+2] Réordonner les widgets d'un container


Sujet :

GTK+ avec C & C++

  1. #1
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut [Gtk+2] Réordonner les widgets d'un container
    Bonjour à tous,

    Je souhaiterai intervertir l'ordre d'affichage de deux widgets :
    Dans mon exemple, j'ai une fenêtre qui affiche une liste de bouton [c][b][a].
    A l'aide de la fonction swap() je souhaiterai afficher [a][b][c].

    Je ne sais pas comment implémenter cette fonction. Avez vous une piste à me proposer ?

    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
     
    #include <gtk/gtk.h>
     
    static void
    swap (GtkWidget *container, GtkWidget *child1, GtkWidget *child2)
    {
        // TODO ?
    }
     
    int
    main (int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *container;
        GtkWidget *label_c;
        GtkWidget *label_b;
        GtkWidget *label_a;
     
        gtk_init (&argc, &argv);
     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_signal_connect (GTK_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
        container = gtk_vbox_new (FALSE, 0);
     
        label_a = gtk_button_new_with_label ("a");
        label_b = gtk_button_new_with_label ("b");
        label_c = gtk_button_new_with_label ("c");
     
        gtk_container_add (GTK_CONTAINER (container), label_c);
        gtk_container_add (GTK_CONTAINER (container), label_b);
        gtk_container_add (GTK_CONTAINER (container), label_a);
     
        gtk_container_add (GTK_CONTAINER (window), container);
     
     
    //    swap(container, label_a, label_c);
     
     
        gtk_widget_show_all (window);
     
        gtk_main ();
     
        return 0;
    }
    Cdlt,

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Sans trop rechercher une solution technique le principe serait le suivant :
    • Récupérer dans une liste tous les wigets enfants (avec la fonction GList * gtk_container_get_children (GtkContainer *container);,)
    • détacher les widgets enfants du parent dans lequel ils sont actuellement insérés (void gtk_widget_unparent (GtkWidget *widget);). Attention cette fonction semble plutôt prévue pour la construction d'un widget),
    • insérer dans le nouvel ordre les enfants de la liste.

  3. #3
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut
    Je viens de tester ça, mais ça n'a pas l'aire de modifier l'ordre des widgets

    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
    static void
    g_list_swap(GList *list, gpointer child1, gpointer child2) {
        GList *item1 = g_list_find(list, child1);
        GList *item2 = g_list_find(list, child2);
     
        gpointer data = item1->data;
        item1->data = item2->data;
        item2->data = data;
    }
     
    void
    swap (GtkWidget *container, GtkWidget *child1, GtkWidget *child2)
    {
        GList *children = gtk_container_get_children(container);
     
        GList *it;
        for (it=g_list_first(children); it; it=it->next) {
            g_object_ref(it->data);
            gtk_widget_unparent(GTK_WIDGET(it->data));
        }
     
        //g_list_to_string(children);// c, b, a
        g_list_swap(children, child1, child2);
        //g_list_to_string(children);// a, b, c
     
        for (it=g_list_first(children); it; it=it->next) {
            gtk_widget_set_parent(GTK_WIDGET(it->data), container);
        }
     
    }

  4. #4
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut
    J'ai trouvé deux méthode qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void swap (GtkWidget *container, GtkWidget *child1, GtkWidget *child2) {
        GList *children = gtk_container_get_children(container);
        gint i1 = g_list_index(children, child1);
        gint i2 = g_list_index(children, child2);
     
        gtk_box_reorder_child (GTK_BOX(container), child1, i2);
        gtk_box_reorder_child (GTK_BOX(container), child2, i1);
    }
    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
    void
    swap (GtkWidget *container, GtkWidget *child1, GtkWidget *child2)
    {
        GValue value = G_VALUE_INIT;
        g_value_init(&value, G_TYPE_INT);
     
        gtk_container_child_get_property (container, child1, "position", &value);
        gint i1 = g_value_get_int(&value);
     
        gtk_container_child_get_property (container, child2, "position", &value);
        gint i2 = g_value_get_int(&value);
     
        g_value_set_int(&value, i2);
        gtk_container_child_set_property (container, child1, "position", &value);
     
        g_value_set_int(&value, i1);
        gtk_container_child_set_property (container, child2, "position", &value);
    }
    PS: Je pense que unparent est utile pour faire un swap entre deux container. Merci pour l'info (mais ce n'est pas pour tout de suite)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Gtk/Gdk] Image de fond qui cache les widgets
    Par Aspic dans le forum GTK+ avec C & C++
    Réponses: 14
    Dernier message: 10/11/2009, 17h16
  2. les widgets avec gtk+
    Par opensource dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 05/09/2007, 14h49
  3. Réponses: 1
    Dernier message: 03/05/2006, 10h49
  4. [XSLT] Réordonner les éléments en sortie
    Par crossword dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/12/2005, 09h37
  5. comment modifier les widgets dans une fenètre??
    Par afrikha dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 14/10/2005, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo