Save preload engines.
[platform/upstream/ibus.git] / setup / main.py
1 # vim:set et sts=4 sw=4:
2 #
3 # ibus - The Input Bus
4 #
5 # Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com>
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this program; if not, write to the
19 # Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 # Boston, MA  02111-1307  USA
21
22 from os import path
23 import gtk
24 import gobject
25 import ibus
26 from gtk import gdk, glade
27
28 (
29     NAME_COLUMN,
30     ENABLE_COLUMN,
31     PRELOAD_COLUMN,
32     VISIBLE_COLUMN,
33     ICON_COLUMN,
34     DATA_COLUMN,
35 ) = range(6)
36
37 (
38     DATA_NAME,
39     DATA_LANG,
40     DATA_ICON,
41     DATA_AUTHOR,
42     DATA_CREDITS,
43     DATA_EXEC,
44     DATA_STARTED,
45     DATA_PRELOAD
46 ) = range(8)
47
48 CONFIG_PRELOAD_ENGINES = "/general/preload_engines"
49
50 class Setup(object):
51     def __init__(self):
52         super(Setup, self).__init__()
53         try:
54             self.__bus = ibus.Bus()
55         except:
56             import traceback
57             traceback.print_exc()
58             self.__bus = None
59
60         glade_file = path.join(path.dirname(__file__), "./setup.glade")
61         self.__xml = glade.XML(glade_file)
62         self.__dialog = self.__xml.get_widget("dialog_setup")
63         self.__tree = self.__xml.get_widget("treeview_engines")
64         self.__preload_engines = set(self.__bus.config_get_value(CONFIG_PRELOAD_ENGINES, []))
65         model = self.__create_model()
66         self.__tree.set_model(model)
67
68         # add icon search path
69         icon_theme = gtk.icon_theme_get_default()
70         dir = path.dirname(__file__)
71         icondir = path.join(dir, "..", "icons")
72         icon_theme.prepend_search_path(icondir)
73
74         # column for holiday names
75         column = gtk.TreeViewColumn()
76         column.set_title("Name")
77
78         renderer = gtk.CellRendererPixbuf()
79         renderer.set_property("xalign", 0.5)
80
81         column.pack_start(renderer)
82         column.set_attributes(renderer, icon_name = ICON_COLUMN, visible = VISIBLE_COLUMN)
83
84         renderer = gtk.CellRendererText()
85         renderer.set_property("xalign", 0.0)
86
87         # column.set_clickable(True)
88         column.pack_start(renderer)
89         column.set_attributes(renderer, text = NAME_COLUMN)
90
91         self.__tree.append_column(column)
92
93         # column for started names
94         renderer = gtk.CellRendererToggle()
95         renderer.set_data('column', ENABLE_COLUMN)
96         renderer.set_property("xalign", 0.5)
97         renderer.connect("toggled", self.__item_started_column_toggled_cb, model)
98
99         #col_offset = gtk.TreeViewColumn("Holiday", renderer, text=HOLIDAY_NAME_COLUMN)
100         column = gtk.TreeViewColumn("Started", renderer, active = ENABLE_COLUMN, visible = VISIBLE_COLUMN)
101         self.__tree.append_column(column)
102         
103         # column for preload names
104         renderer = gtk.CellRendererToggle()
105         renderer.set_data('column', PRELOAD_COLUMN)
106         renderer.set_property("xalign", 0.5)
107         renderer.connect("toggled", self.__item_preload_column_toggled_cb, model)
108        
109         column = gtk.TreeViewColumn("Preload", renderer, active = PRELOAD_COLUMN, visible = VISIBLE_COLUMN)
110         self.__tree.append_column(column)
111         
112         
113         renderer = gtk.CellRendererText()
114         column = gtk.TreeViewColumn("", renderer)
115         self.__tree.append_column(column)
116
117
118
119     def __item_started_column_toggled_cb(self, cell, path_str, model):
120
121         # get toggled iter
122         iter = model.get_iter_from_string(path_str)
123         data = model.get_value(iter, DATA_COLUMN)
124
125         # do something with the value
126         if data[DATA_STARTED] == False:
127             try:
128                 self.__bus.register_start_engine(data[DATA_NAME], data[DATA_LANG])
129             except Exception, e:
130                 dlg = gtk.MessageDialog(type = gtk.MESSAGE_ERROR,
131                         buttons = gtk.BUTTONS_CLOSE,
132                         message_format = str(e))
133                 dlg.run()
134                 return
135         else:
136             try:
137                 self.__bus.register_stop_engine(data[DATA_NAME], data[DATA_LANG])
138             except Exception, e:
139                 dlg = gtk.MessageDialog(type = gtk.MESSAGE_ERROR,
140                         buttons = gtk.BUTTONS_CLOSE,
141                         message_format = str(e))
142                 dlg.run()
143                 return
144         data[DATA_STARTED] = not data[DATA_STARTED]
145
146         # set new value
147         model.set(iter, ENABLE_COLUMN, data[DATA_STARTED])
148
149     def __item_preload_column_toggled_cb(self, cell, path_str, model):
150
151         # get toggled iter
152         iter = model.get_iter_from_string(path_str)
153         data = model.get_value(iter, DATA_COLUMN)
154
155         data[DATA_PRELOAD] = not data[DATA_PRELOAD]
156         engine = "%s:%s" % (data[DATA_LANG], data[DATA_NAME])
157
158         if data[DATA_PRELOAD]:
159             if engine not in self.__preload_engines:
160                 self.__preload_engines.add(engine)
161                 self.__bus.config_set_value(CONFIG_PRELOAD_ENGINES, list(self.__preload_engines))
162         else:
163             if engine in self.__preload_engines:
164                 self.__preload_engines.remove(engine)
165                 self.__bus.config_set_value(CONFIG_PRELOAD_ENGINES, list(self.__preload_engines))
166
167
168         # set new value
169         model.set(iter, PRELOAD_COLUMN, data[DATA_PRELOAD])
170
171     def __create_model(self):
172         # create tree store
173         model = gtk.TreeStore(
174             gobject.TYPE_STRING,
175             gobject.TYPE_BOOLEAN,
176             gobject.TYPE_BOOLEAN,
177             gobject.TYPE_BOOLEAN,
178             gobject.TYPE_STRING,
179             gobject.TYPE_PYOBJECT)
180
181         langs = dict()
182
183         for name, lang, icon, author, credits, _exec, started in self.__bus.register_list_engines():
184             _lang = ibus.LANGUAGES.get(lang, "other")
185             if _lang not in langs:
186                 langs[_lang] = list()
187             langs[_lang].append([name, lang, icon, author, credits, _exec, started])
188
189         keys = langs.keys()
190         keys.sort()
191         for key in keys:
192             iter = model.append(None)
193             model.set(iter,
194                 NAME_COLUMN, key,
195                 ENABLE_COLUMN, False,
196                 PRELOAD_COLUMN, False,
197                 VISIBLE_COLUMN, False,
198                 ICON_COLUMN, None,
199                 DATA_COLUMN, None)
200             langs[key].sort()
201             for name, lang, icon, author, credits, _exec, started in langs[key]:
202                 child_iter = model.append(iter)
203                 is_preload = "%s:%s" % (lang, name) in self.__preload_engines
204                 model.set(child_iter,
205                     NAME_COLUMN, name,
206                     ENABLE_COLUMN, started,
207                     PRELOAD_COLUMN, is_preload,
208                     VISIBLE_COLUMN, True,
209                     ICON_COLUMN, icon,
210                     DATA_COLUMN, 
211                     [name, lang, icon, author, credits, _exec, started, is_preload])
212
213         return model
214
215
216     def run(self):
217         return self.__dialog.run()
218
219 if __name__ == "__main__":
220     Setup().run()