Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: a38e4a31 by lovetox at 2021-01-17T13:45:21+01:00 Add Workspace settings API
- - - - - cd3cd65b by lovetox at 2021-01-17T21:49:13+01:00 Store and Open chats
- - - - -
5 changed files:
- gajim/common/setting_values.py - gajim/common/settings.py - gajim/gtk/chat_list.py - gajim/gtk/chat_list_stack.py - gajim/gtk/main.py
Changes:
===================================== gajim/common/setting_values.py ===================================== @@ -1,3 +1,4 @@ +import uuid
from gajim.common.i18n import _
@@ -186,6 +187,7 @@ class _ACCOUNT_DEFAULT: 'last_update_check': '', 'always_ask_for_status_message': False, 'show_send_message_button': False, + 'workspace_order': [], }
ACCOUNT_SETTINGS = { @@ -283,6 +285,15 @@ class _ACCOUNT_DEFAULT: }
+WORKSPACE_SETTINGS = { + 'name': _('My Workspace'), + 'open_chats': [], +} + + +INITAL_WORKSPACE = {str(uuid.uuid4()): {}} + + PLUGIN_SETTINGS = { 'active': False }
===================================== gajim/common/settings.py ===================================== @@ -19,6 +19,7 @@
import sys import json +import uuid import logging import sqlite3 import inspect @@ -38,14 +39,16 @@ from gajim.common.setting_values import ACCOUNT_SETTINGS from gajim.common.setting_values import PROXY_SETTINGS from gajim.common.setting_values import PROXY_EXAMPLES +from gajim.common.setting_values import INITAL_WORKSPACE from gajim.common.setting_values import PLUGIN_SETTINGS +from gajim.common.setting_values import WORKSPACE_SETTINGS 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] +SETTING_TYPE = Union[bool, int, str, object, list]
log = logging.getLogger('gajim.c.settings')
@@ -65,10 +68,12 @@ INSERT INTO settings(name, settings) VALUES ('status_presets', '%s'); INSERT INTO settings(name, settings) VALUES ('proxies', '%s'); INSERT INTO settings(name, settings) VALUES ('plugins', '{}'); + INSERT INTO settings(name, settings) VALUES ('workspaces', '%s');
- PRAGMA user_version=0; + PRAGMA user_version=1; ''' % (json.dumps(STATUS_PRESET_EXAMPLES), - json.dumps(PROXY_EXAMPLES)) + json.dumps(PROXY_EXAMPLES), + json.dumps(INITAL_WORKSPACE))
class Settings: @@ -235,7 +240,12 @@ def _migrate_database(self) -> None: sys.exit()
def _migrate(self) -> None: - pass + version = self._get_user_version() + if version < 1: + sql = '''INSERT INTO settings(name, settings) + VALUES ('workspaces', ?)''' + self._con.execute(sql, (json.dumps(INITAL_WORKSPACE),)) + self._set_user_version(2)
def _migrate_old_config(self) -> None: config_file = configpaths.get('CONFIG_FILE') @@ -907,6 +917,68 @@ def remove_proxy(self, proxy_name: str) -> None: if self.get_account_setting(account, 'proxy') == proxy_name: self.set_account_setting(account, 'proxy', None)
+ def set_workspace_setting(self, + workspace_id: str, + setting: str, + value: SETTING_TYPE) -> None: + + if setting not in WORKSPACE_SETTINGS: + raise ValueError(f'Invalid workspace setting: {setting}') + + if workspace_id not in self._settings['workspaces']: + raise ValueError(f'Workspace does not exists: {workspace_id}') + + default = WORKSPACE_SETTINGS[setting] + if not isinstance(value, type(default)): + raise TypeError(f'Invalid type for {setting}: ' + f'{value} {type(value)}') + + self._settings['workspaces'][workspace_id][setting] = value + self._commit_settings('workspaces') + + def get_workspace_setting(self, + workspace_id: str, + setting: str) -> SETTING_TYPE: + + if setting not in WORKSPACE_SETTINGS: + raise ValueError(f'Invalid workspace setting: {setting}') + + if workspace_id not in self._settings['workspaces']: + raise ValueError(f'Workspace does not exists: {workspace_id}') + + try: + return self._settings['workspaces'][workspace_id][setting] + except KeyError: + return WORKSPACE_SETTINGS[setting] + + def get_workspaces(self) -> None: + workspace_order = app.settings.get_app_setting('workspace_order') + + def sort_workspaces(workspace_id): + try: + return workspace_order.index(workspace_id) + except ValueError: + # Handle the case that a workflow id is for some reason not + # in the workspace order list + return 10000 + + workspaces = list(self._settings['workspaces'].keys()) + workspaces.sort(key=sort_workspaces) + return workspaces + + def add_workspace(self, name: str) -> None: + id_ = str(uuid.uuid4()) + self._settings['workspaces'][id_] = { + 'name': name, + } + self._commit_settings('workspaces') + return id_ + + def remove_workspace(self, id_: str) -> None: + del self._settings['workspaces'][id_] + self._commit_settings('workspaces') + +
class LegacyConfig:
===================================== gajim/gtk/chat_list.py ===================================== @@ -41,6 +41,9 @@ def _on_row_selected(self, _listbox, row): return self._chat_stack.show_chat(row.account, row.jid)
+ def get_open_chats(self): + return list(self._chats.keys()) +
class ChatRow(Gtk.ListBoxRow): def __init__(self, account, jid):
===================================== gajim/gtk/chat_list_stack.py ===================================== @@ -1,6 +1,8 @@
from gi.repository import Gtk
+from gajim.common import app + from gajim.gui.chat_list import ChatList
@@ -21,19 +23,28 @@ def _on_search_changed(self, search_entry): chat_list = self.get_visible_child() chat_list.set_filter_text(search_entry.get_text())
- def add_chat_list(self, name): + def add_chat_list(self, workspace_id): chat_list = ChatList(self._ui, self._chat_stack) - self._chat_lists[name] = chat_list - self.add_named(chat_list, name) + self._chat_lists[workspace_id] = chat_list + self.add_named(chat_list, workspace_id) + return chat_list
- def show_chat_list(self, name): - self.set_visible_child_name(name) + def show_chat_list(self, workspace_id): + self.set_visible_child_name(workspace_id)
- def add_chat(self, name, *args): - chat_list = self._chat_lists.get(name) + def add_chat(self, workspace_id, *args): + chat_list = self._chat_lists.get(workspace_id) + if chat_list is None: + chat_list = self.add_chat_list(workspace_id) chat_list.add_chat(*args)
- def select_chat(self, name, *args): - self.show_chat_list(name) - chat_list = self._chat_lists.get(name) + def select_chat(self, workspace_id, *args): + self.show_chat_list(workspace_id) + chat_list = self._chat_lists.get(workspace_id) chat_list.select_chat(*args) + + def store_open_chats(self, workspace_id): + chat_list = self._chat_lists[workspace_id] + open_chats = chat_list.get_open_chats() + app.settings.set_workspace_setting( + workspace_id, 'open_chats', open_chats)
===================================== gajim/gtk/main.py ===================================== @@ -5,7 +5,6 @@ from gajim.gui.util import get_builder from gajim.gui.chat_list_stack import ChatListStack from gajim.gui.chat_stack import ChatStack -from gajim.gui.util import get_app_window
class MainWindow(Gtk.ApplicationWindow): @@ -19,6 +18,10 @@ def __init__(self): self.window = self app.window = self
+ self._active_workspace = None + + self._startup_finished = False + self._ui = get_builder('main.ui')
self.add(self._ui.main_grid) @@ -30,8 +33,6 @@ def __init__(self): self._ui.right_grid.add(self._chat_stack) self._ui.connect_signals(self)
- self._chat_list_stack.add_chat_list('default') - self.show_all()
self._load_chats() @@ -51,20 +52,30 @@ def show_title(self, *args): def get_active_jid(self, *args): pass
+ def get_active_workspace(self): + # TODO + return app.settings.get_workspaces()[0] + def add_chat(self, account, jid): + workspace_id = self.get_active_workspace() + self.add_chat_for_workspace(workspace_id, account, jid) + + def add_chat_for_workspace(self, workspace_id, account, jid): self._chat_stack.add_chat(account, jid) - self._chat_list_stack.add_chat('default', account, jid) - self._chat_list_stack.select_chat('default', account, jid) + self._chat_list_stack.add_chat(workspace_id, account, jid) + + if self._startup_finished: + self._chat_list_stack.select_chat(workspace_id, account, jid) + self._chat_list_stack.store_open_chats(workspace_id)
def get_control(self, account, jid): return self._chat_stack.get_control(account, jid)
def _load_chats(self): - for account in app.settings.get_accounts(): - jids = app.settings.get_account_setting( - account, 'opened_chat_controls') - if not jids: - continue - - for jid in jids.split(','): - self.add_chat(account, jid) + for workspace_id in app.settings.get_workspaces(): + open_chats = app.settings.get_workspace_setting(workspace_id, + 'open_chats') + for account, jid in open_chats: + self.add_chat_for_workspace(workspace_id, account, jid) + + self._startup_finished = True
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/a4e279ef234bbc0861a4a68396653b89...