[pygtk] Filtered Sortable

Timo timomlists at gmail.com
Fri Feb 18 17:13:03 WST 2011


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)
>
> TaskList.sort ---
>      @staticmethod
>      def sort(model, iter1, iter2, user_data):
>          print 'SORT', model, iter1, iter2
>          sort_by = model.get_sort_column_id()
>
> This fails because model is a TreeModelFilter... which does not have a
> method get_sort_column_id.... why isn't this the TreeModelSort object?
NOTE: Using a sorted filter can be very confusing in the beginning. I 
recently implemented this in my app too.

As far as I know, it is the lowest model, the liststore. Your setup 
looks good, it is the sort function that is not good. The docs [1] say 
that the function should return -1, 0 or 1. Here is the method I use:

     def _sort_func(self, model, iter1, iter2):
         data1 = model.get_value(iter1, 3)
         data2 = model.get_value(iter2, 3)
         if data1 == data2:
             data1 = model.get_value(iter1, 2)
             data2 = model.get_value(iter2, 2)
         return cmp(data1, data2)

This will sort column 2 if the values in column 3 are equal. The key 
part here is the built-in cmp() function that will return -1, 0 or 1, 
which is what we need.

Cheers,
Timo

[1] 
http://library.gnome.org/devel/pygtk/stable/class-gtktreesortable.html#method-gtktreesortable--set-sort-func

> [that is the model directly owned by the view.
>
> Does anyone have a working example of a filtered sortable list?
>
> _______________________________________________
> pygtk mailing list   pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://faq.pygtk.org/



More information about the pygtk mailing list