2010-05-24 8 views

Répondre

2

Vous devriez être en mesure de passer par un GtkTreePath, un peu d'un hack peut-être mais toujours dans l'API:

GtkTreePath *path; 
GtkTreeIter iter; 

/* With NULL as iter, we get the number of toplevel nodes. */ 
gint rows = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model), NULL); 

/* Now get a path from the index. */ 
path = gtk_tree_path_new_from_indices(rows - 1, -1); 

/* Ask the model for an iter to the node identified by the path. */ 
gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); 

/* Drop the path, we're done with it, iter is final output. */ 
gtk_tree_path_free(path); 

Note: Je n'ai pas testé ce qui précède comme je l'ai écrit, mais je suis sûr que j'ai fait quelque chose de très similaire en code réel.

1

Voici comment je le fais actuellement, mais il semble maladroit ...

exemple C:

void get_iter_last(GtkTreeModel *mdl, GtkTreeIter *itr) 
{ 
    GtkTreeIter i; 
    if (gtk_tree_model_get_iter_first(mdl, &i)) { 
    while (gtk_tree_model_iter_next(mdl, &i)) { 
     *itr = i; 
    } 
    } 
}

exemple Python:

def get_iter_last(mdl): 
    itr = mdl.get_iter_first() 
    last = None 
    while itr: 
    last = itr 
    itr = mdl.iter_next(itr) 
    return last
2

Même si la réponse de dérouleur était correcte et assez pour me mettre sur la bonne voie, je pensais que j'ajouter mes solutions finales juste pour bien être complet:

Python:

def model_get_iter_last(model, parent=None): 
    """Returns a gtk.TreeIter to the last row or None if there aren't any rows. 
    If parent is None, returns a gtk.TreeIter to the last root row.""" 
    n = model.iter_n_children(parent) 
    return n and model.iter_nth_child(parent, n - 1) 

C:

/** 
* Set itr_last to last item of parent if parent has any rows. 
* If parent is NULL, set itr_last to last root row. 
* Returns TRUE if itr_last could be set, otherwise FALSE. 
*/ 
gboolean model_get_iter_last(GtkTreeModel *model, 
           GtkTreeIter *itr_last, 
           GtkTreeIter *parent) 
{ 
    gboolean success; 
    gint n; 

    if (n = gtk_tree_model_iter_n_children(model, parent)) { 
    success = gtk_tree_model_iter_nth_child(model, itr_last, parent, n - 1); 
    } 
    else { 
    itr_last = NULL; 
    success = FALSE; 
    } 
    return success; 
} 
2

Merci pour toutes les réponses précédentes, mais je crois que la solution finale doit comprendre que TreeModel (avec TreeStore) peut stocker des objets avec de nombreux niveaux d'imbrication (par exemple . chemin (2,0,4,2)). La solution postée par 'fresh' n'a pas fonctionné pour moi, car j'avais besoin d'une fonction qui traverserait correctement tous les derniers enfants, jusqu'à ce qu'elle trouve vraiment la dernière rangée. Ci-dessous ma solution finale:

def get_last_iter (self, model): 
    n = model.iter_n_children (None) 
    # list empty 
    if n == 0: 
     return None 
    else: 
     iter = model.iter_nth_child (None, n - 1) 
     n = model.iter_n_children (iter) 
     # last top-level item has no children, so select that last item 
     if n == 0: 
      return iter 
     else: 
      # traverse thru every last child 
      while 1: 
       iter = model.iter_nth_child (iter, n - 1) 
       n = model.iter_n_children (iter) 
       if n == 0: 
        return iter 

Ou forme encore plus courte:

def get_last_iter (self, model): 
    iter = None 
    n = 0 
    while 1: 
     iter = model.iter_nth_child (iter, n - 1) 
     n = model.iter_n_children (iter) 
     if n == 0: 
      return iter