В Gtk, как мне получить путь из отсортированного TreeView по координатам x и y? - PullRequest
2 голосов
/ 10 февраля 2010

У меня есть ListStore, который фильтруется, а затем сортируется. Это выглядит примерно так:

// 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 не фильтруется и не сортируется. Но когда это так, это дает неправильный ряд.

Например, скажем, строки выглядят так, как они отсортированы:

A
B
C

А после сортировки они выглядят так:

B
A
C

Если щелкнуть правой кнопкой мыши по второму ряду («A»), вы получите «B», потому что именно там была B, прежде чем модель была отсортирована. То же самое происходит с фильтрацией. Скажем, модель после фильтрации выглядит следующим образом:

A
C

Если щелкнуть правой кнопкой мыши по второму ряду («C»), вы все равно получите «B».

Есть идеи, как обойти это?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

Мне просто нужно было получить иттер и значение из cardSort вместо cardListStore.

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 голосов
/ 10 февраля 2010

Похоже, что есть фильтр между вами и данными, и это то, что отображается в дереве. Вы смотрите на данные за деревом ...

Теперь я не знаком с GTK, но, возможно, что-то вроде

TreeModelSort.convert_path_to_child_path ?

Должен быть указан способ получить строку ВИДА МОДЕЛИ, которую вы просматриваете, и затем преобразовать ее обратно в реальные данные модели.

...