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 [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/