[SOLVED] Probleme mit gtk.TreeModelFilter

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
br3z3l
User
Beiträge: 10
Registriert: Mittwoch 30. Januar 2008, 21:31
Kontaktdaten:

Hallo erstmal, ich bin noch ein relativer Frischling in Python, bin bisher aber gut über die Runden gekommen und konnte meine Probleme alleine (mit Hilfe diverser Suchen) lösen.

Nun stehe ich allerdings vor einem Problem für das ich keinen Lösungsansatz sehe:
Ich möchte aus einer exaile-Musikbibliothek die Alben und Lieder auslesen (der Teil funktioniert schon einwandfrei) und in einem TreeView anzeigen. Der Aufbau ist dabei folgendermaßen:
Album 1
... Track 1
... Track 2
... Track 3
Album 2
... Track 1
... Track 2
Soweit noch keine Probleme. ABER dann habe ich versucht eine Suchfunktion einzubauen und hab dafür ein TreeModelFilter eingebaut. Nun steh ich vor einer riesigen Hürde. Wenn ich meine Liste filtere, und Album 1 erfüllt nicht die Kriterien, Track 3 jedoch schon so kommt es zu einer Fehlermeldung:

Code: Alles auswählen

GtkWarning: gtk_tree_model_row_has_child_toggled: assertion `path != NULL' failed
Dem entgegenwirken könnte ich indem ich alle Alben angezeigt lasse, was aber wiederum zu leeren Albem in der Anzeige führt -> auch keine Lösung. Aja, Code hätte ich fast vergessen:

Code: Alles auswählen

self.modelfilter = model.filter_new()
self.modelfilter.set_visible_func(self.filter_albums)
...
def filter_albums(self, model, iter):
        if self.filterstring == "":
            return True
        return self.filterstring.lower() in model.get_value(iter, 1).lower()
Wäre dankbar für einen Denkanstoss damit ich entweder den Fehler umgehen kann, oder alle leeren Alben nachträglich noch ausblende.
Zuletzt geändert von br3z3l am Samstag 2. Februar 2008, 12:58, insgesamt 1-mal geändert.
Benutzeravatar
br3z3l
User
Beiträge: 10
Registriert: Mittwoch 30. Januar 2008, 21:31
Kontaktdaten:

So, nach einigem suchen und probieren mit set_visible_func, habe ich einen anderen Ansatz ausprobiert: set_visible_column!

Dazu habe ich im Model eine weitere Spalte vom typ boolean hinzugefügt. Das Filtern funktioniert nun indem ich in einer funktion diese Spalte entsprechend meinen Kriterien setze. Da ich nun Zugriff auf die Sichtbarkeit von Eltern und Kindern (manche mögen auch "parent" und "children" bevorzugen), war es mir möglich mein Problem zu lösen :D :D

Hier noch der dazugehörige Code, Spalte 6 ist die Spalte die die Sichtbarkeit bestimmt, Spalte 1 mein angezeigter Text:

Code: Alles auswählen

def refilter(self):
        model = self.modelfilter.get_model()
        filter = self.filterstring.lower()
        for album in model:
            visible_children = [filter in child[1].lower() for 
                               child in album.iterchildren()]
            visible_album = filter in album[1].lower()  
            album[6] = 1 in visible_children or visible_album
            if not album[6]:
                continue
            children = tuple(album.iterchildren())
            for i in xrange(len(children)):
                children[i][6] = visible_children[i] or visible_album
Für weiter Optimierungsvorschläge bin ich jederzeit offen.
Antworten