Philipp Hörist pushed to branch master at gajim / gajim
Commits: 1f907bf7 by lovetox at 2020-09-03T22:39:39+02:00 Settings: Add notification about changed settings
- - - - - bb6ae459 by lovetox at 2020-09-03T22:39:45+02:00 GroupChatControl: Use settings signals
- - - - - 1a151478 by lovetox at 2020-09-03T22:39:45+02:00 Settings: Add hints for translators
- - - - -
5 changed files:
- gajim/common/contacts.py - gajim/common/settings.py - gajim/groupchat_control.py - gajim/gtk/preferences.py - gajim/gtk/settings.py
Changes:
===================================== gajim/common/contacts.py ===================================== @@ -193,6 +193,10 @@ class Contact(CommonContact):
self.pep = {}
+ def connect_signal(self, setting, func): + app.settings.connect_signal( + setting, func, self.account.name, self.jid) + def get_full_jid(self): if self.resource: return self.jid + '/' + self.resource
===================================== gajim/common/settings.py ===================================== @@ -21,8 +21,11 @@ import sys import json import logging import sqlite3 +import inspect +import weakref from pathlib import Path from collections import namedtuple +from collections import defaultdict
from gi.repository import GLib
@@ -74,6 +77,38 @@ class _Settings: self._settings = {} self._account_settings = {}
+ self._callbacks = defaultdict(list) + + def connect_signal(self, setting, func, account=None, jid=None): + if not inspect.ismethod(func): + # static methods are not bound to an object so we can’t easily + # remove the func once it should not be called anymore + raise ValueError('Only bound methods can be connected') + + func = weakref.WeakMethod(func) + self._callbacks[(setting, account, jid)].append(func) + + def disconnect_signals(self, object_): + for _, handlers in self._callbacks.items(): + for handler in list(handlers): + func = handler() + if func is None or func.__self__ is object_: + print('remove handler', handler) + handlers.remove(handler) + + def _notify(self, setting, account=None, jid=None): + log.info('Signal: %s changed', setting) + + callbacks = self._callbacks[(setting, account, jid)] + for func in list(callbacks): + if func() is None: + callbacks.remove(func) + continue + try: + func()(setting, account, jid) + except Exception: + log.exception('Error while executing signal callback') + def init(self) -> None: self._setup_installation_defaults() self._connect_database() @@ -388,6 +423,8 @@ class _Settings: del self._settings['app'][setting] except KeyError: pass + + self._notify(setting) return
default = APP_SETTINGS[setting] @@ -398,6 +435,7 @@ class _Settings: self._settings['app'][setting] = value
self._commit_settings('app') + self._notify(setting)
set = set_app_setting
@@ -506,6 +544,7 @@ class _Settings: self._account_settings[account]['account'][setting] = value
self._commit_account_settings(account) + self._notify(setting, account)
def get_group_chat_setting(self, account: str, @@ -568,6 +607,7 @@ class _Settings: group_chat_settings[jid][setting] = value
self._commit_account_settings(account) + self._notify(setting, account, jid)
def get_contact_setting(self, account: str, @@ -621,6 +661,7 @@ class _Settings: contact_settings[jid][setting] = value
self._commit_account_settings(account) + self._notify(setting, account, jid)
def set_soundevent_setting(self, event_name: str,
===================================== gajim/groupchat_control.py ===================================== @@ -223,6 +223,10 @@ class GroupchatControl(ChatControlBase): ('message-error', ged.GUI1, self._on_message_error), ('bookmarks-received', ged.GUI2, self._on_bookmarks_received), ]) + + app.settings.connect_signal('gc_print_join_left_default', self.update_actions) + app.settings.connect_signal('gc_print_status_default', self.update_actions) + # pylint: enable=line-too-long
self.is_connected = False @@ -358,7 +362,7 @@ class GroupchatControl(ChatControlBase): act.connect('change-state', self._on_sync_threshold) self.parent_win.window.add_action(act)
- def update_actions(self): + def update_actions(self, *args): if self.parent_win is None: return
@@ -1661,6 +1665,8 @@ class GroupchatControl(ChatControlBase): del win._controls[self.account][self.contact.jid]
def shutdown(self, reason=None): + app.settings.disconnect_signals(self) + # Leave MUC if we are still joined if self._muc_data.state != MUCJoinedState.NOT_JOINED: self.got_disconnected()
===================================== gajim/gtk/preferences.py ===================================== @@ -522,13 +522,9 @@ class Preferences(Gtk.ApplicationWindow):
def _on_join_leave_toggled(self, widget): self.on_checkbutton_toggled(widget, 'gc_print_join_left_default') - for control in self._get_all_muc_controls(): - control.update_actions()
def _on_show_status_change_toggled(self, widget): self.on_checkbutton_toggled(widget, 'gc_print_status_default') - for control in self._get_all_muc_controls(): - control.update_actions()
def on_show_chatstate_in_tabs_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_chatstate_in_tabs')
===================================== gajim/gtk/settings.py ===================================== @@ -23,6 +23,7 @@ from gi.repository import Pango from gajim.common import app from gajim.common import passwords from gajim.common.i18n import _ +from gajim.common.i18n import Q_
from gajim import gtkgui_helpers
@@ -321,7 +322,7 @@ class SwitchSetting(GenericSetting): self._set_label(value)
def _set_label(self, active): - text = _('On') if active else _('Off') + text = Q_('?switch:On') if active else Q_('?switch:Off') self._switch_state_label.set_text(text)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/8afca1d1c98ab53550aeb9f631f380dc...