On Fri, 2011-02-18 at 06:27 -0500, Adam Tauno Williams wrote: 
> On Fri, 2011-02-18 at 10:13 +0100, Timo wrote: 
> > On 17-02-11 21:08, Adam Tauno Williams wrote:
> > > I'm confused trying to make a filtered&  sorted treeview.  Filtering
> > > works... data is correctly displayed.  But sorting does not work.
> > > self.todo_model = gtk.ListStore(gobject.TYPE_PYOBJECT)
> > > # Create a TreeModelFilter to control row visibility
> > > self.todo_filter = self.todo_model.filter_new()
> > > self.todo_filter.set_visible_func(self.todo_visible_filter)
> > > # Create a TreeModelSort to wrap the TreeModelFilter
> > > self.todo_sort = gtk.TreeModelSort(self.todo_filter)
> > > # Set a sort function
> > > self.todo_sort.set_default_sort_func(TaskList.sort, None)
> > > # Set the model in the view to the TreeModelSort
> > > self.todo_task_view.set_model(self.todo_sort)

Okay, I figured it out.

The call to set_default_sort_func(TaskList.sort, None) is *wrong*.  [It
makes sense, and is obvious, but wrong].  Setting a sort function and
retrieving the sort column in the sort method just isn't how Gtk works.
You have to see a sort function for each sortable column and pass the
column id either implicitly [a different sort function for every column]
or explicitly [by using the user_data] field.

So, something like...

class TaskList(object)
...
    @staticmethod
    def sort_model(model):
        sortable = gtk.TreeModelSort(model)
        sortable.set_sort_func(TaskList.COLUMN_TASK_ID, 
                               TaskList.sort, 
                               TaskList.COLUMN_TASK_ID)
        sortable.set_sort_func(TaskList.COLUMN_TASK_NAME,
                               TaskList.sort, 
                               TaskList.COLUMN_TASK_NAME)
        ....
        sortable.set_sort_func(TaskList.COLUMN_TASK_END,     
                               TaskList.sort, 
                               TaskList.COLUMN_TASK_END)
        sortable.set_sort_column_id(TaskList.COLUMN_TASK_ID,
                                    gtk.SORT_ASCENDING)
        return sortable

- then in the sort function -

    @staticmethod
    def sort(model, iter1, iter2, user_data):
        sort_by = user_data
        value1 = model[iter1][0][TaskList.COLUMN_KEYS[sort_by]]
        value2 = model[iter2][0][TaskList.COLUMN_KEYS[sort_by]]
        return cmp(value1, value2)

I know have a sortable filtered TreeView.

I believe setting a set_default_sort_func might supress the stray -

Warning: unable to set property `text' of type `gchararray' from value
of type `PyObject'

- seen when the application starts.  But I haven't tried that.

_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to