OSDN Git Service

Add thread window.
[fukui-no-namari/fukui-no-namari.git] / src / Hage1 / board_window.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 import gtk.glade
22 import os
23 import time
24
25 import board_data
26 import thread_window
27
28 GLADE_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)),
29                          "..", "data")
30 GLADE_FILENAME = "board_window.glade"
31
32 LIST_ID = 0
33 LIST_NUM = 1
34 LIST_TITLE = 2
35 LIST_RES = 3
36 LIST_LINECOUNT = 4
37 LIST_LASTMODIFIED = 5
38
39
40 class WinWrap:
41     def sort_column(self, model, iter1, iter2, key):
42         v1 = model.get_value(iter1, 1)[key]
43         v2 = model.get_value(iter2, 1)[key]
44         if v1 < v2:
45             return -1
46         elif v1 > v2:
47             return 1
48         else:
49             return 0
50
51     def sort_column_num(self, model, iter1, iter2, key):
52         column_id, order = model.get_sort_column_id()
53         v1 = model.get_value(iter1, 1)[key]
54         v2 = model.get_value(iter2, 1)[key]
55         return self.sort_column_int(v1, v2, order)
56
57     def sort_column_int(self, v1, v2, order):
58         if order == gtk.SORT_ASCENDING:
59             if v1 == board_data.BOARD_DATA_INVALID_VALUE \
60                    and v2 == board_data.BOARD_DATA_INVALID_VALUE:
61                 return 0
62             elif v1 == board_data.BOARD_DATA_INVALID_VALUE:
63                 return 1
64             elif v2 == board_data.BOARD_DATA_INVALID_VALUE:
65                 return -1
66
67         if v1 < v2:
68             return -1
69         elif v1 > v2:
70             return 1
71         else:
72             return 0
73
74     def __init__(self, bbs, board):
75         self.bbs = bbs
76         self.board = board
77
78         glade_path = os.path.join(GLADE_DIR, GLADE_FILENAME)
79         self.mainwin = gtk.glade.XML(glade_path)
80
81         # id, num, title, res, lineCount, lastModified
82         self.datastore = gtk.ListStore(str, object)
83         self.datastore.set_sort_func(1000, lambda *args: -1)
84         self.datastore.set_sort_func(LIST_NUM+100, self.sort_column_num,
85                                      "num")
86         self.datastore.set_sort_func(LIST_TITLE+100, self.sort_column,
87                                      "title")
88         self.datastore.set_sort_func(LIST_RES+100, self.sort_column_num,
89                                      "res")
90         self.datastore.set_sort_func(LIST_LINECOUNT+100, self.sort_column_num,
91                                      "lineCount")
92         self.datastore.set_sort_func(LIST_LASTMODIFIED+100, self.sort_column,
93                                      "lastModified")
94         self.treeview = self.mainwin.get_widget("treeview")
95         self.treeview.set_rules_hint(True)
96         self.treeview.set_model(self.datastore)
97         self.popupmenu = self.mainwin.get_widget("popup_menu")
98
99         def dict_cell_data_func(column, cell, model, iter, key):
100             text = model.get_value(iter, 1)[key]
101             cell.set_property("text", text)
102
103         def dict_cell_data_func_int(column, cell, model, iter, key):
104             integer = model.get_value(iter, 1)[key]
105             if integer > 0:
106                 cell.set_property("text", str(integer))
107             else:
108                 cell.set_property("text", "")
109
110         renderer = gtk.CellRendererText()
111
112         column = gtk.TreeViewColumn("num", renderer)
113         column.set_cell_data_func(renderer, dict_cell_data_func_int, "num")
114         column.set_sort_column_id(LIST_NUM+100)
115         column.set_resizable(True)
116         column.set_reorderable(True)
117         self.treeview.append_column(column)
118
119         column = gtk.TreeViewColumn("title", renderer)
120         column.set_cell_data_func(renderer, dict_cell_data_func, "title")
121         column.set_sort_column_id(LIST_TITLE+100)
122         column.set_resizable(True)
123         column.set_reorderable(True)
124         self.treeview.append_column(column)
125
126         column = gtk.TreeViewColumn("res", renderer)
127         column.set_cell_data_func(renderer, dict_cell_data_func_int, "res")
128         column.set_sort_column_id(LIST_RES+100)
129         column.set_resizable(True)
130         column.set_reorderable(True)
131         self.treeview.append_column(column)
132         
133         column = gtk.TreeViewColumn("read", renderer)
134         column.set_cell_data_func(renderer, dict_cell_data_func_int,
135                                   "lineCount")
136         column.set_sort_column_id(LIST_LINECOUNT+100)
137         column.set_resizable(True)
138         column.set_reorderable(True)
139         self.treeview.append_column(column)
140         
141         column = gtk.TreeViewColumn("lastModified", renderer)
142         column.set_cell_data_func(renderer, dict_cell_data_func, "lastModified")
143         column.set_sort_column_id(LIST_LASTMODIFIED+100)
144         column.set_resizable(True)
145         column.set_reorderable(True)
146         self.treeview.append_column(column)
147
148         sigdic = {"on_board_window_destroy": self.on_board_window_destroy,
149                   "on_quit_activate": self.on_quit_activate,
150                   "on_load_local_activate": self.on_load_local_activate,
151                   "on_get_remote_activate": self.on_get_remote_activate,
152                   "on_treeview_row_activated":
153                   lambda w,p,v: self.on_open_thread(w),
154                   "on_treeview_button_press_event":
155                   self.on_treeview_button_press_event,
156                   "on_popup_menu_open_activate": self.on_open_thread}
157         self.mainwin.signal_autoconnect(sigdic)
158
159     def on_board_window_destroy(self, widget):
160         gtk.main_quit()
161
162     def on_quit_activate(self, widget):
163         gtk.main_quit()
164
165     def on_load_local_activate(self, widget):
166         t = board_data.LoadLocal(self.bbs, self.board, self.update_datastore)
167         t.start()
168
169     def on_get_remote_activate(self, widget):
170         t = board_data.GetRemote(self.bbs, self.board, self.update_datastore)
171         t.start()
172
173     def on_open_thread(self, widget):
174         treeselection = self.treeview.get_selection()
175         model, iter = treeselection.get_selected()
176         if not iter:
177             return
178
179         thread = model.get_value(iter, 0)
180         title = model.get_value(iter, 1)["title"]
181         print thread + ':"' + title + '"', "activated"
182
183         thread_window.WinWrap(self.bbs, self.board, thread)
184
185     def on_treeview_button_press_event(self, widget, event):
186         if event.button == 3:
187             x = int(event.x)
188             y = int(event.y)
189             time = event.time
190             pthinfo = widget.get_path_at_pos(x, y)
191             if pthinfo is not None:
192                 path, col, cellx, celly = pthinfo
193                 widget.grab_focus()
194                 widget.set_cursor(path, col, 0)
195                 self.popupmenu.popup(None, None, None, event.button, time)
196             return 1
197
198     def update_datastore(self, datalist):
199         print "clear datastore"
200         self.datastore.clear()
201         column_id, order = self.datastore.get_sort_column_id()
202         self.datastore.set_sort_column_id(1000, gtk.SORT_ASCENDING)
203         print "reflesh datastore"
204
205         time_start = time.time()
206         for id, dic in datalist.iteritems():
207             self.datastore.append([id, dic])
208
209         if column_id is not None and order is not None:
210             self.datastore.set_sort_column_id(column_id, order)
211         else:
212             self.datastore.set_sort_column_id(LIST_NUM+100, gtk.SORT_ASCENDING)
213         print "end"
214         time_end = time.time()
215         print time_end - time_start