def __model_append_langs(self, model, langs, visible): keys = list(langs.keys()) keys.sort(key=functools.cmp_to_key(locale.strcoll)) loc = locale.getlocale()[0] # None on C locale if loc == None: loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) #add "Others" to the end of the combo box if IBus.get_language_name("Other") in keys: keys.remove(IBus.get_language_name("Other")) keys += [IBus.get_language_name("Other")] for l in keys: iter1 = model.append(None) model.set(iter1, 0, l) def cmp_engine(a, b): if a.get_rank() == b.get_rank(): return locale.strcoll(a.get_longname(), b.get_longname()) return int(b.get_rank() - a.get_rank()) langs[l].sort(key=functools.cmp_to_key(cmp_engine)) for e in langs[l]: iter2 = model.append(iter1) model.set(iter2, 0, e)
def __gconf_get_lang_list_from_locale(self): common_list = ['en', 'Other'] loc = None try: loc = locale.setlocale(locale.LC_ALL) except: pass if loc == None: return common_list current_lang = IBus.get_language_name(loc) if current_lang == None: return common_list group_list = self.__settings_xkblayoutconfig.get_strv('group-list') if len(group_list) == 0: return [loc] + common_list lang_list = None for group in group_list: group = group.replace('_', '-') langs = self.__settings_xkblayoutconfig.get_strv(group) for lang in langs: if current_lang == IBus.get_language_name(lang): lang_list = langs break if lang_list != None: break if lang_list == None: return [loc] + common_list return lang_list + common_list
def __gconf_get_lang_list_from_locale(self): common_list = ['en', 'Other'] if self.__config == None: return None loc = None try: loc = locale.setlocale (locale.LC_ALL) except: pass if loc == None: return common_list current_lang = IBus.get_language_name(loc) if current_lang == None: return common_list group_list = self.__config.get_value("general/xkblayoutconfig", "group_list") if group_list == None: return [loc] + common_list group_list = list(group_list) lang_list = None for group in group_list: group = str(group) langs = list(self.__config.get_value("general/xkblayoutconfig", group)) for lang in langs: lang = str(lang) if current_lang == IBus.get_language_name(lang): lang_list = langs break if lang_list != None: break if lang_list == None: return [loc] + common_list return lang_list + common_list
def __model_append_langs(self, model, langs, visible): keys = langs.keys() keys.sort(locale.strcoll) loc = locale.getlocale()[0] # None on C locale if loc == None: loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) #add "Others" to the end of the combo box if IBus.get_language_name("Other") in keys: keys.remove(IBus.get_language_name("Other")) keys += [IBus.get_language_name("Other")] for l in keys: iter1 = model.append(None) model.set(iter1, 0, l) def cmp_engine(a, b): if a.get_rank() == b.get_rank(): return locale.strcoll(a.get_longname(), b.get_longname()) return int(b.get_rank() - a.get_rank()) langs[l].sort(cmp_engine) for e in langs[l]: iter2 = model.append(iter1) model.set(iter2, 0, e)
def __has_engine_in_lang_list(self, engine, lang_list): retval = False for lang in lang_list: if IBus.get_language_name(lang) == \ IBus.get_language_name(engine.props.language): retval = True break return retval
def __sort_engines(self, model, a, b, data): engine_a = model[a][0] engine_b = model[b][0] language_a = IBus.get_language_name(engine_a.get_language()) language_b = IBus.get_language_name(engine_b.get_language()) label_a = "%s - %s" % (language_a, engine_a.get_longname()) label_b = "%s - %s" % (language_b, engine_b.get_longname()) return cmp(label_a, label_b)
def __sort_engines(self, model, a, b, data): engine_a = model[a][0] engine_b = model[b][0] language_a = IBus.get_language_name(engine_a.get_language()) language_b = IBus.get_language_name(engine_b.get_language()) label_a = "%s - %s" % (language_a, engine_a.get_longname()) label_b = "%s - %s" % (language_b, engine_b.get_longname()) # http://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons return (label_a > label_b) - (label_a < label_b)
def __fill_text_view(self): text_buffer = self.__text_view.get_buffer() self.__create_tags(text_buffer) iter = text_buffer.get_iter_at_offset(0) text_buffer.insert_with_tags_by_name(iter, "\n ", "left_margin_16") text_buffer.insert_pixbuf( iter, self.__load_icon(self.__engine_desc.get_icon())) text_buffer.insert_with_tags_by_name( iter, "\n%s\n" % self.__engine_desc.get_longname(), "heading", "left_margin_16") text_buffer.insert_with_tags_by_name( iter, _("Language: %s\n") % IBus.get_language_name(self.__engine_desc.get_language()), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name( iter, _("Keyboard layout: %s\n") % self.__engine_desc.get_layout(), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name( iter, _("Author: %s\n") % self.__engine_desc.get_author(), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name(iter, _("Description:\n"), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name( iter, self.__engine_desc.get_description(), "wrap_text", "left_margin_32")
def set_engines(self, engines): self.__model = Gtk.TreeStore(object) iter1 = self.__model.append(None) self.__model.set(iter1, 0, 0) lang_list = self.__gconf_get_lang_list_from_locale() lang = {} sub_lang = {} for e in engines: l = IBus.get_language_name(e.props.language) if lang_list == None or \ self.__has_engine_in_lang_list(e, lang_list): if l not in lang: lang[l] = [] lang[l].append(e) else: if l not in sub_lang: sub_lang[l] = [] sub_lang[l].append(e) self.__model_append_langs(self.__model, lang, True) iter1 = self.__model.append(None) self.__model.set(iter1, 0, -1) self.__all_model = Gtk.TreeStore(object) iter1 = self.__all_model.append(None) self.__all_model.set(iter1, 0, 0) self.__model_append_langs(self.__all_model, lang, False) iter1 = self.__all_model.append(None) self.__all_model.set(iter1, 0, -1) self.__model_append_langs(self.__all_model, sub_lang, False) self.__toggle_sub_lang()
def __fill_text_view(self): text_buffer = self.__text_view.get_buffer() self.__create_tags(text_buffer) iter = text_buffer.get_iter_at_offset(0) text_buffer.insert_with_tags_by_name(iter, "\n ", "left_margin_16") text_buffer.insert_pixbuf(iter, self.__load_icon(self.__engine_desc.get_icon())) text_buffer.insert_with_tags_by_name(iter, "\n%s\n" % self.__engine_desc.get_longname(), "heading", "left_margin_16") text_buffer.insert_with_tags_by_name(iter, _("Language: %s\n") % IBus.get_language_name(self.__engine_desc.get_language()), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name(iter, _("Keyboard layout: %s\n") % self.__engine_desc.get_layout(), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name(iter, _("Author: %s\n") % self.__engine_desc.get_author(), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name(iter, _("Description:\n"), "small", "bold", "left_margin_16") text_buffer.insert_with_tags_by_name(iter, self.__engine_desc.get_description(), "wrap_text", "left_margin_32")
def set_engines(self, engines): self.__model = Gtk.TreeStore(object) iter1 = self.__model.append(None) self.__model.set(iter1, 0, 0) langs = {} for e in engines: l = IBus.get_language_name(e.get_language()) if l == None: l = "" if l not in langs: langs[l] = [] langs[l].append(e) keys = langs.keys() keys.sort(locale.strcoll) loc = locale.getlocale()[0] # None on C locale if loc == None: loc = "en_US" current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) # add "Others" to the end of the combo box if IBus.get_language_name("Other") in keys: keys.remove(IBus.get_language_name("Other")) keys += [IBus.get_language_name("Other")] for l in keys: iter1 = self.__model.append(None) self.__model.set(iter1, 0, l) def cmp_engine(a, b): if a.get_rank() == b.get_rank(): return locale.strcoll(a.get_longname(), b.get_longname()) return int(b.get_rank() - a.get_rank()) langs[l].sort(cmp_engine) for e in langs[l]: iter2 = self.__model.append(iter1) self.__model.set(iter2, 0, e) self.set_model(self.__model) self.set_active(0)
def set_engines(self, engines): self.__model = Gtk.TreeStore(object) iter1 = self.__model.append(None) self.__model.set(iter1, 0, 0) langs = {} for e in engines: l = IBus.get_language_name(e.get_language()) if l == None: l = "" if l not in langs: langs[l] = [] langs[l].append(e) keys = list(langs.keys()) keys.sort(key=functools.cmp_to_key(locale.strcoll)) loc = locale.getlocale()[0] # None on C locale if loc == None or loc == 'C': loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) #add "Others" to the end of the combo box if IBus.get_language_name("Other") in keys: keys.remove(IBus.get_language_name("Other")) keys += [IBus.get_language_name("Other")] for l in keys: iter1 = self.__model.append(None) self.__model.set(iter1, 0, l) def cmp_engine(a, b): if a.get_rank() == b.get_rank(): return locale.strcoll(a.get_longname(), b.get_longname()) return int(b.get_rank() - a.get_rank()) langs[l].sort(key=functools.cmp_to_key(cmp_engine)) for e in langs[l]: iter2 = self.__model.append(iter1) self.__model.set(iter2, 0, e) self.set_model(self.__model) self.set_active(0)
def __load_lang_list(self): dictdir = os.path.dirname(__file__) + '/../dicts' for filename in os.listdir(dictdir): suffix = '.dict' if not filename.endswith(suffix): continue lang_id = filename[0:len(filename) - len(suffix)] prefix = 'emoji-' if not lang_id.startswith(prefix): continue lang_id = lang_id[len(prefix):] lang = LanguageString(lang_id, IBus.get_language_name(lang_id)) self.__lang_list.append(lang) if len(self.__lang_list) == 0: print("Not found dicts in %s" % dictdir, file=sys.stderr) lang = LanguageString('en', IBus.get_language_name('en')) self.__lang_list.append(lang) return def cmp_lang(a, b): label_a = a.trans + a.id label_b = b.trans + b.id return (label_a > label_b) - (label_a < label_b) self.__lang_list.sort(key = functools.cmp_to_key(cmp_lang)) loc = locale.getlocale()[0] # None on C locale if loc == None or loc == 'C': loc = 'en_US' index = 0 for lang in self.__lang_list: # move current language to the first place if lang.trans == IBus.get_language_name(loc): self.__lang_list.remove(lang) self.__lang_list.insert(index, lang) index += 1 for lang in self.__lang_list: # move English to the second place if lang.trans == IBus.get_language_name('en'): self.__lang_list.remove(lang) self.__lang_list.insert(index, lang) index += 1
def __name_cell_data_cb(self, celllayout, renderer, model, it, data): engine = self.__model.get_value(it, 0) renderer.set_property("sensitive", True) language = IBus.get_language_name(engine.get_language()) renderer.set_property("text", "%s - %s" % (language, engine.get_longname())) if self.__model.get_path(it).get_indices()[0] == 0: # default engine renderer.set_property("weight", Pango.Weight.BOLD) else: renderer.set_property("weight", Pango.Weight.NORMAL)
def __name_cell_data_cb(self, celllayout, renderer, model, it, data): engine = self.__model.get_value(it, 0) # When append_engine() is called, self.__model.append(None) # is called internally and engine == None could happen in # a slow system. if engine == None: return renderer.set_property("sensitive", True) language = IBus.get_language_name(engine.get_language()) renderer.set_property("text", "%s - %s" % (language, engine.get_longname())) renderer.set_property("weight", Pango.Weight.NORMAL)
def __name_cell_data_cb(self, celllayout, renderer, model, it, data): engine = self.__model.get_value(it, 0) # When append_engine() is called, self.__model.append(None) # is called internally and engine == None could happen in # a slow system. if engine == None: return renderer.set_property("sensitive", True) language = IBus.get_language_name(engine.get_language()) longname = i18n.gettext_engine_longname(engine) renderer.set_property("text", "%s - %s" % (language, longname)) renderer.set_property("weight", Pango.Weight.NORMAL)
def set_engines(self, engines): self.__engines_for_lang = {} self.__untrans_for_lang = {} for e in engines: l = IBus.get_language_name(e.get_language()) if l == None: l = '' if l not in self.__engines_for_lang: self.__engines_for_lang[l] = [] self.__engines_for_lang[l].append(e) # Retrieve Untranslated language names. backup_locale = locale.setlocale(locale.LC_ALL, None) def __set_untrans_with_locale(en_locale): locale.setlocale(locale.LC_ALL, en_locale) untrans = IBus.get_language_name(e.get_language()) if untrans == None: untrans = '' self.__untrans_for_lang[l] = untrans try: __set_untrans_with_locale('en_US.UTF-8') except locale.Error: try: __set_untrans_with_locale('C') except locale.Error: pass locale.setlocale(locale.LC_ALL, backup_locale) keys = list(self.__engines_for_lang.keys()) keys.sort(key=functools.cmp_to_key(locale.strcoll)) loc = locale.getlocale()[0] # None on C locale if loc == None or loc == 'C': loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) # move English to the second place en_lang = IBus.get_language_name('en_US') if en_lang != current_lang and en_lang in keys: keys.remove(en_lang) keys.insert(1, en_lang) #add 'Others' to the end of the combo box if IBus.get_language_name('Other') in keys: keys.remove(IBus.get_language_name('Other')) keys += [IBus.get_language_name('Other')] self.__langs = keys self.__show_lang_rows()
def set_engines(self, engines): self.__engines_for_lang = {} self.__untrans_for_lang = {} for e in engines: l = IBus.get_language_name(e.get_language()) if l == None: l = '' if l not in self.__engines_for_lang: self.__engines_for_lang[l] = [] self.__engines_for_lang[l].append(e) # Retrieve Untranslated language names. backup_locale = locale.setlocale(locale.LC_ALL, None) try: locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') untrans = IBus.get_language_name(e.get_language()) if untrans == None: untrans = '' self.__untrans_for_lang[l] = untrans except locale.Error: pass locale.setlocale(locale.LC_ALL, backup_locale) keys = list(self.__engines_for_lang.keys()) keys.sort(key=functools.cmp_to_key(locale.strcoll)) loc = locale.getlocale()[0] # None on C locale if loc == None: loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) # move English to the second place en_lang = IBus.get_language_name('en_US') if en_lang != current_lang and en_lang in keys: keys.remove(en_lang) keys.insert(1, en_lang) #add 'Others' to the end of the combo box if IBus.get_language_name('Other') in keys: keys.remove(IBus.get_language_name('Other')) keys += [IBus.get_language_name('Other')] self.__langs = keys self.__show_lang_rows()
def set_engines(self, engines): #model self.__model = Gtk.TreeStore(object) iter1 = self.__model.append(None) self.__model.set(iter1, 0, 0) lang_list = self.__gconf_get_lang_list_from_locale() lang = {} sub_lang = {} for e in engines: l = IBus.get_language_name(e.props.language) if lang_list == None or \ self.__has_engine_in_lang_list(e, lang_list): if l not in lang: lang[l] = [] lang[l].append(e) else: if l not in sub_lang: sub_lang[l] = [] sub_lang[l].append(e) self.__model_append_langs(self.__model, lang, True) iter1 = self.__model.append(None) #self.__model.set(iter1, 0, -1) #all model self.__all_model = Gtk.TreeStore(object) #it will add a column #iter1 = self.__all_model.append(None) #self.__all_model.set(iter1, 0, 0) self.__model_append_langs(self.__all_model, lang, False) #remove it ,it will add a column #iter1 = self.__all_model.append(None) #self.__all_model.set(iter1, 0, -1) #ok, it will add other region input method self.__model_append_langs(self.__all_model, sub_lang, False) self.__toggle_sub_lang()
def set_engines(self, engines): self.__engines_for_lang = {} self.__untrans_for_lang = {} for e in engines: l = IBus.get_language_name(e.get_language()) if l == None: l = '' if l not in self.__engines_for_lang: self.__engines_for_lang[l] = [] i18n.init_textdomain(e.get_textdomain()) row = self.__engine_row_new(e) self.__engines_for_lang[l].append(row) # Retrieve Untranslated language names. untrans = IBus.get_untranslated_language_name(e.get_language()) if untrans == None: untrans = '' self.__untrans_for_lang[l] = untrans keys = list(self.__engines_for_lang.keys()) keys.sort(key=functools.cmp_to_key(locale.strcoll)) loc = locale.getlocale()[0] # None on C locale if loc == None or loc == 'C': loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) # move English to the second place en_lang = IBus.get_language_name('en_US') if en_lang != current_lang and en_lang in keys: keys.remove(en_lang) keys.insert(1, en_lang) #add 'Others' to the end of the combo box if IBus.get_language_name('Other') in keys: keys.remove(IBus.get_language_name('Other')) keys += [IBus.get_language_name('Other')] self.__langs = keys self.__show_lang_rows()
class EmojiLangChooser(Gtk.Dialog): __gtype_name__ = 'EmojiLangChooser' __initial_languages = [ IBus.get_language_name('en_US'), IBus.get_language_name('en_GB'), IBus.get_language_name('de_DE'), IBus.get_language_name('fr_FR'), IBus.get_language_name('es_ES'), IBus.get_language_name('zh_CN'), IBus.get_language_name('ja_JP'), IBus.get_language_name('ru_RU'), IBus.get_language_name('ar_EG') ] def __init__(self, id = None, transient_for = None): super(EmojiLangChooser, self).__init__( title = _("Select a language"), transient_for = transient_for, resizable = True) buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL, _("_OK"), Gtk.ResponseType.APPLY) self.add_buttons(*buttons) if id == None: id = 'en' self.__id = id self.__engines_for_lang = {} self.__untrans_for_lang = {} self.__langs = {} self.__lang_list = [] self.__scrolled = Gtk.ScrolledWindow( hscrollbar_policy = Gtk.PolicyType.NEVER, vscrollbar_policy = Gtk.PolicyType.NEVER, shadow_type = Gtk.ShadowType.IN, margin_start = 6, margin_end = 6, margin_top = 6, margin_bottom = 6) self.vbox.add(self.__scrolled) viewport = Gtk.Viewport() self.__scrolled.add(viewport) self.__list = Gtk.ListBox(vexpand = True, halign = Gtk.Align.FILL, valign = Gtk.Align.FILL) viewport.add(self.__list) self.__adjustment = self.__scrolled.get_vadjustment() self.__list.set_adjustment(self.__adjustment) self.__list.set_filter_func(self.__list_filter, None) self.__list.connect('row-activated', self.__row_activated) self.__showing_extra = False self.__more_row = self.__more_row_new() self.__load_lang_list() self.__show_lang_rows() self.show_all() def __load_lang_list(self): dictdir = os.path.dirname(__file__) + '/../dicts' for filename in os.listdir(dictdir): suffix = '.dict' if not filename.endswith(suffix): continue lang_id = filename[0:len(filename) - len(suffix)] prefix = 'emoji-' if not lang_id.startswith(prefix): continue lang_id = lang_id[len(prefix):] lang = LanguageString(lang_id, IBus.get_language_name(lang_id)) self.__lang_list.append(lang) if len(self.__lang_list) == 0: print("Not found dicts in %s" % dictdir, file=sys.stderr) lang = LanguageString('en', IBus.get_language_name('en')) self.__lang_list.append(lang) return def cmp_lang(a, b): label_a = a.trans + a.id label_b = b.trans + b.id return (label_a > label_b) - (label_a < label_b) self.__lang_list.sort(key = functools.cmp_to_key(cmp_lang)) loc = locale.getlocale()[0] # None on C locale if loc == None or loc == 'C': loc = 'en_US' index = 0 for lang in self.__lang_list: # move current language to the first place if lang.trans == IBus.get_language_name(loc): self.__lang_list.remove(lang) self.__lang_list.insert(index, lang) index += 1 for lang in self.__lang_list: # move English to the second place if lang.trans == IBus.get_language_name('en'): self.__lang_list.remove(lang) self.__lang_list.insert(index, lang) index += 1 def __list_filter(self, row, data): if row.id == self.__id: self.__list.select_row(row) if row == self.__more_row: return not self.__showing_extra if not self.__showing_extra and row.is_extra: return False return True def __row_activated(self, box, row): if row == self.__more_row: self.__show_more() return self.__id = row.id def __padded_label_new(self, text, icon, alignment, direction): hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) if direction == ROW_TRAVEL_DIRECTION_BACKWARD: rtl = (Gtk.Widget.get_default_direction() == \ Gtk.TextDirection.RTL) if rtl: arrow = Gtk.Image.new_from_icon_name( 'go-previous-rtl-symbolic', Gtk.IconSize.MENU) else: arrow = Gtk.Image.new_from_icon_name( 'go-previous-symbolic', Gtk.IconSize.MENU) hbox.pack_start(arrow, False, True, 0) if icon != None: pixbuf = load_icon(icon, Gtk.IconSize.LARGE_TOOLBAR) image = Gtk.Image(pixbuf = pixbuf) hbox.pack_start(image, False, True, 0) label = Gtk.Label(label = text) label.set_halign(alignment) label.set_valign(Gtk.Align.CENTER) label.set_margin_start(20) label.set_margin_end(20) label.set_margin_top(6) label.set_margin_bottom(6) hbox.pack_start(label, True, True, 0) return hbox def __list_box_row_new(self, lang): row = Gtk.ListBoxRow() row.trans = lang.trans row.id = lang.id row.is_extra = False return row def __lang_row_new(self, lang, prev_lang): row = self.__list_box_row_new(lang) label = lang.trans if lang.id == self.__id: row.is_extra = False elif prev_lang != None and label == prev_lang.trans: label = "%s (%s)" % (lang.trans, lang.id) row.is_extra = True elif not self.__showing_extra and \ lang.trans not in self.__initial_languages: row.is_extra = True widget = self.__padded_label_new(label, None, Gtk.Align.CENTER, ROW_TRAVEL_DIRECTION_NONE) row.add(widget) return row def __more_row_new(self): row = Gtk.ListBoxRow() row.id = None hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) row.add(hbox) row.set_tooltip_text(_("More…")) arrow = Gtk.Image.new_from_icon_name('view-more-symbolic', Gtk.IconSize.MENU) arrow.set_margin_start(20) arrow.set_margin_end(20) arrow.set_margin_top(6) arrow.set_margin_bottom(6) arrow.set_halign(Gtk.Align.CENTER) arrow.set_valign(Gtk.Align.CENTER) hbox.pack_start(arrow, True, True, 0) return row def __set_fixed_size(self): if self.__scrolled.get_policy()[0] == Gtk.PolicyType.AUTOMATIC: return (width, height) = self.get_size() self.set_size_request(width, height) self.__scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) def __remove_all_children(self): for l in self.__list.get_children(): self.__list.remove(l) def __show_lang_rows(self): self.__remove_all_children() prev_lang = None for lang in self.__lang_list: row = self.__lang_row_new(lang, prev_lang) self.__list.add(row) prev_lang = lang self.__list.add(self.__more_row) self.__list.show_all() self.__adjustment.set_value(self.__adjustment.get_lower()) self.__list.invalidate_filter() self.__list.set_selection_mode(Gtk.SelectionMode.SINGLE) def __show_more(self): self.__set_fixed_size() self.__showing_extra = True self.__list.invalidate_filter() def get_selected_lang(self): return self.__id
def set_lang(self, lang): self.__lang = lang self.notify("lang") self.set_label(IBus.get_language_name(lang))
def __set_untrans_with_locale(en_locale): locale.setlocale(locale.LC_ALL, en_locale) untrans = IBus.get_language_name(e.get_language()) if untrans == None: untrans = '' self.__untrans_for_lang[l] = untrans
class EngineDialog(Gtk.Dialog): __gtype_name__ = 'EngineDialog' __initial_languages = [ IBus.get_language_name('en_US'), IBus.get_language_name('en_GB'), IBus.get_language_name('de_DE'), IBus.get_language_name('fr_FR'), IBus.get_language_name('es_ES'), IBus.get_language_name('zh_CN'), IBus.get_language_name('ja_JP'), IBus.get_language_name('ru_RU'), IBus.get_language_name('ar_EG') ] def __init__(self, transient_for=None): super(EngineDialog, self).__init__(title=_("Select an input method"), transient_for=transient_for, resizable=True) buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL, _("_Add"), Gtk.ResponseType.APPLY) self.add_buttons(*buttons) self.set_response_sensitive(Gtk.ResponseType.APPLY, False) self.__engines_for_lang = {} self.__untrans_for_lang = {} self.__langs = {} self.__scrolled = Gtk.ScrolledWindow( hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.NEVER, shadow_type=Gtk.ShadowType.IN, margin_left=6, margin_right=6, margin_top=6, margin_bottom=6) self.vbox.add(self.__scrolled) viewport = Gtk.Viewport() self.__scrolled.add(viewport) self.__list = Gtk.ListBox(vexpand=True, halign=Gtk.Align.FILL, valign=Gtk.Align.FILL) viewport.add(self.__list) self.__adjustment = self.__scrolled.get_vadjustment() self.__list.set_adjustment(self.__adjustment) self.__list.set_filter_func(self.__list_filter, None) self.__list.connect('row-activated', self.__row_activated) self.__list.connect('row-selected', self.__row_selected) self.__showing_extra = False self.__more_row = self.__more_row_new() self.__filter_timeout_id = 0 self.__filter_word = None self.__filter_entry = Gtk.SearchEntry(hexpand=True, margin_left=6, margin_right=6, margin_top=6, margin_bottom=6) self.__filter_entry.set_no_show_all(True) self.__filter_entry.connect('search-changed', self.__filter_changed) self.vbox.add(self.__filter_entry) self.show_all() def __list_filter(self, row, data): if row == self.__more_row: return not self.__showing_extra if not self.__showing_extra and row.is_extra: return False if self.__filter_word == None: return True name = row.name.lower() untrans = row.untrans.lower() if self.__filter_word != None: word = self.__filter_word.lower() if name.startswith(word): return True if untrans.startswith(word): return True return False def __row_activated(self, box, row): if row == self.__more_row: self.__show_more() return if row.back: self.__filter_entry.set_text('') self.__show_lang_rows() return if row.lang_info: self.__filter_entry.set_text('') self.__show_engines_for_lang(row) return def __row_selected(self, box, row): self.set_response_sensitive(Gtk.ResponseType.APPLY, row != None) def __padded_label_new(self, text, icon, alignment, direction): hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) if direction == ROW_TRAVEL_DIRECTION_BACKWARD: rtl = (Gtk.Widget.get_default_direction() == \ Gtk.TextDirection.RTL) if rtl: arrow = Gtk.Image.new_from_icon_name( 'go-previous-rtl-symbolic', Gtk.IconSize.MENU) else: arrow = Gtk.Image.new_from_icon_name('go-previous-symbolic', Gtk.IconSize.MENU) hbox.pack_start(arrow, False, True, 0) if icon != None: pixbuf = load_icon(icon, Gtk.IconSize.LARGE_TOOLBAR) image = Gtk.Image(pixbuf=pixbuf) hbox.pack_start(image, False, True, 0) label = Gtk.Label(label=text) label.set_halign(alignment) label.set_valign(Gtk.Align.CENTER) label.set_margin_left(20) label.set_margin_right(20) label.set_margin_top(6) label.set_margin_bottom(6) hbox.pack_start(label, True, True, 0) return hbox def __list_box_row_new(self, text): row = Gtk.ListBoxRow() row.name = text row.is_extra = False row.lang_info = False row.back = False row.untrans = '' row.engine = None return row def __lang_row_new(self, text): row = self.__list_box_row_new(text) row.lang_info = True row.untrans = self.__untrans_for_lang[text] if not self.__showing_extra and text not in self.__initial_languages: row.is_extra = True widget = self.__padded_label_new(text, None, Gtk.Align.CENTER, ROW_TRAVEL_DIRECTION_NONE) row.add(widget) return row def __more_row_new(self): row = Gtk.ListBoxRow() hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) row.add(hbox) row.set_tooltip_text(_("More…")) arrow = Gtk.Image.new_from_icon_name('view-more-symbolic', Gtk.IconSize.MENU) arrow.set_margin_left(20) arrow.set_margin_right(20) arrow.set_margin_top(6) arrow.set_margin_bottom(6) arrow.set_halign(Gtk.Align.CENTER) arrow.set_valign(Gtk.Align.CENTER) hbox.pack_start(arrow, True, True, 0) return row def __back_row_new(self, text): row = self.__list_box_row_new(text) row.lang_info = True row.back = True widget = self.__padded_label_new(text, None, Gtk.Align.CENTER, ROW_TRAVEL_DIRECTION_BACKWARD) row.add(widget) return row def __engine_row_new(self, engine): row = self.__list_box_row_new(engine.get_longname()) row.set_tooltip_text(engine.get_description()) row.engine = engine widget = self.__padded_label_new(engine.get_longname(), engine.get_icon(), Gtk.Align.START, ROW_TRAVEL_DIRECTION_NONE) row.add(widget) return row def __set_fixed_size(self): if self.__scrolled.get_policy()[0] == Gtk.PolicyType.AUTOMATIC: return (width, height) = self.get_size() self.set_size_request(width, height) self.__scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) def __remove_all_children(self): for l in self.__list.get_children(): self.__list.remove(l) def __add_engine_rows_for_lang(self, row): lang = row.name def cmp_engine(a, b): if a.get_rank() == b.get_rank(): return locale.strcoll(a.get_longname(), b.get_longname()) return int(b.get_rank() - a.get_rank()) self.__engines_for_lang[lang].sort( key=functools.cmp_to_key(cmp_engine)) for e in self.__engines_for_lang[lang]: row = self.__engine_row_new(e) self.__list.add(row) def __show_lang_rows(self): self.__remove_all_children() for lang in self.__langs: row = self.__lang_row_new(lang) self.__list.add(row) self.__list.add(self.__more_row) self.__list.show_all() self.__adjustment.set_value(self.__adjustment.get_lower()) self.__list.invalidate_filter() self.__list.set_selection_mode(Gtk.SelectionMode.SINGLE) def __show_more(self): self.__set_fixed_size() self.__filter_entry.show() self.__showing_extra = True self.__list.invalidate_filter() def __show_engines_for_lang(self, row): text = row.name self.__set_fixed_size() self.__remove_all_children() row = self.__back_row_new(text) self.__list.add(row) self.__add_engine_rows_for_lang(row) self.__list.show_all() def __do_filter(self): text = self.__filter_entry.get_text() if text == '': self.__filter_word = None else: self.__filter_word = text self.__list.invalidate_filter() self.__filter_timeout_id = 0 return False def __filter_changed(self, entry): if self.__filter_timeout_id == 0: self.__filter_timeout_id = GLib.timeout_add(150, self.__do_filter) def set_engines(self, engines): self.__engines_for_lang = {} self.__untrans_for_lang = {} for e in engines: l = IBus.get_language_name(e.get_language()) if l == None: l = '' if l not in self.__engines_for_lang: self.__engines_for_lang[l] = [] self.__engines_for_lang[l].append(e) # Retrieve Untranslated language names. backup_locale = locale.setlocale(locale.LC_ALL, None) locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') untrans = IBus.get_language_name(e.get_language()) locale.setlocale(locale.LC_ALL, backup_locale) if untrans == None: untrans = '' self.__untrans_for_lang[l] = untrans keys = list(self.__engines_for_lang.keys()) keys.sort(key=functools.cmp_to_key(locale.strcoll)) loc = locale.getlocale()[0] # None on C locale if loc == None: loc = 'en_US' current_lang = IBus.get_language_name(loc) # move current language to the first place if current_lang in keys: keys.remove(current_lang) keys.insert(0, current_lang) # move English to the second place en_lang = IBus.get_language_name('en_US') if en_lang != current_lang and en_lang in keys: keys.remove(en_lang) keys.insert(1, en_lang) #add 'Others' to the end of the combo box if IBus.get_language_name('Other') in keys: keys.remove(IBus.get_language_name('Other')) keys += [IBus.get_language_name('Other')] self.__langs = keys self.__show_lang_rows() def get_selected_engine(self): row = self.__list.get_selected_row() if row == None: return None return row.engine