|
Packit Service |
1d8f1c |
# vim:set et sts=4 sw=4:
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# ibus - The Input Bus
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# Copyright (c) 2007-2014 Peng Huang <shawn.p.huang@gmail.com>
|
|
Packit Service |
1d8f1c |
# Copyright (c) 2007-2014 Red Hat, Inc.
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# This library is free software; you can redistribute it and/or
|
|
Packit Service |
1d8f1c |
# modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
1d8f1c |
# License as published by the Free Software Foundation; either
|
|
Packit Service |
1d8f1c |
# version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# This library is distributed in the hope that it will be useful,
|
|
Packit Service |
1d8f1c |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
1d8f1c |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
1d8f1c |
# Lesser General Public License for more details.
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
1d8f1c |
# License along with this library; if not, write to the Free Software
|
|
Packit Service |
1d8f1c |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
Packit Service |
1d8f1c |
# USA
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
import locale
|
|
Packit Service |
1d8f1c |
import functools
|
|
Packit Service |
1d8f1c |
import sys
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
from gi.repository import GObject
|
|
Packit Service |
1d8f1c |
from gi.repository import Gtk
|
|
Packit Service |
1d8f1c |
from gi.repository import IBus
|
|
Packit Service |
1d8f1c |
from gi.repository import Pango
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
from icon import load_icon
|
|
Packit Service |
1d8f1c |
from i18n import _, N_
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
class EngineComboBox(Gtk.ComboBox):
|
|
Packit Service |
1d8f1c |
__gtype_name__ = 'EngineComboBox'
|
|
Packit Service |
1d8f1c |
__gproperties__ = {
|
|
Packit Service |
1d8f1c |
'active-engine' : (
|
|
Packit Service |
1d8f1c |
object,
|
|
Packit Service |
1d8f1c |
'selected engine',
|
|
Packit Service |
1d8f1c |
'selected engine',
|
|
Packit Service |
1d8f1c |
GObject.ParamFlags.READABLE)
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def __init__(self):
|
|
Packit Service |
1d8f1c |
super(EngineComboBox, self).__init__()
|
|
Packit Service |
1d8f1c |
self.connect("notify::active", self.__notify_active_cb)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
self.__model = None
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
renderer = Gtk.CellRendererPixbuf()
|
|
Packit Service |
1d8f1c |
renderer.set_property("xalign", 0)
|
|
Packit Service |
1d8f1c |
renderer.set_property("xpad", 2)
|
|
Packit Service |
1d8f1c |
self.pack_start(renderer, False)
|
|
Packit Service |
1d8f1c |
self.set_cell_data_func(renderer, self.__icon_cell_data_cb, None)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
renderer = Gtk.CellRendererText()
|
|
Packit Service |
1d8f1c |
renderer.set_property("xalign", 0)
|
|
Packit Service |
1d8f1c |
renderer.set_property("xpad", 2)
|
|
Packit Service |
1d8f1c |
self.pack_start(renderer, True)
|
|
Packit Service |
1d8f1c |
self.set_cell_data_func(renderer, self.__name_cell_data_cb, None)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def set_engines(self, engines):
|
|
Packit Service |
1d8f1c |
self.__model = Gtk.TreeStore(object)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
iter1 = self.__model.append(None)
|
|
Packit Service |
1d8f1c |
self.__model.set(iter1, 0, 0)
|
|
Packit Service |
1d8f1c |
langs = {}
|
|
Packit Service |
1d8f1c |
for e in engines:
|
|
Packit Service |
1d8f1c |
l = IBus.get_language_name(e.get_language())
|
|
Packit Service |
1d8f1c |
if l == None:
|
|
Packit Service |
1d8f1c |
l = ""
|
|
Packit Service |
1d8f1c |
if l not in langs:
|
|
Packit Service |
1d8f1c |
langs[l] = []
|
|
Packit Service |
1d8f1c |
langs[l].append(e)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
keys = list(langs.keys())
|
|
Packit Service |
1d8f1c |
keys.sort(key=functools.cmp_to_key(locale.strcoll))
|
|
Packit Service |
1d8f1c |
loc = locale.getlocale()[0]
|
|
Packit Service |
1d8f1c |
# None on C locale
|
|
Packit Service |
1d8f1c |
if loc == None or loc == 'C':
|
|
Packit Service |
1d8f1c |
loc = 'en_US'
|
|
Packit Service |
1d8f1c |
current_lang = IBus.get_language_name(loc)
|
|
Packit Service |
1d8f1c |
# move current language to the first place
|
|
Packit Service |
1d8f1c |
if current_lang in keys:
|
|
Packit Service |
1d8f1c |
keys.remove(current_lang)
|
|
Packit Service |
1d8f1c |
keys.insert(0, current_lang)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
#add "Others" to the end of the combo box
|
|
Packit Service |
1d8f1c |
if IBus.get_language_name("Other") in keys:
|
|
Packit Service |
1d8f1c |
keys.remove(IBus.get_language_name("Other"))
|
|
Packit Service |
1d8f1c |
keys += [IBus.get_language_name("Other")]
|
|
Packit Service |
1d8f1c |
for l in keys:
|
|
Packit Service |
1d8f1c |
iter1 = self.__model.append(None)
|
|
Packit Service |
1d8f1c |
self.__model.set(iter1, 0, l)
|
|
Packit Service |
1d8f1c |
def cmp_engine(a, b):
|
|
Packit Service |
1d8f1c |
if a.get_rank() == b.get_rank():
|
|
Packit Service |
1d8f1c |
return locale.strcoll(a.get_longname(), b.get_longname())
|
|
Packit Service |
1d8f1c |
return int(b.get_rank() - a.get_rank())
|
|
Packit Service |
1d8f1c |
langs[l].sort(key=functools.cmp_to_key(cmp_engine))
|
|
Packit Service |
1d8f1c |
for e in langs[l]:
|
|
Packit Service |
1d8f1c |
iter2 = self.__model.append(iter1)
|
|
Packit Service |
1d8f1c |
self.__model.set(iter2, 0, e)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
self.set_model(self.__model)
|
|
Packit Service |
1d8f1c |
self.set_active(0)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def __icon_cell_data_cb(self, celllayout, renderer, model, iter, data):
|
|
Packit Service |
1d8f1c |
engine = self.__model.get_value(iter, 0)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if isinstance(engine, str):
|
|
Packit Service |
1d8f1c |
renderer.set_property("visible", False)
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", False)
|
|
Packit Service |
1d8f1c |
elif sys.version < '3' and isinstance (engine, unicode):
|
|
Packit Service |
1d8f1c |
renderer.set_property("visible", False)
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", False)
|
|
Packit Service |
1d8f1c |
elif isinstance(engine, int):
|
|
Packit Service |
1d8f1c |
renderer.set_property("visible", False)
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", False)
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
renderer.set_property("visible", True)
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", True)
|
|
Packit Service |
1d8f1c |
pixbuf = load_icon(engine.get_icon(), Gtk.IconSize.LARGE_TOOLBAR)
|
|
Packit Service |
1d8f1c |
renderer.set_property("pixbuf", pixbuf)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def __name_cell_data_cb(self, celllayout, renderer, model, iter, data):
|
|
Packit Service |
1d8f1c |
engine = self.__model.get_value(iter, 0)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if isinstance (engine, str):
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", False)
|
|
Packit Service |
1d8f1c |
renderer.set_property("text", engine)
|
|
Packit Service |
1d8f1c |
renderer.set_property("weight", Pango.Weight.NORMAL)
|
|
Packit Service |
1d8f1c |
elif sys.version < '3' and isinstance (engine, unicode):
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", False)
|
|
Packit Service |
1d8f1c |
renderer.set_property("text", engine)
|
|
Packit Service |
1d8f1c |
renderer.set_property("weight", Pango.Weight.NORMAL)
|
|
Packit Service |
1d8f1c |
elif isinstance(engine, int):
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", True)
|
|
Packit Service |
1d8f1c |
renderer.set_property("text", _("Select an input method"))
|
|
Packit Service |
1d8f1c |
renderer.set_property("weight", Pango.Weight.NORMAL)
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
renderer.set_property("sensitive", True)
|
|
Packit Service |
1d8f1c |
renderer.set_property("text", engine.get_longname())
|
|
Packit Service |
1d8f1c |
renderer.set_property("weight",
|
|
Packit Service |
1d8f1c |
Pango.Weight.BOLD if engine.get_rank() > 0 else Pango.Weight.NORMAL)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def __notify_active_cb(self, combobox, property):
|
|
Packit Service |
1d8f1c |
self.notify("active-engine")
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def do_get_property(self, property):
|
|
Packit Service |
1d8f1c |
if property.name == "active-engine":
|
|
Packit Service |
1d8f1c |
i = self.get_active()
|
|
Packit Service |
1d8f1c |
if i == 0 or i == -1:
|
|
Packit Service |
1d8f1c |
return None
|
|
Packit Service |
1d8f1c |
iter = self.get_active_iter()
|
|
Packit Service |
1d8f1c |
return self.get_model()[iter][0]
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
raise AttributeError('unknown property %s' % property.name)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_active_engine(self):
|
|
Packit Service |
1d8f1c |
return self.get_property("active-engine")
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if __name__ == "__main__":
|
|
Packit Service |
1d8f1c |
combo = EngineComboBox()
|
|
Packit Service |
1d8f1c |
combo.set_engines([IBus.EngineDesc(language="zh")])
|
|
Packit Service |
1d8f1c |
w = Gtk.Window()
|
|
Packit Service |
1d8f1c |
w.add(combo)
|
|
Packit Service |
1d8f1c |
w.show_all()
|
|
Packit Service |
1d8f1c |
Gtk.main()
|