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/