1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# vim:set et sts=4 sw=4:
#
# ibus - The Input Bus
#
# Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
# Boston, MA 02111-1307 USA
import gtk
import gobject
import ibus
import gettext
from icon import load_icon
_ = lambda a : gettext.dgettext("ibus", a)
class EngineComboBox(gtk.ComboBox):
def __init__(self, engines):
super(EngineComboBox, self).__init__()
self.__model = gtk.TreeStore(gobject.TYPE_PYOBJECT)
iter1 = self.__model.append(None)
self.__model.set(iter1, 0, 0)
lang = {}
for e in engines:
l = ibus.get_language_name(e.language)
if l not in lang:
lang[l] = []
lang[l].append(e)
for l in lang.keys():
iter1 = self.__model.append(None)
self.__model.set(iter1, 0, l)
for e in lang[l]:
iter2 = self.__model.append(iter1)
self.__model.set(iter2, 0, e)
self.set_model(self.__model)
renderer = gtk.CellRendererPixbuf()
renderer.set_property("xalign", 0)
self.pack_start(renderer, False)
self.set_cell_data_func(renderer, self.__icon_cell_data_cb)
renderer = gtk.CellRendererText()
renderer.set_property("xalign", 0)
self.pack_start(renderer, True)
self.set_cell_data_func(renderer, self.__name_cell_data_cb)
self.set_active(0)
def __icon_cell_data_cb(self, celllayout, renderer, model, iter):
engine = self.__model.get_value(iter, 0)
icon_size = gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR)[0]
if isinstance(engine, str) or isinstance (engine, unicode):
renderer.set_property("visible", False)
renderer.set_property("sensitive", False)
elif isinstance(engine, int):
renderer.set_property("visible", False)
renderer.set_property("sensitive", False)
else:
renderer.set_property("visible", True)
renderer.set_property("sensitive", True)
pixbuf = load_icon(engine.icon, gtk.ICON_SIZE_LARGE_TOOLBAR)
if pixbuf == None:
pixbuf = load_icon("engine-default", gtk.ICON_SIZE_LARGE_TOOLBAR)
if pixbuf == None:
pixbuf = load_icon("gtk-missing-image", gtk.ICON_SIZE_LARGE_TOOLBAR)
renderer.set_property("pixbuf", pixbuf)
def __name_cell_data_cb(self, celllayout, renderer, model, iter):
engine = self.__model.get_value(iter, 0)
if isinstance (engine, str) or isinstance (engine, unicode):
renderer.set_property("sensitive", False)
renderer.set_property("text", engine)
elif isinstance(engine, int):
renderer.set_property("sensitive", True)
renderer.set_property("text", _("Select an input method"))
else:
renderer.set_property("sensitive", True)
renderer.set_property("text", engine.longname)
def get_active_engine(self):
i = self.get_active()
iter = self.get_active_iter()
if i == 0 or i == -1:
return None
return self.get_model()[iter][0]
|