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