Blame setup/emojilang.py

Packit Service 1d8f1c
# vim:set et sts=4 sw=4:
Packit Service 1d8f1c
# -*- coding: utf-8 -*-
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# ibus - The Input Bus
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# Copyright (c) 2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
Packit Service 1d8f1c
# Copyright (c) 2017 Red Hat, Inc.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# This program is free software; you can redistribute it and/or
Packit Service 1d8f1c
# modify it under the terms of the GNU General Public License as
Packit Service 1d8f1c
# published by the Free Software Foundation; either version 2 of the
Packit Service 1d8f1c
# License, or (at your option) any later version.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# This program is distributed in the hope that it will be useful, but
Packit Service 1d8f1c
# 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
# General Public License for more details.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# You should have received a copy of the GNU General Public License
Packit Service 1d8f1c
# along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service 1d8f1c
Packit Service 1d8f1c
# for python2
Packit Service 1d8f1c
from __future__ import print_function
Packit Service 1d8f1c
Packit Service 1d8f1c
__all__ = (
Packit Service 1d8f1c
    "EmojiLangButton",
Packit Service 1d8f1c
);
Packit Service 1d8f1c
Packit Service 1d8f1c
from gi.repository import Gtk
Packit Service 1d8f1c
from gi.repository import GLib
Packit Service 1d8f1c
from gi.repository import GObject
Packit Service 1d8f1c
from gi.repository import IBus
Packit Service 1d8f1c
Packit Service 1d8f1c
import functools
Packit Service 1d8f1c
import gettext
Packit Service 1d8f1c
import i18n
Packit Service 1d8f1c
import locale
Packit Service 1d8f1c
import os
Packit Service 1d8f1c
Packit Service 1d8f1c
from icon import load_icon
Packit Service 1d8f1c
from i18n import _, N_
Packit Service 1d8f1c
Packit Service 1d8f1c
ROW_TRAVEL_DIRECTION_NONE,      \
Packit Service 1d8f1c
ROW_TRAVEL_DIRECTION_FORWARD,   \
Packit Service 1d8f1c
ROW_TRAVEL_DIRECTION_BACKWARD = list(range(3))
Packit Service 1d8f1c
Packit Service 1d8f1c
class LanguageString:
Packit Service 1d8f1c
    def __init__(self, id, trans = ""):
Packit Service 1d8f1c
        self.id = id
Packit Service 1d8f1c
        self.trans = trans
Packit Service 1d8f1c
Packit Service 1d8f1c
class EmojiLangChooser(Gtk.Dialog):
Packit Service 1d8f1c
    __gtype_name__ = 'EmojiLangChooser'
Packit Service 1d8f1c
    __initial_languages = [ IBus.get_language_name('en_US'),
Packit Service 1d8f1c
                            IBus.get_language_name('en_GB'),
Packit Service 1d8f1c
                            IBus.get_language_name('de_DE'),
Packit Service 1d8f1c
                            IBus.get_language_name('fr_FR'),
Packit Service 1d8f1c
                            IBus.get_language_name('es_ES'),
Packit Service 1d8f1c
                            IBus.get_language_name('zh_CN'),
Packit Service 1d8f1c
                            IBus.get_language_name('ja_JP'),
Packit Service 1d8f1c
                            IBus.get_language_name('ru_RU'),
Packit Service 1d8f1c
                            IBus.get_language_name('ar_EG') ]
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init__(self, id = None, transient_for = None):
Packit Service 1d8f1c
        super(EmojiLangChooser, self).__init__(
Packit Service 1d8f1c
                title = _("Select a language"),
Packit Service 1d8f1c
                transient_for = transient_for,
Packit Service 1d8f1c
                resizable = True)
Packit Service 1d8f1c
        buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL,
Packit Service 1d8f1c
                   _("_OK"), Gtk.ResponseType.APPLY)
Packit Service 1d8f1c
        self.add_buttons(*buttons)
Packit Service 1d8f1c
Packit Service 1d8f1c
        if id == None:
Packit Service 1d8f1c
            id = 'en'
Packit Service 1d8f1c
        self.__id = id
Packit Service 1d8f1c
        self.__engines_for_lang = {}
Packit Service 1d8f1c
        self.__untrans_for_lang = {}
Packit Service 1d8f1c
        self.__langs = {}
Packit Service 1d8f1c
        self.__lang_list = []
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__scrolled = Gtk.ScrolledWindow(
Packit Service 1d8f1c
                hscrollbar_policy = Gtk.PolicyType.NEVER,
Packit Service 1d8f1c
                vscrollbar_policy = Gtk.PolicyType.NEVER,
Packit Service 1d8f1c
                shadow_type = Gtk.ShadowType.IN,
Packit Service 1d8f1c
                margin_left = 6,
Packit Service 1d8f1c
                margin_right = 6,
Packit Service 1d8f1c
                margin_top = 6,
Packit Service 1d8f1c
                margin_bottom = 6)
Packit Service 1d8f1c
        self.vbox.add(self.__scrolled)
Packit Service 1d8f1c
        viewport = Gtk.Viewport()
Packit Service 1d8f1c
        self.__scrolled.add(viewport)
Packit Service 1d8f1c
        self.__list = Gtk.ListBox(vexpand = True,
Packit Service 1d8f1c
                                  halign = Gtk.Align.FILL,
Packit Service 1d8f1c
                                  valign = Gtk.Align.FILL)
Packit Service 1d8f1c
        viewport.add(self.__list)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__adjustment = self.__scrolled.get_vadjustment()
Packit Service 1d8f1c
        self.__list.set_adjustment(self.__adjustment)
Packit Service 1d8f1c
        self.__list.set_filter_func(self.__list_filter, None)
Packit Service 1d8f1c
        self.__list.connect('row-activated', self.__row_activated)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__showing_extra = False
Packit Service 1d8f1c
        self.__more_row = self.__more_row_new()
Packit Service 1d8f1c
        self.__load_lang_list()
Packit Service 1d8f1c
        self.__show_lang_rows()
Packit Service 1d8f1c
        self.show_all()
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __load_lang_list(self):
Packit Service 1d8f1c
        dictdir = os.path.dirname(__file__) + '/../dicts'
Packit Service 1d8f1c
        for filename in os.listdir(dictdir):
Packit Service 1d8f1c
            suffix = '.dict'
Packit Service 1d8f1c
            if not filename.endswith(suffix):
Packit Service 1d8f1c
                continue
Packit Service 1d8f1c
            lang_id = filename[0:len(filename) - len(suffix)]
Packit Service 1d8f1c
            prefix = 'emoji-'
Packit Service 1d8f1c
            if not lang_id.startswith(prefix):
Packit Service 1d8f1c
                continue
Packit Service 1d8f1c
            lang_id = lang_id[len(prefix):]
Packit Service 1d8f1c
            lang = LanguageString(lang_id, IBus.get_language_name(lang_id))
Packit Service 1d8f1c
            self.__lang_list.append(lang)
Packit Service 1d8f1c
        if len(self.__lang_list) == 0:
Packit Service 1d8f1c
            print("Not found dicts in %s" % dictdir, file=sys.stderr)
Packit Service 1d8f1c
            lang = LanguageString('en', IBus.get_language_name('en'))
Packit Service 1d8f1c
            self.__lang_list.append(lang)
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
Packit Service 1d8f1c
        def cmp_lang(a, b):
Packit Service 1d8f1c
            label_a = a.trans + a.id
Packit Service 1d8f1c
            label_b = b.trans + b.id
Packit Service 1d8f1c
            return (label_a > label_b) - (label_a < label_b)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__lang_list.sort(key = functools.cmp_to_key(cmp_lang))
Packit Service 1d8f1c
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
        index = 0
Packit Service 1d8f1c
        for lang in self.__lang_list:
Packit Service 1d8f1c
            # move current language to the first place
Packit Service 1d8f1c
            if lang.trans == IBus.get_language_name(loc):
Packit Service 1d8f1c
                self.__lang_list.remove(lang)
Packit Service 1d8f1c
                self.__lang_list.insert(index, lang)
Packit Service 1d8f1c
                index += 1
Packit Service 1d8f1c
Packit Service 1d8f1c
        for lang in self.__lang_list:
Packit Service 1d8f1c
            # move English to the second place
Packit Service 1d8f1c
            if lang.trans == IBus.get_language_name('en'):
Packit Service 1d8f1c
                self.__lang_list.remove(lang)
Packit Service 1d8f1c
                self.__lang_list.insert(index, lang)
Packit Service 1d8f1c
                index += 1
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __list_filter(self, row, data):
Packit Service 1d8f1c
        if row.id == self.__id:
Packit Service 1d8f1c
            self.__list.select_row(row)
Packit Service 1d8f1c
        if row == self.__more_row:
Packit Service 1d8f1c
            return not self.__showing_extra
Packit Service 1d8f1c
        if not self.__showing_extra and row.is_extra:
Packit Service 1d8f1c
            return False
Packit Service 1d8f1c
        return True
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __row_activated(self, box, row):
Packit Service 1d8f1c
        if row == self.__more_row:
Packit Service 1d8f1c
            self.__show_more()
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
        self.__id = row.id
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __padded_label_new(self, text, icon, alignment, direction):
Packit Service 1d8f1c
        hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)
Packit Service 1d8f1c
Packit Service 1d8f1c
        if direction == ROW_TRAVEL_DIRECTION_BACKWARD:
Packit Service 1d8f1c
            rtl = (Gtk.Widget.get_default_direction() == \
Packit Service 1d8f1c
                   Gtk.TextDirection.RTL)
Packit Service 1d8f1c
            if rtl:
Packit Service 1d8f1c
                arrow = Gtk.Image.new_from_icon_name(
Packit Service 1d8f1c
                    'go-previous-rtl-symbolic', Gtk.IconSize.MENU)
Packit Service 1d8f1c
            else:
Packit Service 1d8f1c
                arrow = Gtk.Image.new_from_icon_name(
Packit Service 1d8f1c
                    'go-previous-symbolic', Gtk.IconSize.MENU)
Packit Service 1d8f1c
            hbox.pack_start(arrow, False, True, 0)
Packit Service 1d8f1c
Packit Service 1d8f1c
        if icon != None:
Packit Service 1d8f1c
            pixbuf = load_icon(icon, Gtk.IconSize.LARGE_TOOLBAR)
Packit Service 1d8f1c
            image = Gtk.Image(pixbuf = pixbuf)
Packit Service 1d8f1c
            hbox.pack_start(image, False, True, 0)
Packit Service 1d8f1c
Packit Service 1d8f1c
        label = Gtk.Label(label = text)
Packit Service 1d8f1c
        label.set_halign(alignment)
Packit Service 1d8f1c
        label.set_valign(Gtk.Align.CENTER)
Packit Service 1d8f1c
        label.set_margin_left(20)
Packit Service 1d8f1c
        label.set_margin_right(20)
Packit Service 1d8f1c
        label.set_margin_top(6)
Packit Service 1d8f1c
        label.set_margin_bottom(6)
Packit Service 1d8f1c
        hbox.pack_start(label, True, True, 0)
Packit Service 1d8f1c
        return hbox
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __list_box_row_new(self, lang):
Packit Service 1d8f1c
        row = Gtk.ListBoxRow()
Packit Service 1d8f1c
        row.trans = lang.trans
Packit Service 1d8f1c
        row.id = lang.id
Packit Service 1d8f1c
        row.is_extra = False
Packit Service 1d8f1c
        return row
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __lang_row_new(self, lang, prev_lang):
Packit Service 1d8f1c
        row = self.__list_box_row_new(lang)
Packit Service 1d8f1c
        label = lang.trans
Packit Service 1d8f1c
        if lang.id == self.__id:
Packit Service 1d8f1c
            row.is_extra = False
Packit Service 1d8f1c
        elif prev_lang != None and label == prev_lang.trans:
Packit Service 1d8f1c
            label = "%s (%s)" % (lang.trans, lang.id)
Packit Service 1d8f1c
            row.is_extra = True
Packit Service 1d8f1c
        elif not self.__showing_extra and \
Packit Service 1d8f1c
           lang.trans not in self.__initial_languages:
Packit Service 1d8f1c
            row.is_extra = True
Packit Service 1d8f1c
        widget = self.__padded_label_new(label,
Packit Service 1d8f1c
                                         None,
Packit Service 1d8f1c
                                         Gtk.Align.CENTER,
Packit Service 1d8f1c
                                         ROW_TRAVEL_DIRECTION_NONE)
Packit Service 1d8f1c
        row.add(widget)
Packit Service 1d8f1c
        return row
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __more_row_new(self):
Packit Service 1d8f1c
        row = Gtk.ListBoxRow()
Packit Service 1d8f1c
        row.id = None
Packit Service 1d8f1c
        hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)
Packit Service 1d8f1c
        row.add(hbox)
Packit Service 1d8f1c
        row.set_tooltip_text(_("Moreā€¦"))
Packit Service 1d8f1c
        arrow = Gtk.Image.new_from_icon_name('view-more-symbolic',
Packit Service 1d8f1c
                                             Gtk.IconSize.MENU)
Packit Service 1d8f1c
        arrow.set_margin_left(20)
Packit Service 1d8f1c
        arrow.set_margin_right(20)
Packit Service 1d8f1c
        arrow.set_margin_top(6)
Packit Service 1d8f1c
        arrow.set_margin_bottom(6)
Packit Service 1d8f1c
        arrow.set_halign(Gtk.Align.CENTER)
Packit Service 1d8f1c
        arrow.set_valign(Gtk.Align.CENTER)
Packit Service 1d8f1c
        hbox.pack_start(arrow, True, True, 0)
Packit Service 1d8f1c
        return row
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __set_fixed_size(self):
Packit Service 1d8f1c
        if self.__scrolled.get_policy()[0] == Gtk.PolicyType.AUTOMATIC:
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
        (width, height) = self.get_size()
Packit Service 1d8f1c
        self.set_size_request(width, height)
Packit Service 1d8f1c
        self.__scrolled.set_policy(Gtk.PolicyType.AUTOMATIC,
Packit Service 1d8f1c
                                   Gtk.PolicyType.AUTOMATIC)
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __remove_all_children(self):
Packit Service 1d8f1c
        for l in self.__list.get_children():
Packit Service 1d8f1c
            self.__list.remove(l)
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __show_lang_rows(self):
Packit Service 1d8f1c
        self.__remove_all_children()
Packit Service 1d8f1c
        prev_lang = None
Packit Service 1d8f1c
        for lang in self.__lang_list:
Packit Service 1d8f1c
            row = self.__lang_row_new(lang, prev_lang)
Packit Service 1d8f1c
            self.__list.add(row)
Packit Service 1d8f1c
            prev_lang = lang
Packit Service 1d8f1c
        self.__list.add(self.__more_row)
Packit Service 1d8f1c
        self.__list.show_all()
Packit Service 1d8f1c
        self.__adjustment.set_value(self.__adjustment.get_lower())
Packit Service 1d8f1c
        self.__list.invalidate_filter()
Packit Service 1d8f1c
        self.__list.set_selection_mode(Gtk.SelectionMode.SINGLE)
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __show_more(self):
Packit Service 1d8f1c
        self.__set_fixed_size()
Packit Service 1d8f1c
        self.__showing_extra = True
Packit Service 1d8f1c
        self.__list.invalidate_filter()
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def get_selected_lang(self):
Packit Service 1d8f1c
        return self.__id
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
class EmojiLangButton(Gtk.Button):
Packit Service 1d8f1c
    __gtype_name__ = 'EmojiLangButton'
Packit Service 1d8f1c
    __gproperties__ = {
Packit Service 1d8f1c
        'lang' : (
Packit Service 1d8f1c
            str,
Packit Service 1d8f1c
            'lang',
Packit Service 1d8f1c
            'lang for emojo-*.dict',
Packit Service 1d8f1c
            'en',
Packit Service 1d8f1c
            GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE)
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init__(self):
Packit Service 1d8f1c
        super(EmojiLangButton, self).__init__()
Packit Service 1d8f1c
        self.__lang = ''
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def do_get_property(self, prop):
Packit Service 1d8f1c
        if prop.name == 'lang':
Packit Service 1d8f1c
            return self.__lang
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            raise AttributeError('unknown property %s' % prop.name)
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def do_set_property(self, prop, value):
Packit Service 1d8f1c
        if prop.name == 'lang':
Packit Service 1d8f1c
            self.set_lang(value)
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            raise AttributeError('unknown property %s' % prop.name)
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def do_clicked(self):
Packit Service 1d8f1c
        dialog = EmojiLangChooser(id = self.__lang,
Packit Service 1d8f1c
                                  transient_for = self.get_toplevel())
Packit Service 1d8f1c
        id = dialog.run()
Packit Service 1d8f1c
        if id != Gtk.ResponseType.APPLY:
Packit Service 1d8f1c
            dialog.destroy()
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
        self.set_lang(dialog.get_selected_lang())
Packit Service 1d8f1c
        dialog.destroy()
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def set_lang(self, lang):
Packit Service 1d8f1c
        self.__lang = lang
Packit Service 1d8f1c
        self.notify("lang")
Packit Service 1d8f1c
        self.set_label(IBus.get_language_name(lang))
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    def get_lang(self, lang):
Packit Service 1d8f1c
        return self.__lang
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
GObject.type_register(EmojiLangButton)
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
if __name__ == "__main__":
Packit Service 1d8f1c
        dialog = EmojiLangChooser()
Packit Service 1d8f1c
        id = dialog.run()
Packit Service 1d8f1c
        if id != Gtk.ResponseType.APPLY:
Packit Service 1d8f1c
            dialog.destroy()
Packit Service 1d8f1c
            import sys
Packit Service 1d8f1c
            sys.exit(0)
Packit Service 1d8f1c
        print("Selected language:", dialog.get_selected_lang())