OSDN Git Service

2f8deb2f2f0aaefc3a586404148842baea45b414
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / session.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 gobject
22 import gconf
23 import traceback
24
25 import uri_opener
26 from BbsType import bbs_type_judge_uri
27 from BbsType import bbs_type_exception
28 import config
29
30 # key: /bbs/board/thread value: toplevel window widget
31 _windows = {}
32
33
34 class Gconf:
35
36     def __init__(self):
37         self._enable = False
38
39     def _is_enable_to_save(self):
40         return self._enable
41
42     def set_enable(self, enable):
43         self._enable = enable
44
45     def restore(self):
46         self.set_enable(False)
47
48         gconf_client = gconf.client_get_default()
49
50         gconf_key_windows = config.gconf_app_key_base() + "/windows"
51         uris = gconf_client.get_list(gconf_key_windows, gconf.VALUE_STRING)
52         for uri in uris:
53             try:
54                 uri_opener.open_uri(uri)
55             except bbs_type_exception.BbsTypeError, msg:
56                 print msg
57         self.set_enable(True)
58
59     def save(self):
60         if not self._is_enable_to_save():
61             print "save to gconf not enable"
62             return
63         uris = _windows.keys()
64         try:
65             gconf_client = gconf.client_get_default()
66             gconf_key_windows = config.gconf_app_key_base() + "/windows"
67             if uris:
68                 gconf_client.set_list(
69                     gconf_key_windows, gconf.VALUE_STRING, uris)
70                 print "save windows", uris
71             else:
72                 gconf_client.unset(gconf_key_windows)
73                 print "save no window"
74         except:
75             pass
76
77
78 _gconf = Gconf()
79
80 def get_window(key):
81     if key in _windows:
82         return _windows[key]
83     else:
84         return None
85
86 def regist(winwrap):
87     if not winwrap:
88         raise ValueError, "parameter must not be empty"
89
90     key = winwrap.get_uri()
91     if not key:
92         raise ValueError, "uri must not be empty"
93
94     if key in _windows:
95         return False
96
97     _windows[key] = winwrap
98     print "regist to _windows", key
99     _gconf.save()
100     return True
101
102 def unregist(winwrap):
103     key = winwrap.get_uri()
104     if key not in _windows:
105         print key, "is not found in _windows"
106         return
107
108     del _windows[key]
109     print "unregist from _windows", key
110
111     if not _windows:
112         print "all window unregist"
113         on_all_window_destroy()
114     else:
115         _gconf.save()
116
117 def on_all_window_destroy():
118     gtk.main_quit()
119
120 def thread_idx_updated(thread_uri, idx_dic):
121     if not thread_uri or not idx_dic:
122         raise ValueError, "parameter must not be empty"
123
124     gobject.idle_add(on_thread_idx_updated, thread_uri, idx_dic)
125
126 def on_thread_idx_updated(thread_uri, idx_dic):
127     bbs_type = bbs_type_judge_uri.get_type(thread_uri)
128     winwrap = get_window(bbs_type.get_uri_base())
129     if winwrap:
130         winwrap.on_thread_idx_updated(thread_uri, idx_dic)
131
132 def main_quit():
133     print "session main quit"
134
135     _gconf.save()
136     _gconf.set_enable(False)
137     temp = dict(_windows)
138     for uri, winwrap in temp.iteritems():
139         try:
140             winwrap.destroy()
141         except:
142             traceback.print_exc()
143
144     # not reach here.
145     gtk.main_quit()
146
147 def start():
148     _gconf.restore()
149     if not _windows:
150         uri_opener.open_uri("http://dubai.2ch.net/morningcoffee/")
151     gtk.gdk.threads_enter()
152     gtk.main()
153     gtk.gdk.threads_leave()