2010-05-24 2 views
2

GtkTreeModel의 마지막 행에 GtkTreePath 또는 GtkTreeIter를 가져 오려고하지만 GtkTreeModel에 해당 기능이 없습니다.GtkTreeModel의 마지막 행으로 GtkTreePath 또는 GtkTreeIter를 얻으려면 어떻게해야합니까?

C 나 Python 또는 둘 다에서 답변과 예제에 만족합니다.).

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; 
    } 
    } 
}

파이썬 예 :

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

답변

2

당신은 통과 할 수 있어야한다

C 예 ... 여기

1

내가 현재 그것을 할 방법이지만, 서투른 것 같다 GtkTreePath, 해킹이 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); 

참고 : 필자가 작성한대로 위 테스트를 수행하지는 않았지만 실제 코드에서 이와 비슷한 작업을 수행했다는 것을 확신합니다.

파이썬 :

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 언 와인드의 대답은 정확하고 바른 길에 나를 넣어 충분했다하더라도

2

은, 난 그냥 완전성 '을 위해 나의 최종 솔루션을 추가 할 거라고 생각 : 이전의 모든 답변을

/** 
* 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

덕분에, 그러나 나는 최종 솔루션 (TreeStore 포함)하는 TreeModel가 (중첩 여러 수준의 항목을 저장할 수 있다는 것을 포함해야한다고 생각 예를 들어, . 경로 (2,0,4,2)). 내가 마지막 행을 찾을 때까지 마지막 아이를 모두 제대로 통과 할 수있는 함수가 필요했기 때문에 '신선함'으로 게시 된 솔루션이 저에게 효과적이지 않았습니다.

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 

심지어 짧은 형태 :

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 
다음은 내 최종 솔루션입니다