"""
Example to show treefilter performance issues.
 
"""

import gtk
import gobject
import time

class App(gtk.Window):

    def __init__(self, nrows=10000):

        gtk.Window.__init__(self)

        vbox = gtk.VBox()
        self.add(vbox)

        self.create_view()
        vbox.pack_start(self.view)
        
        buttons = gtk.HBox()
        vbox.pack_start(buttons, expand=False)
        for label, cb in (('_Non Zero', self.non_zero),
                          ('_Just Zero', self.just_zero),
                          ('_Fast Just Zero', self.fast_just_zero),
                          ('_All', self.all),
                          ('_Grow', self.grow),
                          ('_Quit', gtk.main_quit)):
            button = gtk.Button(label)
            button.connect('clicked', cb)
            buttons.pack_start(button)

        self.nrows = nrows
        self.load_data(nrows)
        self.show_all()

    def create_view(self):

        # create tree-view with one column
        self.view = gtk.TreeView()
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn('Number', renderer, text=0)
        self.view.append_column(column)

        self.store = gtk.ListStore(gobject.TYPE_INT,
                                   gobject.TYPE_BOOLEAN)

        self.filtered_store = self.store.filter_new()
        self.filtered_store.set_visible_column(1)

        self.view.set_model(self.filtered_store)

    def load_data(self, nrows):

        for row in xrange(nrows):

            self.store.append([row, True])

    def grow(self, *args):

        n = self.nrows
        self.nrows += 5000
        for row in xrange(n, self.nrows):
            self.store.append([row, True])

    def all(self, *args):
        t1 = time.time()
        for row in self.store:
            row[1] = True
        t2 = time.time()
        print '%6.2f %8d all' % ((t2-t1), self.nrows)
        
    def non_zero(self, *args):

        t1 = time.time()
        for row in self.store:

            if row[0] == 0:
                row[1] = False
            else:
                row[1] = True
        t2 = time.time()
        print '%6.2f %8d non-zero' % ((t2-t1), self.nrows)

    def just_zero(self, *args):

        t1 = time.time()
        for row in self.store:

            if row[0] != 0:
                row[1] = False
            else:
                row[1] = True
        t2 = time.time()
        print '%6.2f %8d just zero' % ((t2-t1), self.nrows)

    def fast_just_zero(self, *args):

        t1 = time.time()
        self.view.set_model(None)
        store = gtk.ListStore(gobject.TYPE_INT,
                              gobject.TYPE_BOOLEAN)
        for row in self.store:
            store.append(row)
        self.store = store

        for row in self.store:

            if row[0] != 0:
                row[1] = False
            else:
                row[1] = True

        self.filtered_store = self.store.filter_new()
        self.filtered_store.set_visible_column(1)
        self.view.set_model(self.filtered_store)

        t2 = time.time()
        print '%6.2f %8d fast just zero' % ((t2-t1), self.nrows)

if __name__ == '__main__':

    
    app = App(10000)
    gtk.main()
