OSDN Git Service

Make Filter exception safer.
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / threadlistmodel.py
index 8a3e354..34484b6 100644 (file)
@@ -18,6 +18,7 @@
 import pygtk
 pygtk.require('2.0')
 import gtk
+import itertools
 
 
 class ThreadListModel(gtk.GenericTreeModel):
@@ -26,20 +27,16 @@ class ThreadListModel(gtk.GenericTreeModel):
                     "lastModified", "average"]
     column_width = [0, 30, 330, 50, 50, 200, 50]
 
-    def __init__(self, list=None, sort_column_name="num", sort_reverse=False,
-                 filter_func=None):
+    def __init__(self):
         gtk.GenericTreeModel.__init__(self)
-        if list:
-            self.original_list = list[:]
-        else:
-            self.original_list = []
-
-        self.sort_column_name = sort_column_name
-        self.sort_reverse = sort_reverse
-        self.filter_func = filter_func
+        self.original_list = []
+        self.list = []
+        self.order_dict = {}
+        self.sort_column_name = "num"
+        self.sort_reverse = False
+        self.filter_func = None
 
-        self.do_filter()
-        self.do_sort(self.sort_column_name, self.sort_reverse)
+        self.set_list([])
 
     def modify_row(self, dict):
         id = dict["id"]
@@ -51,19 +48,16 @@ class ThreadListModel(gtk.GenericTreeModel):
                     target_dict[name] = dict[name]
             self.row_changed(index, self.get_iter(index))
 
-    def refilter(self):
+    def refilter(self, filter_func):
         before_size = len(self.list)
-        self.do_filter()
+        self.do_filter(filter_func)
         after_size = len(self.list)
         self.do_sort(self.sort_column_name, self.sort_reverse)
         self.list_modified(before_size, after_size)
         
     def set_list(self, newlist):
         self.original_list = newlist[:]
-        self.refilter()
-
-    def set_filter_func(self, func):
-        self.filter_func = func
+        self.refilter(self.filter_func)
 
     def build_order_dict(self):
         # key: thread id, value: index in self.list
@@ -80,15 +74,19 @@ class ThreadListModel(gtk.GenericTreeModel):
             for i in range(before_size, after_size):
                 self.row_inserted(i, self.get_iter(i))
 
-    def do_filter(self):
-        if not self.filter_func:
+    def do_filter(self, filter_func):
+        # Set filter_func to self.filter_func after successful filtering.
+        # successful means no exception.
+
+        if not filter_func:
             self.list = self.original_list[:]
+            self.filter_func = filter_func
             return
 
-        self.list = []
-        for item in self.original_list:
-            if self.filter_func(self, item):
-                self.list.append(item)
+        predicate = lambda item: filter_func(self, item)
+        iterable = itertools.ifilter(predicate, self.original_list)
+        self.list = [item for item in iterable]
+        self.filter_func = filter_func
 
     def compare(self, v1, v2, reverse):
         if not reverse: