#!/usr/bin/env python
import gobject
import gtk

COL_NAME = 0
COL_LEVEL = 1
COL_ID = 2
NUM_COLS = 3

rows = [["albums", 0, 501], ["richard_galliano", 1, 502], ["richard_galliano_luz_negra", 2, 503],
    ["classical", 0, 504], ["collections", 1, 505], ["magic_of_waltz_cd1", 2, 506],
    ["magic_of_waltz_cd2", 2, 507]]

modelFilter = None
visibleItems = []
filterText = u''
view = None

def onEntryChanged(entry, data):
    global filterText, visibleItems
    
    print entry.get_text()
    filterText = entry.get_text()
    visibleItems = []
    modelFilter.refilter()
    view.expand_all()

def visibleFunc(model, iter, data=None):
    global filterText, visibleItems
    
    level = model[iter][1]
    id = model[iter][2]
    if level == 0:
        return id in visibleItems
    elif level == 1:
        return id in visibleItems
    elif level == 2:
        text = model[iter][0]
        if filterText and text.find(filterText) == -1:
            return False
        else:
            artistIter = model.iter_parent(iter)
            reposIter = model.iter_parent(artistIter)
            
            reposId = model[reposIter][2]
            if reposId not in visibleItems:
                visibleItems.append(reposId)
                path = model.get_path(reposIter)
                model.row_changed(path, reposIter)
                
            artistId = model[reposIter][2]
            if artistId not in visibleItems:
                visibleItems.append(artistId)
                path = model.get_path(artistIter)
                model.row_changed(path, artistIter)
                
            return True
    return False
            
if __name__ == '__main__':
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.resize(300, 250)
    window.connect("delete_event", gtk.main_quit)
    
    view = gtk.TreeView()
    
    renderer = gtk.CellRendererText()
    view.insert_column_with_attributes(-1, "Name", renderer, text=COL_NAME)
    
    store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_UINT, gobject.TYPE_UINT)
    iters = [None]*5
    
    for row in rows:
        if row[1] == 0:
            iters[row[1]] = store.append(None)
        else:
            iters[row[1]] = store.append(iters[row[1]-1])
            
        store.set(iters[row[1]],
            COL_NAME, row[0],
            COL_LEVEL, row[1],
            COL_ID, row[2])
            
    modelFilter = store.filter_new(None)
    modelFilter.set_visible_func(visibleFunc)
    view.set_model(modelFilter)
    
    box = gtk.VBox(False, 5)
    entry = gtk.Entry()
    
    box.pack_start(entry, False, True, 0)
    box.pack_start(view, True, True, 0)
    
    window.add(box)
    
    entry.connect("changed", onEntryChanged, None)
    
    modelFilter.refilter()
    view.expand_all()
    window.show_all()
    gtk.main()
    