import config
import session
import winwrapbase
-from misc import ThreadInvoker
import bookmark_list
import bookmark_window
import board_plugins
import board_column
+import board_states
GLADE_FILENAME = "board_window.glade"
def __init__(self, uri):
+ self.lock_obj = False
+
self.bbs_type = bbs_type_judge_uri.get_type(uri)
board_data.BoardData.__init__(self, self.bbs_type)
self.treeview.set_fixed_height_mode(True)
# menu plugins
- board_plugins.load(self.treeview, self.menu_edit)
+ board_plugins.load(self.widget_tree)
self.restore()
self.window.show()
self.popupmenu = self.widget_tree.get_widget("popup_treeview_menu")
self.toolbar = self.widget_tree.get_widget("toolbar")
self.statusbar = self.widget_tree.get_widget("appbar")
+ self.progress = self.statusbar.get_progress()
self.filterbar = self.widget_tree.get_widget(
"bonobodockitem_filterbar")
self.entry_filterbar = self.widget_tree.get_widget("entry_filterbar")
- self.menu_edit = self.widget_tree.get_widget("menu_edit").get_submenu()
+
+ def lock(self):
+ if self.lock_obj:
+ print "locked, try later."
+ return False
+ else:
+ print "get lock"
+ self.lock_obj = True
+ return True
+
+ def un_lock(self):
+ self.lock_obj = False
+ print "unlock"
def set_status(self, text):
self.statusbar.set_status(text)
+ def set_fraction(self, fraction):
+ self.progress.set_fraction(fraction)
+
def destroy(self):
self.save()
self.window.destroy()
def get_uri(self):
return self.bbs_type.get_uri_base()
+ def show(self):
+ self.window.deiconify()
+
+ def hide(self):
+ self.window.iconify()
+
def open_thread(self):
treeselection = self.treeview.get_selection()
model, iter = treeselection.get_selected()
if not iter:
return
- thread = model.get_value(iter, ThreadListModel.column_names.index("id"))
- title = model.get_value(
- iter, ThreadListModel.column_names.index("title"))
+ dic = model.get_dict(iter)
+ thread = dic["id"]
+ title = dic["title"]
print thread + ':"' + title + '"', "activated"
- res = model.get_value(iter, ThreadListModel.column_names.index("res"))
- lineCount = model.get_value(
- iter, ThreadListModel.column_names.index("lineCount"))
+ res = dic["res"]
+ lineCount = dic["lineCount"]
update = res > lineCount
def load(self, update=False):
- def modify_dict(item_dict):
- # lastModified, httpdate to second
- httpdate = item_dict["lastModified"]
- try:
- secs = misc.httpdate_to_secs(httpdate)
- except ValueError:
- item_dict["lastModified"] = 0
- else:
- item_dict["lastModified"] = secs
- return item_dict
+ def on_end():
+ self.progress.set_fraction(0.0)
+ self.progress.hide()
+ self.un_lock()
def set_id(thread_id, item_dict):
item_dict["id"] = thread_id
return item_dict
- def conv_dictdict_to_listdict(dictdict):
+ def conv_dictdict_to_listdict(dictdict, listdict):
key_iter = dictdict.iterkeys()
value_iter = dictdict.itervalues()
iterable = itertools.imap(set_id, key_iter, value_iter)
- iterable = itertools.imap(modify_dict, iterable)
- return [item_dict for item_dict in iterable]
+
+ # remove not in subject.txt and not cache.
+ iterable = itertools.ifilter(
+ lambda dic: dic["num"] > 0 or dic["lineCount"] > 0, iterable)
+
+ iterable = itertools.imap(listdict.append, iterable)
+ for i in iterable:
+ yield
+
+ self.update_datastore(listdict)
def load_local():
- datalist = self.load_idxfiles()
- self.merge_local_subjecttxt(datalist)
- new_list = conv_dictdict_to_listdict(datalist)
- gobject.idle_add(self.update_datastore, new_list)
+ datalist = {}
+ new_lst = []
+ iterable = self.load_idxfiles(datalist)
+ iterable = itertools.chain(iterable,
+ self.merge_local_subjecttxt(datalist))
+ iterable = itertools.chain(iterable,
+ conv_dictdict_to_listdict(datalist, new_lst))
+
+ misc.chain(lambda *args: None, on_end, iterable)
+
+ def get_remote(datalist):
+
+ def on_received(response):
+ new_lst = []
+ iterable = self.progress_response(response)
+ iterable = self.merge_remote_subjecttxt(datalist, iterable)
+ iterable = itertools.chain(iterable,
+ conv_dictdict_to_listdict(datalist, new_lst))
+ misc.chain(lambda *args: None, on_end, iterable)
- def get_remote():
print "start get subject.txt"
- datalist = self.load_idxfiles()
- self.merge_remote_subjecttxt(datalist)
- new_list = conv_dictdict_to_listdict(datalist)
- gobject.idle_add(self.update_datastore, new_list)
+ try:
+ self.get_subjecttxt(on_received)
+ except board_data.NothingToDoException:
+ on_end()
+ except:
+ on_end()
+ self.set_status(str(sys.exc_info()))
+
+ def deep_copy():
+ def init_some(dic):
+ dic["num"] = 0
+ dic["oldRes"] = dic["res"]
+ dic["res"] = 0
+ dic["average"] = 0
+ return dic
+
+ model = self.treeview.get_model()
+ if model:
+ iterable = model.original_list
+
+ iterable = itertools.imap(lambda dic: dic.copy(), iterable)
+ iterable = itertools.imap(init_some, iterable)
+
+ new_dict = dict([(dic["id"], dic) for dic in iterable])
+ else:
+ new_dict = {}
+ return new_dict
+
+ if not self.lock():
+ return
sbj_path = misc.get_board_subjecttxt_path(self.bbs_type)
sbj_exists = os.path.exists(sbj_path)
+ self.progress.show()
+
if update or not sbj_exists:
- t = ThreadInvoker(lambda *args: -1, get_remote)
- t.start()
+ new_dict = deep_copy()
+ get_remote(new_dict)
else:
- t = ThreadInvoker(lambda *args: -1, load_local)
- t.start()
+ load_local()
def save(self):
try:
traceback.print_exc()
def restore(self):
- states_dict = dict([
- ("columns", ()), ("widths", ()), ("sort_column", "num"),
- ("sort_reverse", False), ("window_height", 600),
- ("window_width", 600), ("toolbar_visible", True),
- ("statusbar_visible", True), ("filterbar_visible", False)])
-
- interest_list = [
- "columns", "widths", "sort_column", "sort_reverse",
- "window_height", "window_width", "toolbar_visible",
- "statusbar_visible", "filterbar_visible"]
-
- interest_type_list = (
- (list, str), (list, int), (str, None), (bool, None), (int, None),
- (int, None), (bool, None), (bool, None), (bool, None))
-
- def key_value_generator():
-
- def generate_pair():
- states_path = misc.get_board_states_path(self.bbs_type)
- try:
- for line in file(states_path):
- key_equal_value = line.rstrip()
- try:
- index = key_equal_value.index("=")
- except ValueError:
- pass
- else:
- key = key_equal_value[:index]
- if key in interest_list:
- value = key_equal_value[index+1:]
- yield key, value
- except IOError:
- traceback.print_exc()
-
- def to_int(value):
- try:
- return int(value)
- except:
- return 0
-
- for key, value in generate_pair():
- list_index = interest_list.index(key)
- key_type, key_type_extra = interest_type_list[list_index]
- if key_type == str:
- yield key, value
- elif key_type == int:
- yield key, to_int(value)
- elif key_type == bool:
- value = value == "True"
- yield key, value
- elif key_type == list:
- if key_type_extra == str:
- yield key, value.split(",")
- elif key_type_extra == int:
- yield key, [i for i in itertools.imap(
- to_int, value.split(","))]
- else:
- print key, "not supported",
- key_type, key_type_extra, value
- else:
- print key, "not supported", key_type, value
-
- def load_gconf():
- key_base = config.gconf_app_key_base() + "/board_states"
- gconf_client = gconf.client_get_default()
- width = gconf_client.get_int(key_base + "/window_width")
- height = gconf_client.get_int(key_base + "/window_height")
- states_dict["toolbar_visible"] = gconf_client.get_bool(
- key_base + "/toolbar")
- states_dict["statusbar_visible"] = gconf_client.get_bool(
- key_base + "/statusbar")
- states_dict["filterbar_visible"] = gconf_client.get_bool(
- key_base + "/filterbar")
-
- if width != 0:
- states_dict["window_width"] = width
- if height != 0:
- states_dict["window_height"] = height
-
try:
+ states_dict = board_states.states_file_to_dict(self.bbs_type)
+
try:
- load_gconf()
+ self.treeview.get_model().sort(
+ states_dict["sort_column"], True,
+ states_dict["sort_reverse"])
except:
- traceback.print_exc()
-
- for key, value in key_value_generator():
- states_dict[key] = value
-
- self.treeview.get_model().sort(
- states_dict["sort_column"], True, states_dict["sort_reverse"])
+ pass
# set column order before set column width
treeviewcolumn = dict(
model, iter = selection.get_selected()
if not iter:
return
- thread = model.get_value(
- iter, ThreadListModel.column_names.index("id"))
+ thread = model.get_dict(iter)["id"]
bbs_type_for_thread = self.bbs_type.clone_with_thread(thread)
return False
def on_window_board_destroy(self, widget):
+ self.popupmenu.destroy()
+ for column in self.treeview.get_columns():
+ column.destroy()
self.destroyed()