[GTK/C]Monter un élément de gtk_list_store

Résolu/Fermé
drazx974 Messages postés 48 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 13 octobre 2009 - 23 févr. 2009 à 08:27
drazx974 Messages postés 48 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 13 octobre 2009 - 6 mars 2009 à 11:48
Bonjour,
J'ai une interface GTK+ avec une liste et des boutons qui déplacent les éléments de cette liste.
J'ai réussi à faire les boutons monter en haut de liste, descendre en bas de liste, descendre d'une ligne mais j'ai du mal avec le monter d'une ligne.

voilà le code pour descendre d'une ligne:

GtkTreeSelection* selection;

	Datas *n = (Datas *)datas;
	
	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(n->tree));
	
    gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);

    GtkTreeIter pIter;
    GtkTreeIter position;
    GtkTreeModel *treeView;
    treeView = GTK_TREE_MODEL(n->tree);

	
     if(gtk_tree_selection_get_selected (selection, &treeView, &pIter))
     {
		 position = pIter;
		 gtk_tree_model_iter_next(treeView, &position);
		 gtk_list_store_move_after(n->store, &pIter, &position);
     }


logiquement en remplacent after par before ça devrait être bon mais c'est pas le cas.

3 réponses

drazx974 Messages postés 48 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 13 octobre 2009 8
25 févr. 2009 à 13:06
up please
0
drazx974 Messages postés 48 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 13 octobre 2009 8
27 févr. 2009 à 07:41
personne ne sais faire monter des éléments en GTK ? :'(
0
drazx974 Messages postés 48 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 13 octobre 2009 8
6 mars 2009 à 11:48
J'ai trouvé la solution mais ce n'est pas aussi simple que pour le bouton descendre.

le principe c'est d'avoir 2 iterateurs un qui va se déplacer pour compter et l'autre pour comparer et descendre jusqu'à sa nouvelle place (pMove, pOrig).

on met pMove en haut de liste puis on le descend jusqu'a trouver celui d'origine en incrémentant un compteur à chaque boucle.

ensuite on déplace pOrig en haut de liste et si l'itérateur d'origine est en seconde place on le laisse en haut de liste sinon on le descend autant de fois qu'à donné le compteur en comparant avec un second compteur pour savoir ou on en est.

le code :
    GtkTreeSelection* selection;
    GtkTreeIter position;
    GtkTreeIter pMove;
    GtkTreeIter pOrig;
    GtkTreeModel *treeView;
	
	int compteur;
	int compteurbis;
	
	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(n->tree)); //recupère la selection, n est un struct de mon programme
	gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); //mode de selection
    
	treeView = GTK_TREE_MODEL(n->tree);
	
	if(gtk_tree_selection_get_selected (selection, &treeView, &pOrig)) //si il y a une selection
	{
		gtk_tree_model_get_iter_first(GTK_TREE_MODEL(n->store), &pMove); //placer l'iterateur déplaceant en haut de liste
		
		compteur = 0;
		while(pMove.user_data != pOrig.user_data)
		{
			gtk_tree_model_iter_next(treeView, &pMove);
			compteur++;
		}
		
		gtk_list_store_move_after(n->store, &pOrig, NULL); //placer l'iterateur original en haut de liste
		
		position = pOrig;
		compteurbis = 0;
		
		if(compteur > 1) //si l'original n'est pas en seconde position
		{
			while(compteurbis < compteur) //le faire descendre autant de fois que compteur - 1
			{
				compteurbis++;
				gtk_tree_model_iter_next(treeView, &position);
				gtk_list_store_move_before(n->store, &pOrig, &position);
			}
		}
		
		
	}
0