OSDN Git Service

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