Blame setup/enginecombobox.py

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