OSDN Git Service

Average column is changed to float.
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / threadlistmodel.py
1 # Copyright (C) 2006 by Aiwota Programmer
2 # aiwotaprog@tetteke.tk
3 #
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.
8 #
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.
13 #
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
17
18 import pygtk
19 pygtk.require('2.0')
20 import gtk
21
22
23 class ThreadListModel(gtk.GenericTreeModel):
24     column_types = (str, int, str, int, int, int, float)
25     column_names = ["id", "num", "title", "res", "lineCount",
26                     "lastModified", "average"]
27     column_width = [0, 30, 330, 50, 50, 200, 50]
28
29     def __init__(self, list=None, sort_column_name="num", sort_reverse=False,
30                  filter_func=None):
31         gtk.GenericTreeModel.__init__(self)
32         if list:
33             self.original_list = list[:]
34         else:
35             self.original_list = []
36
37         self.sort_column_name = sort_column_name
38         self.sort_reverse = sort_reverse
39         self.filter_func = filter_func
40
41         self.do_filter()
42         self.do_sort(self.sort_column_name, self.sort_reverse)
43
44     def modify_row(self, dict):
45         id = dict["id"]
46         if id in self.order_dict:
47             index = self.order_dict[id]
48             target_dict = self.list[index]
49             for name in self.column_names:
50                 if name in dict:
51                     target_dict[name] = dict[name]
52             self.row_changed(index, self.get_iter(index))
53
54     def refilter(self):
55         before_size = len(self.list)
56         self.do_filter()
57         after_size = len(self.list)
58         self.do_sort(self.sort_column_name, self.sort_reverse)
59         self.list_modified(before_size, after_size)
60         
61     def set_list(self, newlist):
62         self.original_list = newlist[:]
63         self.refilter()
64
65     def set_filter_func(self, func):
66         self.filter_func = func
67
68     def build_order_dict(self):
69         # key: thread id, value: index in self.list
70         self.order_dict = dict(
71             [(item["id"], index) for index, item in enumerate(self.list)])
72
73     def list_modified(self, before_size, after_size):
74         if before_size > after_size:
75             print "remove", before_size-after_size, "threads"
76             for i in range(before_size - after_size):
77                 self.row_deleted(after_size)
78         elif after_size > before_size:
79             print "insert", after_size-before_size, "threads"
80             for i in range(before_size, after_size):
81                 self.row_inserted(i, self.get_iter(i))
82
83     def do_filter(self):
84         if not self.filter_func:
85             self.list = self.original_list[:]
86             return
87
88         self.list = []
89         for item in self.original_list:
90             if self.filter_func(self, item):
91                 self.list.append(item)
92
93     def compare(self, v1, v2, reverse):
94         if not reverse:
95             if v1 == 0 and v2 == 0:
96                 return 0
97             elif v1 == 0:
98                 return 1
99             elif v2 == 0:
100                 return -1
101         if v1 > v2:
102             return 1
103         elif v1 < v2:
104             return -1
105         else:
106             return 0
107
108     def get_sort(self):
109         return self.sort_column_name, self.sort_reverse
110
111     def do_sort(self, column_name, reverse):
112         if self.column_types[self.column_names.index(column_name)] == str:
113             self.list.sort(None, lambda dic: dic[column_name], reverse)
114         else:
115             h = lambda x, y: self.compare(x, y, reverse)
116             self.list.sort(h, lambda dic: dic[column_name], reverse)
117         self.build_order_dict()
118
119     def sort(self, column_name, order_specified=False, reverse=False):
120         old_order_dict = self.order_dict
121
122         if order_specified:
123             self.sort_reverse = reverse
124         else:
125             if column_name == self.sort_column_name:
126                 # sort reverse
127                 self.sort_reverse = not self.sort_reverse
128             else:
129                 self.sort_reverse = False
130         self.sort_column_name = column_name
131
132         self.do_sort(self.sort_column_name, self.sort_reverse)
133
134         neworder = [old_order_dict[item["id"]] for item in self.list]
135         self.rows_reordered(None, None, neworder)
136
137     def on_get_flags(self):
138         return gtk.TREE_MODEL_LIST_ONLY
139
140     def on_get_n_columns(self):
141         return len(self.column_types)
142
143     def on_get_column_type(self, n):
144         return self.column_types[n]
145
146     def on_get_iter(self, path):
147         try:
148             return self.list[path[0]]
149         except IndexError:
150             return None
151
152     def on_get_path(self, rowref):
153         return self.order_dict[rowref["id"]]
154
155     def on_get_value(self, rowref, column):
156         return rowref[self.column_names[column]]
157
158     def on_iter_next(self, rowref):
159         try:
160             i = self.order_dict[rowref["id"]] + 1
161             return self.list[i]
162         except IndexError:
163             return None
164
165     def on_iter_children(self, rowref):
166         if rowref:
167             return None
168         return self.list[0]
169
170     def on_iter_has_child(self, rowref):
171         return False
172
173     def on_iter_n_children(self, rowref):
174         if rowref:
175             return 0
176         return len(self.list)
177
178     def on_iter_nth_child(self, rowref, n):
179         if rowref:
180             return None
181         try:
182             return self.list[n]
183         except IndexError:
184             return None
185
186     def on_iter_parent(self, child):
187         return None