Je veux obtenir un GtkTreePath ou GtkTreeIter à la dernière ligne dans un GtkTreeModel, mais GtkTreeModel n'a pas de fonction pour cela. Je serai heureux avec des réponses et des exemples dans C, ou Python, ou les deux;).Comment puis-je obtenir un GtkTreePath ou GtkTreeIter à la dernière ligne dans un GtkTreeModel?
Répondre
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.
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
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;
}
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