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_TREE_VIEW] Sélection multiple


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [GTK_TREE_VIEW] Sélection multiple
    Bonjour,

    Voici mon problème:
    j'ai un GTK_TREE_VIEW configuré avec sélection multiple.
    J'ai un bouton "supprimer" qui permet de supprimer le ou les éléments sélectionnés.

    Je procède donc comme suite (CB_wordsdelbtn est le callback du bouton clicked, CB_wordsdel est appelée pour supprimer chaque élément sélectionné un par un, WIN_managevoc_data est la fenêtre contenant le tout, c'est une structure dans laquelle j'ai mis les 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void CB_wordsdel(gpointer data, gpointer user_data)
    {
    	WIN_managevoc_data_str *WIN_managevoc_data = (WIN_managevoc_data_str*) user_data;
    	GtkTreeIter iter;
    	gchar *word1, *word2, *theme;
    	GtkTreeModel *p_tree_model;
     
    	p_tree_model = gtk_tree_view_get_model(GTK_TREE_VIEW(WIN_managevoc_data->VocTreeview));
     
    	if(p_tree_model != NULL)
    	{
    		if(gtk_tree_model_get_iter(p_tree_model, &iter, data))
    		{
    			gtk_tree_model_get(p_tree_model, &iter, 0, &word1, 1, &word2, 2, &theme, -1);
    			gtk_list_store_remove(WIN_managevoc_data->Store, &iter);
     
    			free(word1);
    			free(word2);
    			free(theme);
    		}
    	}
    }
     
    void CB_wordsdelbtn(GtkWidget* treeview, gpointer data)
    {
    	WIN_managevoc_data_str *WIN_managevoc_data = (WIN_managevoc_data_str*) data;
    	GtkTreeModel *p_tree_model;
     
    	p_tree_model = gtk_tree_view_get_model(GTK_TREE_VIEW(WIN_managevoc_data->VocTreeview));
     
    	WIN_managevoc_data->SelectedRows = gtk_tree_selection_get_selected_rows(WIN_managevoc_data->Selection, &p_tree_model);
     
    	g_list_foreach(WIN_managevoc_data->SelectedRows, CB_wordsdel, WIN_managevoc_data);
     
    	// free memory
    	g_list_foreach(WIN_managevoc_data->SelectedRows, (GFunc)gtk_tree_path_free, NULL);
    	g_list_free(WIN_managevoc_data->SelectedRows);
     
    	(void)treeview;
    }

    Le problème en pratique, c'est que lorsque je sélectionne plusieurs éléments et que je clique sur "supprimer", environ une fois sur deux tous les éléments voulus ne sont pas supprimés.
    Il reste donc des éléments sélectionnés qui auraient dû être supprimés. Pour tout supprimer je dois donc parfois cliquer plusieurs fois sur supprimer.

    Et je ne compends pas où j'ai commis une erreur... si quelqu'un pouvait m'éclairer parce que là je sèche!

    Je vous remercie.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Bon je m'y suis remis et j'ai isolé le problème.

    En fait je me contente d'écrire seulement les noms des éléments sélectionnés dans la liste, pour voir ce qui ne va pas.

    Voici donc la nouvelle fonction de suppression:

    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
    void CB_wordsdel(gpointer data, gpointer user_data)
    {
    	WIN_managevoc_data_str *WIN_managevoc_data = (WIN_managevoc_data_str*) user_data;
    	GtkTreeIter iter;
    	gchar *word1, *word2, *theme;
    	GtkTreeModel *p_tree_model;
     
    	p_tree_model = gtk_tree_view_get_model(GTK_TREE_VIEW(WIN_managevoc_data->VocTreeview));
     
    	if(p_tree_model != NULL)
    	{
    		if(gtk_tree_model_get_iter(p_tree_model, &iter, data))
    		{
    			gtk_tree_model_get(p_tree_model, &iter, 0, &word1, 1, &word2, 2, &theme, -1);
    			//gtk_list_store_remove(WIN_managevoc_data->Store, &iter);
     
    			printf("%s\n", word1);
     
    			free(word1);
    			free(word2);
    			free(theme);
    		}
    	}
     
    	WIN_managevoc_data->total--;
    }
    Comme vous pouvez le voir, gtk_list_store_remove est commenté, et il y a un printf.

    Quand j'exécute le programme le printf affiche bien chaque ligne sélectionnée sans problèmes. J'en déduis donc que la suppression doit faire foirer quelque chose dans les itérateurs.

    Peut être que la solution est de faire une liste chainée des itérateurs, et de les supprimer à la fin dans l'ordre décroissant? Je vais essayer.
    Si vous avez mieux je suis preneur.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Solution trouvée!

    Après avoir fait la liste de tous les éléments sélectionnés (qui semble bien être faite de haut en bas), il suffit de faire un:
    GList* g_list_reverse(GList *list);
    qui inverse entièrement la liste.

    Ainsi il semblerai qu'il n'y ai plus ce souci avec les itérateurs et la suppression semble se passer très bien à chaque fois.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ouais, le fait de virer des éléments ça doit rendre invalide bcp d'itérateurs/gtktreerowreference :-/ Et j'ai pas de super suggestion à te faire là... A part ce que tu comptais essayer

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

Discussions similaires

  1. Sélection multiple dans un sous formulaire ?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2019, 01h05
  2. CFileDialog et sélection multiple
    Par access75 dans le forum MFC
    Réponses: 6
    Dernier message: 23/05/2008, 14h09
  3. [Débutant] Sélection multiples dans une Listbox
    Par eraim dans le forum Access
    Réponses: 4
    Dernier message: 15/10/2005, 03h21
  4. créer un [ComboBox ??? ] à sélection multiple ?
    Par chasseur37 dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/07/2005, 07h52
  5. [JList] bloquer la sélection multiple
    Par soad dans le forum Composants
    Réponses: 2
    Dernier message: 05/08/2004, 22h28

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