OSDN Git Service

Window managing auxiliary is added. It shows only same board windows. (#16374)
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / board_window.py
index 77f3f73..d03e684 100644 (file)
@@ -40,6 +40,7 @@ import bookmark_list
 import bookmark_window
 import board_plugins
 import board_column
+import board_states
 
 GLADE_FILENAME = "board_window.glade"
 
@@ -86,7 +87,7 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
         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()
@@ -103,7 +104,6 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
         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 set_status(self, text):
         self.statusbar.set_status(text)
@@ -118,20 +118,25 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
     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
 
@@ -172,17 +177,6 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
 
     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 set_id(thread_id, item_dict):
             item_dict["id"] = thread_id
             return item_dict
@@ -191,7 +185,11 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
             key_iter = dictdict.iterkeys()
             value_iter = dictdict.itervalues()
             iterable = itertools.imap(set_id, key_iter, value_iter)
-            iterable = itertools.imap(modify_dict, iterable)
+
+            # remove not in subject.txt and not cache.
+            iterable = itertools.ifilter(
+                lambda dic: dic["num"] > 0 or dic["lineCount"] > 0, iterable)
+
             return [item_dict for item_dict in iterable]
 
         def load_local():
@@ -200,9 +198,8 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
             new_list = conv_dictdict_to_listdict(datalist)
             gobject.idle_add(self.update_datastore, new_list)
 
-        def get_remote():
+        def get_remote(datalist):
             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)
@@ -213,13 +210,34 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
                 self.progress.hide()
             gobject.idle_add(reset_progress)
 
+        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
+
         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(on_end, get_remote)
+            new_dict = deep_copy()
+            t = ThreadInvoker(on_end, lambda *x: get_remote(new_dict))
             t.start()
         else:
             t = ThreadInvoker(on_end, load_local)
@@ -269,96 +287,15 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
             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(
@@ -420,8 +357,7 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
         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)
 
@@ -465,6 +401,9 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
         return False
 
     def on_window_board_destroy(self, widget):
+        self.popupmenu.destroy()
+        for column in self.treeview.get_columns():
+            column.destroy()
         self.destroyed()