1 # vim:set et sts=4 sw=4:
5 # Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
6 # Copyright (c) 2007-2010 Red Hat, Inc.
8 # This library is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2 of the License, or (at your option) any later version.
13 # This library is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU Lesser General Public License for more details.
18 # You should have received a copy of the GNU Lesser General Public
19 # License along with this program; if not, write to the
20 # Free Software Foundation, Inc., 59 Temple Place, Suite 330,
21 # Boston, MA 02111-1307 USA
25 from gi.repository import GObject
26 from gi.repository import Gtk
27 from gi.repository import IBus
28 from gi.repository import Pango
30 from icon import load_icon
31 from i18n import _, N_
33 class EngineComboBox(Gtk.ComboBox):
34 __gtype_name__ = 'EngineComboBox'
40 GObject.ParamFlags.READABLE)
44 super(EngineComboBox, self).__init__()
45 self.connect("notify::active", self.__notify_active_cb)
49 renderer = Gtk.CellRendererPixbuf()
50 renderer.set_property("xalign", 0)
51 renderer.set_property("xpad", 2)
52 self.pack_start(renderer, False)
53 self.set_cell_data_func(renderer, self.__icon_cell_data_cb, None)
55 renderer = Gtk.CellRendererText()
56 renderer.set_property("xalign", 0)
57 renderer.set_property("xpad", 2)
58 self.pack_start(renderer, True)
59 self.set_cell_data_func(renderer, self.__name_cell_data_cb, None)
61 def set_engines(self, engines):
62 self.__model = Gtk.TreeStore(object)
64 iter1 = self.__model.append(None)
65 self.__model.set(iter1, 0, 0)
68 print e.get_language()
69 l = IBus.get_language_name(e.get_language())
77 keys.sort(locale.strcoll)
78 current_lang = IBus.get_language_name(locale.getlocale()[0])
79 # move current language to the first place
80 if current_lang in keys:
81 keys.remove(current_lang)
82 keys.insert(0, current_lang)
84 #add "Others" to the end of the combo box
85 if IBus.get_language_name("Other") in keys:
86 keys.remove(IBus.get_language_name("Other"))
87 keys += [IBus.get_language_name("Other")]
89 iter1 = self.__model.append(None)
90 self.__model.set(iter1, 0, l)
92 if a.get_rank() == b.get_rank():
93 return locale.strcoll(a.get_longname(), b.get_longname())
94 return int(b.get_rank() - a.get_rank())
95 langs[l].sort(cmp_engine)
97 iter2 = self.__model.append(iter1)
98 self.__model.set(iter2, 0, e)
100 self.set_model(self.__model)
103 def __icon_cell_data_cb(self, celllayout, renderer, model, iter, data):
104 engine = self.__model.get_value(iter, 0)
106 if isinstance(engine, str) or isinstance (engine, unicode):
107 renderer.set_property("visible", False)
108 renderer.set_property("sensitive", False)
109 elif isinstance(engine, int):
110 renderer.set_property("visible", False)
111 renderer.set_property("sensitive", False)
113 renderer.set_property("visible", True)
114 renderer.set_property("sensitive", True)
115 pixbuf = load_icon(engine.get_icon(), Gtk.IconSize.LARGE_TOOLBAR)
117 pixbuf = load_icon("ibus-engine", Gtk.IconSize.LARGE_TOOLBAR)
119 pixbuf = load_icon(Gtk.STOCK_MISSING_IMAGE,
120 Gtk.IconSize.LARGE_TOOLBAR)
121 renderer.set_property("pixbuf", pixbuf)
123 def __name_cell_data_cb(self, celllayout, renderer, model, iter, data):
124 engine = self.__model.get_value(iter, 0)
126 if isinstance (engine, str) or isinstance (engine, unicode):
127 renderer.set_property("sensitive", False)
128 renderer.set_property("text", engine)
129 renderer.set_property("weight", Pango.Weight.NORMAL)
130 elif isinstance(engine, int):
131 renderer.set_property("sensitive", True)
132 renderer.set_property("text", _("Select an input method"))
133 renderer.set_property("weight", Pango.Weight.NORMAL)
135 renderer.set_property("sensitive", True)
136 renderer.set_property("text", engine.get_longname())
137 renderer.set_property("weight",
138 Pango.Weight.BOLD if engine.get_rank() > 0 else Pango.Weight.NORMAL)
140 def __notify_active_cb(self, combobox, property):
141 self.notify("active-engine")
143 def do_get_property(self, property):
144 if property.name == "active-engine":
145 i = self.get_active()
146 if i == 0 or i == -1:
148 iter = self.get_active_iter()
149 return self.get_model()[iter][0]
151 raise AttributeError, 'unknown property %s' % property.name
153 def get_active_engine(self):
154 return self.get_property("active-engine")
156 if __name__ == "__main__":
157 combo = EngineComboBox()
158 combo.set_engines([IBus.EngineDesc(language="zh")])