OSDN Git Service

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