Philipp Hörist pushed to branch master at gajim / gajim
Commits: 3355988c by lovetox at 2020-09-08T08:17:54+02:00 Settings: Add more options for action button
- - - - - d1895cf1 by lovetox at 2020-09-08T08:56:54+02:00 Settings: Add set_group_chat_settings()
- - - - - 28ec7ab8 by lovetox at 2020-09-08T09:38:26+02:00 Settings: Add support for Account defaults
Previously only application default values were possible
- - - - - c6e8b299 by lovetox at 2020-09-08T09:50:43+02:00 Settings: Make send_chatstate an account setting
- - - - - eaeb31e9 by lovetox at 2020-09-08T13:00:26+02:00 Settings: Add set_contact_settings()
- - - - - 841556be by lovetox at 2020-09-08T13:08:13+02:00 Settings: Store settings to disk after deleting a value
- - - - - cadaac04 by lovetox at 2020-09-08T13:51:07+02:00 Settings: Fix deleting contact and group chat settings
- - - - - b4c10c71 by lovetox at 2020-09-08T16:45:12+02:00 Accounts: Add settings for chatstate
- - - - -
4 changed files:
- gajim/common/setting_values.py - gajim/common/settings.py - gajim/gtk/accounts.py - gajim/gtk/settings.py
Changes:
===================================== gajim/common/setting_values.py ===================================== @@ -4,7 +4,11 @@ from gajim.common.i18n import _ class _DEFAULT: pass
+class _ACCOUNT_DEFAULT: + pass + HAS_APP_DEFAULT = _DEFAULT() +HAS_ACCOUNT_DEFAULT = _ACCOUNT_DEFAULT()
# pylint: disable=line-too-long
@@ -171,7 +175,6 @@ APP_SETTINGS = { 'show_chatstate_in_roster': True, 'show_chatstate_in_tabs': True, 'show_chatstate_in_banner': True, - 'send_chatstate_default': 'composing_only', 'muclumbus_api_jid': 'rodrigo.de.mucobedo@dreckshal.de', 'muclumbus_api_http_uri': 'https://search.jabbercat.org/api/1.0/search', 'muclumbus_api_pref': 'http', @@ -183,7 +186,6 @@ APP_SETTINGS = { 'gc_notify_on_all_messages_public_default': False, 'gc_print_status_default': False, 'gc_print_join_left_default': False, - 'gc_send_chatstate_default': 'composing_only', 'check_for_update': True, 'last_update_check': '', 'always_ask_for_status_message': False, @@ -255,11 +257,13 @@ ACCOUNT_SETTINGS = { 'opened_chat_controls': '', 'recent_groupchats': '', 'filetransfer_preference' : 'httpupload', + 'send_chatstate_default': 'composing_only', + 'gc_send_chatstate_default': 'composing_only', },
'contact': { 'speller_language': '', - 'send_chatstate': HAS_APP_DEFAULT, + 'send_chatstate': HAS_ACCOUNT_DEFAULT, 'encryption': '', },
@@ -270,7 +274,7 @@ ACCOUNT_SETTINGS = { 'print_join_left': HAS_APP_DEFAULT, 'minimize_on_autojoin': True, 'minimize_on_close': True, - 'send_chatstate': HAS_APP_DEFAULT, + 'send_chatstate': HAS_ACCOUNT_DEFAULT, 'encryption': '', }, }
===================================== gajim/common/settings.py ===================================== @@ -42,6 +42,7 @@ from gajim.common.setting_values import DEFAULT_SOUNDEVENT_SETTINGS from gajim.common.setting_values import STATUS_PRESET_SETTINGS from gajim.common.setting_values import STATUS_PRESET_EXAMPLES from gajim.common.setting_values import HAS_APP_DEFAULT +from gajim.common.setting_values import HAS_ACCOUNT_DEFAULT
SETTING_TYPE = Union[bool, int, str, object]
@@ -283,7 +284,13 @@ class _Settings: # Migrate deprecated settings value = app_settings.pop('send_chatstate_muc_default', None) if value is not None: - app_settings['gc_send_chatstate_default'] = value + for account in self._account_settings['account']: + self._account_settings[account]['account']['gc_send_chatstate_default'] = value + + value = app_settings.pop('send_chatstate_default', None) + if value is not None: + for account in self._account_settings['account']: + self._account_settings[account]['account']['send_chatstate_default'] = value
value = app_settings.pop('print_join_left_default', None) if value is not None: @@ -302,6 +309,9 @@ class _Settings: self._settings['app'] = app_settings self._commit_settings('app')
+ for account in self._account_settings: + self._commit_account_settings(account) + def _migrate_encryption_settings(self) -> None: # Migrate encryption settings into contact/group chat settings encryption_settings = app.config.get_all_per('encryption') @@ -468,6 +478,7 @@ class _Settings: except KeyError: pass
+ self._commit_settings('app') self._notify(default, setting) return
@@ -579,6 +590,7 @@ class _Settings: except KeyError: pass
+ self._commit_account_settings(account) self._notify(default, setting, account) return
@@ -608,6 +620,14 @@ class _Settings: return self.get_app_setting( f'gc_{setting}_{context}_default') return self.get_app_setting(f'gc_{setting}_default') + + if default is HAS_ACCOUNT_DEFAULT: + if context is not None: + return self.get_account_setting( + account, f'gc_{setting}_{context}_default') + return self.get_account_setting(account, + f'gc_{setting}_default') + return default
def set_group_chat_setting(self, @@ -624,11 +644,16 @@ class _Settings: raise ValueError(f'Invalid group chat setting: {setting}')
default = ACCOUNT_SETTINGS['group_chat'][setting] - if default is HAS_APP_DEFAULT: + if default in (HAS_APP_DEFAULT, HAS_ACCOUNT_DEFAULT): + + default_store = APP_SETTINGS + if default is HAS_ACCOUNT_DEFAULT: + default_store = ACCOUNT_SETTINGS['account'] + if context is None: - default = APP_SETTINGS[f'gc_{setting}_default'] + default = default_store[f'gc_{setting}_default'] else: - default = APP_SETTINGS[f'gc_{setting}_{context}_default'] + default = default_store[f'gc_{setting}_{context}_default']
if not isinstance(value, type(default)) and value is not None: raise TypeError(f'Invalid type for {setting}: ' @@ -636,10 +661,11 @@ class _Settings:
if value is None: try: - del self._account_settings[account]['group_chat'][setting] + del self._account_settings[account]['group_chat'][jid][setting] except KeyError: pass
+ self._commit_account_settings(account) self._notify(default, setting, account, jid) return
@@ -652,6 +678,14 @@ class _Settings: self._commit_account_settings(account) self._notify(value, setting, account, jid)
+ def set_group_chat_settings(self, + setting: str, + value: SETTING_TYPE) -> None: + + for account in self._account_settings: + for jid in self._account_settings[account]['group_chat']: + self.set_group_chat_setting(account, jid, setting, value) + def get_contact_setting(self, account: str, jid: str, @@ -669,6 +703,10 @@ class _Settings: default = ACCOUNT_SETTINGS['contact'][setting] if default is HAS_APP_DEFAULT: return self.get_app_setting(f'{setting}_default') + + if default is HAS_ACCOUNT_DEFAULT: + return self.get_account_setting(account, f'{setting}_default') + return default
def set_contact_setting(self, @@ -684,18 +722,25 @@ class _Settings: raise ValueError(f'Invalid contact setting: {setting}')
default = ACCOUNT_SETTINGS['contact'][setting] - if default is HAS_APP_DEFAULT: - default = APP_SETTINGS[f'{setting}_default'] + if default in (HAS_APP_DEFAULT, HAS_ACCOUNT_DEFAULT): + + default_store = APP_SETTINGS + if default is HAS_ACCOUNT_DEFAULT: + default_store = ACCOUNT_SETTINGS['account'] + + default = default_store[f'{setting}_default'] + if not isinstance(value, type(default)) and value is not None: raise TypeError(f'Invalid type for {setting}: ' f'{value} {type(value)}')
if value is None: try: - del self._account_settings[account]['contact'][setting] + del self._account_settings[account]['contact'][jid][setting] except KeyError: pass
+ self._commit_account_settings(account) self._notify(default, setting, account, jid) return
@@ -708,6 +753,14 @@ class _Settings: self._commit_account_settings(account) self._notify(value, setting, account, jid)
+ def set_contact_settings(self, + setting: str, + value: SETTING_TYPE) -> None: + + for account in self._account_settings: + for jid in self._account_settings[account]['contact']: + self.set_contact_setting(account, jid, setting, value) + def set_soundevent_setting(self, event_name: str, setting: str,
===================================== gajim/gtk/accounts.py ===================================== @@ -655,6 +655,12 @@ class PrivacyPage(GenericSettingPage):
def __init__(self, account):
+ chatstate_entries = { + 'all': _('Enabled'), + 'composing_only': _('Composing Only'), + 'disabled': _('Disabled'), + } + settings = [ Setting(SettingKind.SWITCH, _('Idle Time'), SettingType.ACCOUNT_CONFIG, 'send_idle_time', @@ -679,9 +685,43 @@ class PrivacyPage(GenericSettingPage): SettingType.ACCOUNT_CONFIG, 'answer_receipts', desc=_('Tell your contacts if you received a message')),
+ Setting(SettingKind.POPOVER, + _('Send Chatstate'), + SettingType.ACCOUNT_CONFIG, + 'send_chatstate_default', + desc=_('Default for chats'), + props={'entries': chatstate_entries, + 'button-text':_('Reset'), + 'button-tooltip': _('Reset all chats to the ' + 'current default value'), + 'button-style': 'destructive-action', + 'button-callback': self._reset_send_chatstate}), + + Setting(SettingKind.POPOVER, + _('Send Chatstate in Group Chats'), + SettingType.ACCOUNT_CONFIG, + 'gc_send_chatstate_default', + desc=_('Default for group chats'), + props={'entries': chatstate_entries, + 'button-text':_('Reset'), + 'button-tooltip': _('Reset all group chats to the ' + 'current default value'), + 'button-style': 'destructive-action', + 'button-callback': self._reset_gc_send_chatstate}), + ] GenericSettingPage.__init__(self, account, settings)
+ @staticmethod + def _reset_send_chatstate(button): + button.set_sensitive(False) + app.settings.set_contact_settings('send_chatstate', None) + + @staticmethod + def _reset_gc_send_chatstate(button): + button.set_sensitive(False) + app.settings.set_group_chat_settings('send_chatstate', None) +
class ConnectionPage(GenericSettingPage):
===================================== gajim/gtk/settings.py ===================================== @@ -277,11 +277,24 @@ class GenericSetting(Gtk.ListBoxRow):
def _add_action_button(self, kwargs): icon_name = kwargs.get('button-icon-name') - if icon_name is None: + button_text = kwargs.get('button-text') + tooltip_text = kwargs.get('button-tooltip') or '' + style = kwargs.get('button-style') + + if icon_name is not None: + button = Gtk.Button.new_from_icon_name(icon_name, Gtk.IconSize.MENU) + + elif button_text is not None: + button = Gtk.Button(label=button_text) + + else: return
- button = Gtk.Button.new_from_icon_name(icon_name, Gtk.IconSize.MENU) + if style is not None: + button.get_style_context().add_class(style) + button.connect('clicked', kwargs['button-callback']) + button.set_tooltip_text(tooltip_text) self.setting_box.add(button)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/5027bbc3e4c6eedbfde6173f84cc13bc...