1 # Copyright (C) 2006 by Aiwota Programmer
2 # aiwotaprog@tetteke.tk
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 class ThreadListModel(gtk.GenericTreeModel):
25 column_types = (str, int, str, int, int, int, float, int)
26 column_names = ["id", "num", "title", "res", "lineCount",
27 "lastModified", "average", "oldRes"]
30 gtk.GenericTreeModel.__init__(self)
31 self.original_list = []
34 self.sort_column_name = "num"
35 self.sort_reverse = False
36 self.filter_func = None
37 self.compare_func = {}
41 def set_compare_func(self, name, func, key=None):
42 self.compare_func[name] = (func, key)
44 def del_compare_func(self, name):
46 del self.filter_func[name]
50 def get_dict(self, iter):
51 path = self.get_path(iter)
52 return self.list[path[0]]
54 def modify_row(self, dict):
56 if id in self.order_dict:
57 index = self.order_dict[id]
58 target_dict = self.list[index]
59 for name in self.column_names:
61 target_dict[name] = dict[name]
62 self.row_changed(index, self.get_iter(index))
64 def refilter(self, filter_func):
65 before_size = len(self.list)
66 self.do_filter(filter_func)
67 after_size = len(self.list)
68 self.do_sort(self.sort_column_name, self.sort_reverse)
69 self.list_modified(before_size, after_size)
71 def set_list(self, newlist):
72 self.original_list = newlist[:]
73 self.refilter(self.filter_func)
75 def build_order_dict(self):
76 # key: thread id, value: index in self.list
77 self.order_dict = dict(
78 [(item["id"], index) for index, item in enumerate(self.list)])
80 def list_modified(self, before_size, after_size):
81 if before_size > after_size:
82 print "remove", before_size-after_size, "threads"
83 for i in range(before_size - after_size):
84 self.row_deleted(after_size)
85 elif after_size > before_size:
86 print "insert", after_size-before_size, "threads"
87 for i in range(before_size, after_size):
88 self.row_inserted(i, self.get_iter(i))
90 def do_filter(self, filter_func):
91 # Set filter_func to self.filter_func after successful filtering.
92 # successful means no exception.
95 self.list = self.original_list[:]
96 self.filter_func = filter_func
99 predicate = lambda item: filter_func(self, item)
100 iterable = itertools.ifilter(predicate, self.original_list)
101 self.list = [item for item in iterable]
102 self.filter_func = filter_func
104 def compare(self, v1, v2, reverse):
106 if v1 == 0 and v2 == 0:
120 return self.sort_column_name, self.sort_reverse
122 def do_sort(self, column_name, reverse):
123 sort_list = self.list[:]
124 if column_name in self.compare_func:
125 h = self.compare_func[column_name][0]
126 key = self.compare_func[column_name][1]
129 sort_list.sort(lambda x, y: h(x, y, reverse), key, reverse)
131 if self.column_types[self.column_names.index(column_name)] == str:
132 sort_list.sort(None, lambda dic: dic[column_name], reverse)
134 h = lambda x, y: self.compare(x, y, reverse)
135 sort_list.sort(h, lambda dic: dic[column_name], reverse)
136 self.list = sort_list
137 self.build_order_dict()
139 def sort(self, column_name, order_specified=False, reverse=False):
140 old_order_dict = self.order_dict
143 sort_reverse = reverse
145 if column_name == self.sort_column_name:
147 sort_reverse = not self.sort_reverse
151 self.do_sort(column_name, sort_reverse)
152 self.sort_column_name = column_name
153 self.sort_reverse = sort_reverse
155 neworder = [old_order_dict[item["id"]] for item in self.list]
156 self.rows_reordered(None, None, neworder)
158 def on_get_flags(self):
159 return gtk.TREE_MODEL_LIST_ONLY
161 def on_get_n_columns(self):
162 return len(self.column_types)
164 def on_get_column_type(self, n):
165 return self.column_types[n]
167 def on_get_iter(self, path):
169 return self.list[path[0]]
173 def on_get_path(self, rowref):
174 return self.order_dict[rowref["id"]]
176 def on_get_value(self, rowref, column):
177 return rowref[self.column_names[column]]
179 def on_iter_next(self, rowref):
181 i = self.order_dict[rowref["id"]] + 1
186 def on_iter_children(self, rowref):
191 def on_iter_has_child(self, rowref):
194 def on_iter_n_children(self, rowref):
197 return len(self.list)
199 def on_iter_nth_child(self, rowref, n):
207 def on_iter_parent(self, child):