Blame setup/enginecombobox.py

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()