OSDN Git Service

Board window is rendered with alternating row colors.
[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_rules_hint(True)
95         self.treeview.set_model(self.datastore)
96         self.popupmenu = self.mainwin.get_widget("popup_menu")
97
98         def dict_cell_data_func(column, cell, model, iter, key):
99             text = model.get_value(iter, 1)[key]
100             cell.set_property("text", text)
101
102         def dict_cell_data_func_int(column, cell, model, iter, key):
103             integer = model.get_value(iter, 1)[key]
104             if integer > 0:
105                 cell.set_property("text", str(integer))
106             else:
107                 cell.set_property("text", "")
108
109         renderer = gtk.CellRendererText()
110
111         column = gtk.TreeViewColumn("num", renderer)
112         column.set_cell_data_func(renderer, dict_cell_data_func_int, "num")
113         column.set_sort_column_id(LIST_NUM+100)
114         column.set_resizable(True)
115         column.set_reorderable(True)
116         self.treeview.append_column(column)
117
118         column = gtk.TreeViewColumn("title", renderer)
119         column.set_cell_data_func(renderer, dict_cell_data_func, "title")
120         column.set_sort_column_id(LIST_TITLE+100)
121         column.set_resizable(True)
122         column.set_reorderable(True)
123         self.treeview.append_column(column)
124
125         column = gtk.TreeViewColumn("res", renderer)
126         column.set_cell_data_func(renderer, dict_cell_data_func_int, "res")
127         column.set_sort_column_id(LIST_RES+100)
128         column.set_resizable(True)
129         column.set_reorderable(True)
130         self.treeview.append_column(column)
131         
132         column = gtk.TreeViewColumn("read", renderer)
133         column.set_cell_data_func(renderer, dict_cell_data_func_int,
134                                   "lineCount")
135         column.set_sort_column_id(LIST_LINECOUNT+100)
136         column.set_resizable(True)
137         column.set_reorderable(True)
138         self.treeview.append_column(column)
139         
140         column = gtk.TreeViewColumn("lastModified", renderer)
141         column.set_cell_data_func(renderer, dict_cell_data_func, "lastModified")
142         column.set_sort_column_id(LIST_LASTMODIFIED+100)
143         column.set_resizable(True)
144         column.set_reorderable(True)
145         self.treeview.append_column(column)
146
147         sigdic = {"on_board_window_destroy": self.on_board_window_destroy,
148                   "on_quit_activate": self.on_quit_activate,
149                   "on_load_local_activate": self.on_load_local_activate,
150                   "on_get_remote_activate": self.on_get_remote_activate,
151                   "on_treeview_row_activated": self.on_treeview_row_activated,
152                   "on_treeview_button_press_event":
153                   self.on_treeview_button_press_event,
154                   "on_popup_menu_open_activate":
155                   self.on_popup_menu_open_activate}
156         self.mainwin.signal_autoconnect(sigdic)
157
158     def on_board_window_destroy(self, widget):
159         gtk.main_quit()
160
161     def on_quit_activate(self, widget):
162         gtk.main_quit()
163
164     def on_load_local_activate(self, widget):
165         t = board_data.LoadLocal(self.bbs, self.board, self.update_datastore)
166         t.start()
167
168     def on_get_remote_activate(self, widget):
169         t = board_data.GetRemote(self.bbs, self.board, self.update_datastore)
170         t.start()
171
172     def on_treeview_row_activated(self, widget, row, column):
173         treeselection = widget.get_selection()
174         model, iter = treeselection.get_selected()
175         if not iter:
176             return
177
178         thread = model.get_value(iter, 0)
179         title = model.get_value(iter, 1)["title"]
180         print thread + ':"' + title + '"', "activated"
181
182     def on_treeview_button_press_event(self, widget, event):
183         if event.button == 3:
184             x = int(event.x)
185             y = int(event.y)
186             time = event.time
187             pthinfo = widget.get_path_at_pos(x, y)
188             if pthinfo is not None:
189                 path, col, cellx, celly = pthinfo
190                 widget.grab_focus()
191                 widget.set_cursor(path, col, 0)
192                 self.popupmenu.popup(None, None, None, event.button, time)
193             return 1
194
195     def on_popup_menu_open_activate(self, widget):
196         treeselection = self.treeview.get_selection()
197         model, iter = treeselection.get_selected()
198         if not iter:
199             return
200
201         thread = model.get_value(iter, 0)
202         title = model.get_value(iter, 1)["title"]
203         print thread + ':"' + title + '"', "activated 2"
204
205     def update_datastore(self, datalist):
206         print "clear datastore"
207         self.datastore.clear()
208         column_id, order = self.datastore.get_sort_column_id()
209         self.datastore.set_sort_column_id(1000, gtk.SORT_ASCENDING)
210         print "reflesh datastore"
211
212         time_start = time.time()
213         for id, dic in datalist.iteritems():
214             self.datastore.append([id, dic])
215
216         if column_id is not None and order is not None:
217             self.datastore.set_sort_column_id(column_id, order)
218         else:
219             self.datastore.set_sort_column_id(LIST_NUM+100, gtk.SORT_ASCENDING)
220         print "end"
221         time_end = time.time()
222         print time_end - time_start