Hi,

I'm working on implementing a custom tree model.  I'm having a problem
with dynamically adding items to the tree model, and having the display
updated.  I've attached a short example program that demonstrates my
problem.  When run, you get the following output:

Traceback (most recent call last):
  File "test.py", line 22, in add
    self.row_inserted(self.on_get_path(item), item)
TypeError: iter should be a GtkTreeIter
 
(test.py:30053): Gtk-CRITICAL **: file gtktreeview.c: line 6992
(gtk_tree_view_unref_tree_helper): assertion `node != NULL' failed

The three entries that are set up when the model is initialized display
just fine.  The problem occurs with other row_* signals that I've
tried.  Can anyone help me figure out my problem?
#!/usr/bin/python

import gobject
import gtk

class Item:
    def __init__(self, item, model):
        self.item = item
        self.model = model

    def as_string(self):
        return self.item
    
class Model(gtk.GenericTreeModel):
    def __init__(self):
        self.items = [Item('Static 1', self), Item('Static 2', self), Item('Static 3', self)]
        gtk.GenericTreeModel.__init__(self)

    def add(self, item):
        self.items.append(item)

        self.row_inserted(self.on_get_path(item), item)
        
    def on_get_flags(self):
        return 0

    def on_get_n_columns(self):
        return 1

    def on_get_column_type(self, index):
        return gobject.TYPE_STRING

    def on_get_path(self, iter):
        count = 0
        for item in self.items:
            if item is iter:
                return (count,)

        return None

    def on_get_iter(self, path):
        if len(path) == 0:
            return None

        try:
            return self.items[path[0]]
        except IndexError:
            return None

        return None
    
    def on_get_value(self, iter, column):
        if iter is None:
            return ''
        
        if column == 0:
            return iter.as_string()

        return ''

    def on_iter_next(self, iter):
        if iter is None:
            return None

        for current, next in zip(self.items, self.items[1:]):
            if iter is current:
                return next

        return None
    
    def on_iter_children(self, iter):
        if iter is None:
            if len(self.items) > 0:
                return self.items[0]
            return None
        
        return None

    def on_iter_has_child(self, iter):
        if iter is None:
            return len(self.items) > 0
        
        return None

    def on_iter_n_children(self, iter):
        if iter is None:
            return len(self.items)

        return 0
        
    def on_iter_nth_child(self, iter, n):
        if iter is None:
            try:
                return self.items[n]
            except IndexError:
                return None
        
        return None

    def on_iter_parent(self, iter):
        return None

def destroy(widget, data=None):
    gtk.main_quit()
   
window = gtk.Window()
window.connect('destroy', destroy)

scrolled = gtk.ScrolledWindow()

window.add(scrolled)

model = Model()

view = gtk.TreeView(model)
scrolled.add(view)

renderer = gtk.CellRendererText()

column = gtk.TreeViewColumn('Item', renderer, text=0)
view.append_column(column)

window.show_all()

gtk.idle_add(model.add, Item('Dynamic 1', model))

gtk.main()
_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to