From 3564e7a571460661d5ed28282917f2bc782584cb Mon Sep 17 00:00:00 2001 From: miruka Date: Sat, 14 Nov 2020 11:30:03 -0400 Subject: [PATCH] Turn bookmarks/aliases/at_index into Sections --- docs/TODO.md | 8 +- src/backend/matrix_client.py | 11 +-- src/backend/user_files.py | 3 +- src/config/settings.py | 89 +++++++++++---------- src/gui/MainPane/RoomList.qml | 8 +- src/gui/Pages/AccountSettings/Account.qml | 4 +- src/gui/Pages/Chat/Composer/MessageArea.qml | 2 +- 7 files changed, 64 insertions(+), 61 deletions(-) diff --git a/docs/TODO.md b/docs/TODO.md index 2a9e03d0..36c6a35e 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,7 +1,11 @@ # TODO -- login page password spinner -- Encrypted rooms don't show invites in member list after Mirage restart +- Fix MatrixForbidden when switching rooms with Alt+numbers +- Verify PCN include_builtin works under QRC +- PCN docstrings +- PCN error handling +- PCN documentation + - Room display name not updated when someone removes theirs - Fix right margin of own `\n` messages diff --git a/src/backend/matrix_client.py b/src/backend/matrix_client.py index 4c1baa55..921935cb 100644 --- a/src/backend/matrix_client.py +++ b/src/backend/matrix_client.py @@ -1147,7 +1147,7 @@ class MatrixClient(nio.AsyncClient): room.bookmarked = not room.bookmarked settings = self.backend.settings - bookmarks = settings.RoomList.bookmarks + bookmarks = settings.RoomList.Bookmarks user_bookmarks = bookmarks.setdefault(self.user_id, []) if room.bookmarked and room_id not in user_bookmarks: @@ -1157,10 +1157,7 @@ class MatrixClient(nio.AsyncClient): user_bookmarks.remove(room_id) # Changes inside dicts/lists aren't monitored, need to reassign - settings.RoomList.bookmarks = { - **bookmarks, self.user_id: user_bookmarks, - } - + settings.RoomList.Bookmarks[self.user_id] = user_bookmarks self.backend.settings.save() async def room_forget(self, room_id: str) -> None: @@ -1874,7 +1871,7 @@ class MatrixClient(nio.AsyncClient): ) unverified_devices = registered.unverified_devices - bookmarks = self.backend.settings.RoomList.bookmarks + bookmarks = self.backend.settings.RoomList.Bookmarks room_item = Room( id = room.room_id, for_account = self.user_id, @@ -1921,7 +1918,7 @@ class MatrixClient(nio.AsyncClient): local_highlights = local_highlights, lexical_sorting = self.backend.settings.RoomList.lexical_sort, - bookmarked = room.room_id in bookmarks.get(self.user_id, {}), + bookmarked = room.room_id in bookmarks.get(self.user_id, []), ) self.models[self.user_id, "rooms"][room.room_id] = room_item diff --git a/src/backend/user_files.py b/src/backend/user_files.py index c0844834..a8eb2ff5 100644 --- a/src/backend/user_files.py +++ b/src/backend/user_files.py @@ -267,8 +267,7 @@ class PCNFile(MappingFile): def deserialized(self, data: str) -> Tuple[Section, bool]: root = Section.from_source_code(data, self.path) edits = self.write_path.read_text() if self.write_path.exists() else "" - root.deep_merge_edits(json.loads(edits)) - return (root, False) + return (root, root.deep_merge_edits(json.loads(edits))) def serialized(self) -> str: edits = self.data.edits_as_dict() diff --git a/src/config/settings.py b/src/config/settings.py index fea5348a..44488d62 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -74,11 +74,6 @@ class RoomList: # The application must be restarted to apply changes to this setting. lexical_sort: bool = False - # Mapping of account user ID to list of room ID to always keep on top. - # You can copy a room's ID by right clicking on it in the room list. - # Example: {"@alice:example.org": ["!aBc@example.org", "!123:example.org"]} - bookmarks: Dict[str, List[str]] = {} - # When clicking on a room, recenter the room list on that room. click_centers: bool = False @@ -90,6 +85,13 @@ class RoomList: # in addition to focusing the current page or chat composer. escape_clears_filter: bool = True + class Bookmarks: + # Each property in this section is an account user ID, and the + # value is a list of room ID to always keep on top. + # A room's ID can be copied by right clicking on it in the room list. + + "@account:example.org": List[str] = ["!roomID:a.org", "!other:b.org"] + class Chat: # Center the chat header (room avatar, name and topic) even when sidepanes # aren't hidden (see comment for the hide_sidepanes_under setting). @@ -120,13 +122,15 @@ class Chat: mark_read_delay: float = 0.2 class Composer: - # Mapping of account user ID to alias. - # From any chat, start a message with an alias followed by a space - # to type and send as this associated account. - # The account must have permission to talk in the room. - # To ignore an alias when typing, prepend it with a space. - # Example: {"@alice:example.org": "al", "@bob:example.org": "b"} - aliases: Dict[str, str] = {} + class Aliases: + # Each property is the user ID of an account, value is the alias. + # From any chat, start a message with an alias followed by a space + # to type and send as the associated account. + # The account must have permission to talk in the room. + # To ignore an alias when typing, prepend it with a space. + + "!account:example.org": str = "u" + "!other_account:example.org": str = "oa" class Files: # Minimum width of the file name/size box for files without previews. @@ -154,7 +158,6 @@ class Chat: # reveals the hidden controls. autohide_image_controls_after: float = 2.0 - class Keys: # All keybind settings, unless their comment says otherwise, are list of # the possible shortcuts for an action, e.g. ["Ctrl+A", "Alt+Shift+A"]. @@ -242,21 +245,21 @@ class Keys: previous = ["Alt+Shift+N"] next = ["Alt+N"] - # Switch to the first room of the account number X in the list. - # This is a mapping of account number to keybind, e.g. - # {1: "Ctrl+1"} would bind Ctrl+1 to the switch to the first account. - at_index: Dict[int, str] = { - "1": f"{parent.os_ctrl()}+1", - "2": f"{parent.os_ctrl()}+2", - "3": f"{parent.os_ctrl()}+3", - "4": f"{parent.os_ctrl()}+4", - "5": f"{parent.os_ctrl()}+5", - "6": f"{parent.os_ctrl()}+6", - "7": f"{parent.os_ctrl()}+7", - "8": f"{parent.os_ctrl()}+8", - "9": f"{parent.os_ctrl()}+9", - "10": f"{parent.os_ctrl()}+0", - } + class AtIndex: + # Switch to the first room of the account number X in the list. + # Each property is a list of keybinds for the account number X. + # Numbers beyond the default ones can be added. + + 1 = [Keys.os_ctrl() + "+1"] + 2 = [Keys.os_ctrl() + "+2"] + 3 = [Keys.os_ctrl() + "+3"] + 4 = [Keys.os_ctrl() + "+4"] + 5 = [Keys.os_ctrl() + "+5"] + 6 = [Keys.os_ctrl() + "+6"] + 7 = [Keys.os_ctrl() + "+7"] + 8 = [Keys.os_ctrl() + "+8"] + 9 = [Keys.os_ctrl() + "+9"] + 10 = [Keys.os_ctrl() + "+0"] class Rooms: # Add a new room (direct chat, join or create a group). @@ -282,21 +285,21 @@ class Keys: previous_urgent = ["Alt+Shift+M"] next_urgent = ["Alt+M"] - # Switch to room number X in the current account. - # This is a mapping of room number to keybind, e.g. - # {1: "Alt+1"} would bind Alt+1 to switch to the first room. - at_index: Dict[int, str] = { - "1": f"{parent.alt_or_cmd()}+1", - "2": f"{parent.alt_or_cmd()}+2", - "3": f"{parent.alt_or_cmd()}+3", - "4": f"{parent.alt_or_cmd()}+4", - "5": f"{parent.alt_or_cmd()}+5", - "6": f"{parent.alt_or_cmd()}+6", - "7": f"{parent.alt_or_cmd()}+7", - "8": f"{parent.alt_or_cmd()}+8", - "9": f"{parent.alt_or_cmd()}+9", - "10": f"{parent.alt_or_cmd()}+0", - } + class AtIndex: + # Switch to room number X in the current account. + # Each property is a list of keybinds for the room number X: + # Numbers beyond the default ones can be added. + + 1 = [Keys.alt_or_cmd() + "+1"] + 2 = [Keys.alt_or_cmd() + "+2"] + 3 = [Keys.alt_or_cmd() + "+3"] + 4 = [Keys.alt_or_cmd() + "+4"] + 5 = [Keys.alt_or_cmd() + "+5"] + 6 = [Keys.alt_or_cmd() + "+6"] + 7 = [Keys.alt_or_cmd() + "+7"] + 8 = [Keys.alt_or_cmd() + "+8"] + 9 = [Keys.alt_or_cmd() + "+9"] + 10 = [Keys.alt_or_cmd() + "+0"] class Chat: # Keybinds specific to the current chat page. diff --git a/src/gui/MainPane/RoomList.qml b/src/gui/MainPane/RoomList.qml index 8c8cd29e..d412d29b 100644 --- a/src/gui/MainPane/RoomList.qml +++ b/src/gui/MainPane/RoomList.qml @@ -275,22 +275,22 @@ HListView { } Repeater { - model: Object.keys(window.settings.Keys.Accounts.at_index) + model: Object.keys(window.settings.Keys.Accounts.AtIndex) Item { HShortcut { - sequence: window.settings.Keys.Accounts.at_index[modelData] + sequences: window.settings.Keys.Accounts.AtIndex[modelData] onActivated: goToAccountNumber(parseInt(modelData, 10) - 1) } } } Repeater { - model: Object.keys(window.settings.Keys.Rooms.at_index) + model: Object.keys(window.settings.Keys.Rooms.AtIndex) Item { HShortcut { - sequence: window.settings.Keys.Rooms.at_index[modelData] + sequences: window.settings.Keys.Rooms.AtIndex[modelData] onActivated: showAccountRoomAtIndex(parseInt(modelData,10) - 1) } } diff --git a/src/gui/Pages/AccountSettings/Account.qml b/src/gui/Pages/AccountSettings/Account.qml index ccce8d22..2df57667 100644 --- a/src/gui/Pages/AccountSettings/Account.qml +++ b/src/gui/Pages/AccountSettings/Account.qml @@ -34,7 +34,7 @@ HFlickableColumnPage { } if (aliasFieldItem.changed) { - window.settings.Chat.Composer.aliases[userId] = + window.settings.Chat.Composer.Aliases[userId] = aliasFieldItem.text window.saveSettings() @@ -251,7 +251,7 @@ HFlickableColumnPage { HLabeledItem { id: aliasField - readonly property var aliases: window.settings.Chat.Composer.aliases + readonly property var aliases: window.settings.Chat.Composer.Aliases readonly property string currentAlias: aliases[userId] || "" readonly property bool hasWhiteSpace: /\s/.test(item.text) diff --git a/src/gui/Pages/Chat/Composer/MessageArea.qml b/src/gui/Pages/Chat/Composer/MessageArea.qml index 9d936364..0fb0aa93 100644 --- a/src/gui/Pages/Chat/Composer/MessageArea.qml +++ b/src/gui/Pages/Chat/Composer/MessageArea.qml @@ -21,7 +21,7 @@ HTextArea { readonly property var usableAliases: { const obj = {} - const aliases = window.settings.Chat.Composer.aliases + const aliases = window.settings.Chat.Composer.Aliases // Get accounts that are members of this room with permission to talk for (const [id, alias] of Object.entries(aliases)) {