diff options
author | lovetox <philipp@hoerist.com> | 2022-08-16 00:55:45 +0300 |
---|---|---|
committer | lovetox <philipp@hoerist.com> | 2022-08-16 00:56:47 +0300 |
commit | 97d06fc036c4ec554cf5ed8746f4e26ab26a918a (patch) | |
tree | bc8b54ecd05cc9f4eb78ddde33c9f1b0e84e01ad | |
parent | 02cf35e7bc163b6b3fc63bced2ea8dc0d1737fb7 (diff) |
refactor: SpellChecker: Move code into MessageInput and simplify
-rw-r--r-- | gajim/gtk/message_actions_box.py | 70 | ||||
-rw-r--r-- | gajim/gtk/message_input.py | 76 | ||||
-rw-r--r-- | gajim/gtk/preferences.py | 20 |
3 files changed, 70 insertions, 96 deletions
diff --git a/gajim/gtk/message_actions_box.py b/gajim/gtk/message_actions_box.py index 6d9e71fcf..bdeb2510b 100644 --- a/gajim/gtk/message_actions_box.py +++ b/gajim/gtk/message_actions_box.py @@ -36,7 +36,6 @@ from nbxmpp.protocol import JID from gajim.common import app from gajim.common import events -from gajim.common import i18n from gajim.common import ged from gajim.common.commands import ArgumentParserError from gajim.common.commands import CommandError @@ -63,8 +62,6 @@ from .menus import get_self_contact_menu from .menus import get_singlechat_menu from .message_input import MessageInputTextView -if app.is_installed('GSPELL'): - from gi.repository import Gspell # pylint: disable=ungrouped-imports log = logging.getLogger('gajim.gui.messageactionsbox') @@ -122,9 +119,6 @@ class MessageActionsBox(Gtk.Grid, ged.EventHelper): self._ui.quick_invite_button.set_action_name('win.muc-invite') self._init_emoticon_popover() - # TODO init spellchecker uses a contact on callback, contact might - # be None - self._language_handler_id = self._init_spell_checker() self.show_all() self._ui.connect_signals(self) @@ -237,7 +231,6 @@ class MessageActionsBox(Gtk.Grid, ged.EventHelper): self._set_encryption_state(encryption) self._set_encryption_details(encryption) - self._set_spell_checker_language(contact) self._set_chatstate(True) self.msg_textview.switch_contact(contact) @@ -427,69 +420,6 @@ class MessageActionsBox(Gtk.Grid, ged.EventHelper): else: self.msg_textview.emit('insert-emoji') - def _init_spell_checker(self) -> int: - if not app.is_installed('GSPELL'): - return 0 - - checker = Gspell.Checker.new(Gspell.language_get_default()) - - buffer = Gspell.TextBuffer.get_from_gtk_text_buffer( - self.msg_textview.get_buffer()) - buffer.set_spell_checker(checker) - - use_spell_check = app.settings.get('use_speller') - view = Gspell.TextView.get_from_gtk_text_view(self.msg_textview) - view.set_inline_spell_checking(use_spell_check) - view.set_enable_language_menu(True) - - return checker.connect('notify::language', self._on_language_changed) - - def toggle_spell_checker(self) -> None: - if not app.is_installed('GSPELL'): - return - use_spell_check = app.settings.get('use_speller') - view = Gspell.TextView.get_from_gtk_text_view(self.msg_textview) - view.set_inline_spell_checking(use_spell_check) - - def _set_spell_checker_language(self, contact: ChatContactT) -> None: - if not app.is_installed('GSPELL'): - return - - buffer = Gspell.TextBuffer.get_from_gtk_text_buffer( - self.msg_textview.get_buffer()) - checker = buffer.get_spell_checker() - assert checker is not None - lang = self._get_spell_checker_language(contact) - - with checker.handler_block(self._language_handler_id): - checker.set_language(lang) - - def _get_spell_checker_language(self, - contact: ChatContactT - ) -> Optional[Gspell.Language]: - - lang = contact.settings.get('speller_language') - if not lang: - # use the default one - lang = app.settings.get('speller_language') - if not lang: - lang = i18n.LANG - - assert isinstance(lang, str) - lang = Gspell.language_lookup(lang) - if lang is None: - lang = Gspell.language_get_default() - return lang - - def _on_language_changed(self, - checker: Gspell.Checker, - _param: Any) -> None: - - gspell_lang = checker.get_language() - if gspell_lang is not None: - contact = self.get_current_contact() - contact.settings.set('speller_language', gspell_lang.get_code()) - def _on_send_file_enabled_changed(self, action: Gio.SimpleAction, _param: GObject.ParamSpec) -> None: diff --git a/gajim/gtk/message_input.py b/gajim/gtk/message_input.py index f77ef632f..e8e86daf8 100644 --- a/gajim/gtk/message_input.py +++ b/gajim/gtk/message_input.py @@ -33,6 +33,7 @@ from gi.repository import Pango from nbxmpp.protocol import JID from gajim.common import app +from gajim.common.i18n import LANG from gajim.common.i18n import _ from gajim.common.styling import process from gajim.common.styling import PlainBlock @@ -93,8 +94,66 @@ class MessageInputTextView(Gtk.TextView): self.connect('destroy', self._on_destroy) self.connect('populate-popup', self._on_populate_popup) + self._language_handler_id = self._init_spell_checker() + app.settings.connect_signal('use_speller', self._on_toggle_spell_check) + app.plugin_manager.gui_extension_point('message_input', self) + def _init_spell_checker(self) -> int: + if not app.is_installed('GSPELL'): + return 0 + + checker = Gspell.Checker.new(Gspell.language_get_default()) + + buffer = Gspell.TextBuffer.get_from_gtk_text_buffer(self.get_buffer()) + buffer.set_spell_checker(checker) + + view = Gspell.TextView.get_from_gtk_text_view(self) + view.set_enable_language_menu(True) + + self._on_toggle_spell_check() + + return checker.connect('notify::language', self._on_language_changed) + + def _set_spell_checker_language(self, contact: ChatContactT) -> None: + if not app.is_installed('GSPELL'): + return + + buffer = Gspell.TextBuffer.get_from_gtk_text_buffer(self.get_buffer()) + checker = buffer.get_spell_checker() + assert checker is not None + lang = self._get_spell_checker_language(contact) + + with checker.handler_block(self._language_handler_id): + checker.set_language(lang) + + def _get_spell_checker_language(self, + contact: ChatContactT + ) -> Optional[Gspell.Language]: + + lang = contact.settings.get('speller_language') + if not lang: + # use the default one + lang = app.settings.get('speller_language') + if not lang: + lang = LANG + + assert isinstance(lang, str) + lang = Gspell.language_lookup(lang) + if lang is None: + lang = Gspell.language_get_default() + return lang + + def _on_language_changed(self, + checker: Gspell.Checker, + _param: Any) -> None: + + gspell_lang = checker.get_language() + if gspell_lang is not None: + assert self._contact is not None + self._contact.settings.set('speller_language', + gspell_lang.get_code()) + def switch_contact(self, contact: ChatContactT) -> None: if self._contact is not None: account = self._contact.account @@ -111,6 +170,7 @@ class MessageInputTextView(Gtk.TextView): self._contact = contact self._chat_action_processor.switch_contact(contact) + self._set_spell_checker_language(contact) def _on_destroy(self, _widget: Gtk.Widget) -> None: # We restore the TextView’s drag destination to avoid a GTK warning @@ -129,7 +189,7 @@ class MessageInputTextView(Gtk.TextView): _widget: Gtk.Widget, _event: Gdk.EventFocus ) -> bool: - self.toggle_speller(True) + scrolled = self.get_parent() assert scrolled scrolled.get_style_context().add_class('message-input-focus') @@ -139,11 +199,10 @@ class MessageInputTextView(Gtk.TextView): _widget: Gtk.Widget, _event: Gdk.EventFocus ) -> bool: + scrolled = self.get_parent() assert scrolled scrolled.get_style_context().remove_class('message-input-focus') - if not self.has_text: - self.toggle_speller(False) return False def _clear_tags(self) -> None: @@ -210,10 +269,13 @@ class MessageInputTextView(Gtk.TextView): def get_draft(self, account: str, jid: JID) -> Optional[str]: return self._drafts.get((account, jid)) - def toggle_speller(self, activate: bool) -> None: - if app.is_installed('GSPELL') and app.settings.get('use_speller'): - spell_view = Gspell.TextView.get_from_gtk_text_view(self) - spell_view.set_inline_spell_checking(activate) + def _on_toggle_spell_check(self, *args: Any) -> None: + if not app.is_installed('GSPELL'): + return + + use_spell_check = app.settings.get('use_speller') + spell_view = Gspell.TextView.get_from_gtk_text_view(self) + spell_view.set_inline_spell_checking(use_spell_check) @staticmethod def _after_paste_clipboard(textview: Gtk.TextView) -> None: diff --git a/gajim/gtk/preferences.py b/gajim/gtk/preferences.py index 66066a612..9d4107d3f 100644 --- a/gajim/gtk/preferences.py +++ b/gajim/gtk/preferences.py @@ -271,8 +271,7 @@ class Chats(PreferenceBox): SettingType.CONFIG, 'use_speller', desc=speller_desc, - enabled_func=self._speller_available, - callback=self._on_use_speller), + enabled_func=self._speller_available), Setting(SettingKind.SWITCH, _('Message Receipts (✔)'), @@ -318,23 +317,6 @@ class Chats(PreferenceBox): return app.is_installed('GSPELL') @staticmethod - def _on_use_speller(value: bool, *args: Any) -> None: - # TODO - # if not value: - # return - - # lang = app.settings.get('speller_language') - # gspell_lang = Gspell.language_lookup(lang) - # if gspell_lang is None: - # gspell_lang = Gspell.language_get_default() - # if gspell_lang is None: - # return - # app.settings.set('speller_language', gspell_lang.get_code()) - # for ctrl in app.window.get_controls(): - # ctrl.set_speller() - pass - - @staticmethod def _on_show_send_message_button(show_button: bool, *args: Any) -> None: # Bind to send_on_ctrl_enter to make this setting user-friendly # This way, users can press Enter to insert a new line, then click Send |