diff --git a/engine/table.py b/engine/table.py index 6de127f..ee481ed 100644 --- a/engine/table.py +++ b/engine/table.py @@ -639,6 +639,9 @@ class TabEngine(IBus.EngineSimple): # type: ignore self._default_keybindings = it_util.get_default_keybindings( self._gsettings, self.database) + self._input_method_menu: [str] = [] + self._input_method_menu = self._gsettings.get_strv('inputmethodmenu') + self._page_size: int = it_util.variant_to_value( self._gsettings.get_default_value('lookuptablepagesize')) for index in range(1, 10): @@ -2780,6 +2783,35 @@ class TabEngine(IBus.EngineSimple): # type: ignore ''' return self._chinese_mode + def set_input_method_menu( + self, input_method_menu: [str] = [], update_gsettings: bool = True) -> None: + '''Sets the visible input method menu items. + + :param input_method_menu: The visible input method menu items + :param update_gsettings: Whether to write the change to Gsettings. + Set this to False if this method is + called because the dconf key changed + to avoid endless loops when the dconf + key is changed twice in a short time. + + ''' + if DEBUG_LEVEL > 1: + LOGGER.debug('input_method_menu=%s', input_method_menu) + if input_method_menu == self._input_method_menu: + return + self._input_method_menu = input_method_menu + self._init_properties() + if update_gsettings: + self._gsettings.set_value( + "inputmethodmenu", + GLib.Variant.new_strv(input_method_menu)) + + def get_input_method_menu(self) -> [str]: + ''' + Return the visible input method menu items. + ''' + return self._input_method_menu + def _init_or_update_property_menu( self, menu: Dict[str, Any], @@ -2888,39 +2920,45 @@ class TabEngine(IBus.EngineSimple): # type: ignore self._sub_props_dict = {} self.main_prop_list = IBus.PropList() + _input_method_menu = self.get_input_method_menu() + self._init_or_update_property_menu( self.input_mode_menu, self._input_mode) - if self.database.is_db_chinese and self._chinese_mode != -1: + if "chinese_mode" in _input_method_menu and \ + self.database.is_db_chinese and self._chinese_mode != -1: self._init_or_update_property_menu( self.chinese_mode_menu, self._chinese_mode) if self.database.is_db_cjk: - self._init_or_update_property_menu( - self.letter_width_menu, - self._full_width_letter[self._input_mode]) - self._init_or_update_property_menu( - self.punctuation_width_menu, - self._full_width_punct[self._input_mode]) - - if self._ime_py: + if "letter_width" in _input_method_menu: + self._init_or_update_property_menu( + self.letter_width_menu, + self._full_width_letter[self._input_mode]) + if "punctuation_width" in _input_method_menu: + self._init_or_update_property_menu( + self.punctuation_width_menu, + self._full_width_punct[self._input_mode]) + + if "pinyin_mode" in _input_method_menu and self._ime_py: self._init_or_update_property_menu( self.pinyin_mode_menu, self._py_mode) - if self._ime_sg: + if "suggestion_mode" in _input_method_menu and self._ime_sg: self._init_or_update_property_menu( self.suggestion_mode_menu, self._sg_mode) - if self.database.is_db_cjk: + if "onechar_mode" in _input_method_menu and self.database.is_db_cjk: self._init_or_update_property_menu( self.onechar_mode_menu, self._onechar) - if self.database.user_can_define_phrase and self.database.rules: + if "autocommit_mode" in _input_method_menu and \ + self.database.user_can_define_phrase and self.database.rules: self._init_or_update_property_menu( self.autocommit_mode_menu, self._auto_commit) @@ -4489,6 +4527,8 @@ class TabEngine(IBus.EngineSimple): # type: ignore {'set_function': self.set_remember_input_mode, 'kwargs': {}}, 'darktheme': {'set_function': self.set_dark_theme, 'kwargs': {}}, + 'inputmethodmenu': + {'set_function': self.set_input_method_menu, 'kwargs': {}} } if key in set_functions: set_function = set_functions[key]['set_function'] diff --git a/org.freedesktop.ibus.engine.table.gschema.xml b/org.freedesktop.ibus.engine.table.gschema.xml index 00f70db..3caad5b 100644 --- a/org.freedesktop.ibus.engine.table.gschema.xml +++ b/org.freedesktop.ibus.engine.table.gschema.xml @@ -55,6 +55,12 @@ List of keybindings The list of configurable keybindings + + ['chinese_mode', 'letter_width', 'punctuation_width', + 'pinyin_mode', 'suggestion_mode'] + List of visible menu items + The list of visible input method menu items + false diff --git a/setup/main.py b/setup/main.py index 32066db..4858898 100644 --- a/setup/main.py +++ b/setup/main.py @@ -29,6 +29,7 @@ from typing import Union from typing import Any from typing import Dict from typing import List +from typing import Tuple from typing import Optional from types import FrameType import sys @@ -285,6 +286,19 @@ class SetupUI(Gtk.Window): # type: ignore # etc... self._keybindings_label.set_text(_('Key bindings')) + self._input_method_menu_grid = Gtk.Grid() + self._input_method_menu_grid.set_visible(True) + self._input_method_menu_grid.set_can_focus(False) + self._input_method_menu_grid.set_border_width(grid_border_width) + self._input_method_menu_grid.set_row_spacing(grid_row_spacing) + self._input_method_menu_grid.set_column_spacing(grid_column_spacing) + self._input_method_menu_grid.set_row_homogeneous(False) + self._input_method_menu_grid.set_column_homogeneous(True) + self._input_method_menu_grid.set_hexpand(True) + self._input_method_menu_grid.set_vexpand(False) + self._input_method_menu_label = Gtk.Label() + self._input_method_menu_label.set_text(_('Menu Items')) + self._notebook.append_page( self._options_grid, self._options_label) @@ -294,6 +308,9 @@ class SetupUI(Gtk.Window): # type: ignore self._notebook.append_page( self._keybindings_vbox, self._keybindings_label) + self._notebook.append_page( + self._input_method_menu_grid, + self._input_method_menu_label) _options_grid_row = -1 @@ -1169,6 +1186,34 @@ class SetupUI(Gtk.Window): # type: ignore self._options_details_grid.attach( self._debug_level_adjustment, 1, _options_details_grid_row, 1, 1) + # name, label, check button + self._input_method_menu_tuple: Tuple[str, str, Gtk.CheckButton] = \ + (["chinese_mode", _("Chinese Mode"), None], + ["letter_width", _("Letter Width"), None], + ["punctuation_width", _("Punctuation Width"), None], + ["pinyin_mode", _("Pinyin Mode"), None], + ["suggestion_mode", _("Suggestion Mode"), None], + ["onechar_mode", _("OneChar Mode"), None], + ["autocommit_mode", _("AutoCommit Mode"), None]) + + _input_method_menu_grid_row = -1 + + for item in self._input_method_menu_tuple: + (_name, _label, _button) = item + _input_method_menu_grid_row += 1 + _button = Gtk.CheckButton(label=_label) + _button.set_hexpand(False) + _button.set_vexpand(False) + if _name in self._settings_dict['inputmethodmenu']['user']: + _button.set_active(True) + else: + _button.set_active(False) + _button.connect( + 'clicked', self._on_input_method_menu_checkbutton) + self._input_method_menu_grid.attach( + _button, 0, _input_method_menu_grid_row, 1, 1) + item[2] = _button + self.show_all() # pylint: disable=no-member self._notebook.set_current_page(0) # Has to be after show_all() @@ -1509,6 +1554,18 @@ class SetupUI(Gtk.Window): # type: ignore 'user': user_autowildcard_mode, 'set_function': self.set_autowildcard_mode} + default_input_method_menu = it_util.variant_to_value( + self._gsettings.get_default_value('inputmethodmenu')) + user_input_method_menu = it_util.variant_to_value( + self._gsettings.get_value('inputmethodmenu')) + if user_input_method_menu is None: + user_input_method_menu = default_input_method_menu + + self._settings_dict['inputmethodmenu'] = { + 'default': default_input_method_menu, + 'user': user_input_method_menu, + 'set_function': self.set_input_method_menu} + @staticmethod def run_message_dialog( message: str, @@ -2289,6 +2346,19 @@ class SetupUI(Gtk.Window): # type: ignore self.set_keybindings(self._settings_dict['keybindings']['default']) self._keybindings_all_default_button.set_sensitive(True) + def _on_input_method_menu_checkbutton(self, widget: Gtk.CheckButton) -> None: + ''' + The checkbutton to whether to display the input method menu item + + :param widget: The check button clicked + ''' + items = [] + for item in self._input_method_menu_tuple: + (_name, _label, _button) = item + if _button.get_active(): + items.append(_name) + self.set_input_method_menu(items, update_gsettings=True) + def set_single_wildcard_char(self, single_wildcard_char: str, update_gsettings: bool = True) -> None: @@ -2952,6 +3022,34 @@ class SetupUI(Gtk.Window): # type: ignore 'keybindings', variant_dict.end()) + def set_input_method_menu( + self, + input_method_menu: [str], + update_gsettings: bool = True) -> None: + '''Sets the visible input method menu items + + :param input_method_menu: The visible input method menu items + :param update_gsettings: Whether to write the change to Gsettings. + Set this to False if this method is + called because the Gsettings key changed + to avoid endless loops when the Gsettings + key is changed twice in a short time. + ''' + LOGGER.info( + '(%s, update_gsettings = %s)', input_method_menu, update_gsettings) + self._settings_dict['inputmethodmenu']['user'] = input_method_menu + if update_gsettings: + self._gsettings.set_value( + 'inputmethodmenu', + GLib.Variant.new_strv(input_method_menu)) + else: + for item in self._input_method_menu_tuple: + (_name, _label, _button) = item + if _name in input_method_menu: + _button.set_active(True) + else: + _button.set_active(False) + class HelpWindow(Gtk.Window): # type: ignore ''' A window to show help