In Gtk, wie bekomme ich einen Weg von einem TreeView sortiert nach x und y-Koordinaten?

StackOverflow https://stackoverflow.com/questions/2233545

  •  19-09-2019
  •  | 
  •  

Frage

Ich habe ein ListStor, die gefiltert und dann sortierten. Es sieht etwa so aus:

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

Ich möchte ein ein Kontextmenü spezifisch für jede Reihe bekommen haben, wenn ich auf der rechten Maustaste. Meine Click-Handler sieht etwa so aus:

[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 ();
}

Das funktioniert, wenn die ListStore nicht gefiltert oder sortiert. Aber wenn es ist, gibt es die falsche Zeile.

Zum Beispiel, sagen die Zeilen wie folgt aussehen, bevor sie sortiert werden:

A
B
C

Und nachdem sie sortiert sind, sie wie folgt aussehen:

B
A
C

Ein Rechtsklick auf die zweite Reihe ( „A“) wird Ihnen „B“, weil das ist, wo B war, bevor das Modell sortiert wurde. Das gleiche geschieht für die Filterung. Sprechen Sie das Modell, nachdem es gefiltert wird, sieht wie folgt aus:

A
C

Ein Rechtsklick auf die zweite Reihe ( "C") würden Sie noch geben "B".

Jede Idee, wie dies zu umgehen?

War es hilfreich?

Lösung

Ich brauche nur die iter und den Wert von cardSort, statt cardListStore zu erhalten.

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

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

wird

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

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

Andere Tipps

Sieht aus wie ein Filter zwischen Ihnen und den Daten, und das ist, was durch den Baum angezeigt wird. Sie suchen sich die Daten hinter dem Baum ...

Nun, ich bin mit GTK nicht vertraut, aber vielleicht so etwas wie

TreeModelSort.convert_path_to_child_path ?

Es muss einen Weg Wette zu bekommen, was Zeile der Ansicht des Modells Sie suchen und übersetzt dann das zurück auf reale Modelldaten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top