2010-02-10 2 views
2

필터링 된 후 정렬 된 ListStore가 있습니다. 다음과 같이 보입니다 :Gtk에서 x 및 y 좌표로 정렬 된 TreeView에서 경로를 얻는 방법은 무엇입니까?

// Create a model for the cards 
cardListStore = new ListStore (typeof (Card)); 

// Set up the tree view 
cardFilter = new TreeModelFilter (cardListStore, null); 
cardFilter.VisibleFunc = new TreeModelFilterVisibleFunc (FilterCards); 
cardSort = new TreeModelSort (cardFilter); 
cardTreeView.Model = cardSort; 

마우스 오른쪽 버튼을 클릭 할 때 각 행에 맞는 컨텍스트 메뉴를 가져 오려고합니다. 내 클릭 핸들러는 다음과 같습니다.

[GLib.ConnectBeforeAttribute] 
void HandleCardTreeViewButtonPressEvent (object o, ButtonPressEventArgs args) 
{ 
    if (args.Event.Button != 3) 
     return; 

    TreePath path; 
    // If right click on empty space 
    if (!cardTreeView.GetPathAtPos (Convert.ToInt32 (args.Event.X), 
            Convert.ToInt32 (args.Event.Y), 
            out path)) { 
     MakeCardEmptySpaceContextMenu().Popup(); 
     return; 
    } 

    TreeIter iter; 
    if (!cardListStore.GetIter (out iter, path)) 
     return; 

    Card card = (Card) cardListStore.GetValue (iter, 0); 

    MakeCardContextMenu (card, iter).Popup(); 
} 

이 작업은 ListStore가 필터링되거나 정렬되지 않은 경우에 효과적입니다. 그러나 그것이 틀린 행을줍니다.

는 예를 들어, 정렬하기 전에 행은 다음과 같이 말한다 :

들이 정렬 한 후

는, 그들은 이렇게 봐
B
C :

B
A
C

두 번째 행 ("A")은 모델이 정렬되기 전에 B가 있던 곳이기 때문에 "B"를 제공합니다. 필터링 할 때도 마찬가지입니다. 이 필터링 된 후 모델은, 다음과 같습니다 말 :

두 번째 행 ("C")에
C

을 마우스 오른쪽 버튼으로 클릭은 여전히 ​​당신에게 "B"를 줄 것이다.

이 문제를 해결하는 방법은 무엇입니까?

답변

2

cardListStore 대신 cardSort에서 iter와 값을 가져와야했습니다.

if (!cardListStore.GetIter (out iter, path)) 
    return; 

Card card = (Card) cardListStore.GetValue (iter, 0); 

if (!cardSort.GetIter (out iter, path)) 
    return; 

Card card = (Card) cardSort.GetValue (iter, 0); 
0

사용자와 데이터 사이에 필터가있는 것처럼 보입니다. 이는 트리에 표시되는 것입니다. 당신은 지금 ... 나무 뒤에 데이터를

을 찾고, 내가 GTK에 익숙하지 해요,하지만 아마도 뭔가

처럼
TreeModelSort.convert_path_to_child_path ? 

얻을 수있는 방법이있다 내기한다의 VIEW 어떤 행 보고 계신 MODEL을 실제 모델 데이터로 변환하십시오.

+0

는'ConvertPathToChildPath' (와'ConvertChildPathToPath')이 어떤 영향을 미칠 것 같지 않습니다됩니다. 나는 또한'ConvertIterToChildIter'와'ConvertChildIterToIter'를 사용하여 엉망으로 만들려고했지만 null 참조 예외가 발생했습니다. –

+0

사실,'cardTreeView'의'Model'은'cardListStore'가 아닌'cardSort'입니다. (첫 번째 코드 스 니펫의 마지막 줄을보십시오). 그래서'cardTreeView'가 두 번째 코드 스 니펫에서 원하는 것을 말할 수있을 것이라고 생각할 것입니다. 나 donno. 그러나 아이디어에 감사드립니다! –