From b6773c724e3c2003f7aa78689cd0a839680df0df Mon Sep 17 00:00:00 2001 From: Maze <33424247+MRAAGH@users.noreply.github.com> Date: Thu, 15 Apr 2021 23:47:08 +0200 Subject: [PATCH] Add keys for direct room switching (#209) * Add Keys.Rooms.Direct configuration Keybinding to jump to specific room id in specific account id, or the first occurence of specific room id in any account. * Default binding was a bad idea This example binding was preventing the user from binding Ctrl+G,Ctrl+M to something else. * Use const instead of var * Use showItemAtIndex for direct room switching This is a simpler implementation that better fits in the existing codebase and doesn't really have drawbacks. * Use existing findIndex From roomList.model. Instead of reinventing it * Made example not a real room Earlier I made it point to the Mirage room * Add instructions for copying room ID After noticing that these IDs do not match Matrix room addresses, I felt it was necessary to explain this here, even if it's already explained in other parts of the configuration file. * Use .split(" ") for splitting descriptions This is a more readable implementation. * Fix shortcuts breaking on config reload Wrapping HShortcut in Loader makes it destructible. See d53978f62bab35cdc7e115c50f0571f736814582 * Cleanup showRoomByDescription method, now showById - "Room description" is a vague, it sounds like this is about the room topic too. Instead of having a function that takes a string with a certain format, take explicit arguments for the user and room ID, this way we don't need comments to explain what's going on either - Reduce indentations and {} noise to make it simpler to read * More details for direct room binds config comment Co-authored-by: miruka --- src/config/settings.py | 11 +++++++++++ src/gui/MainPane/RoomList.qml | 31 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/config/settings.py b/src/config/settings.py index 6275eceb..88e2bb4a 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -376,6 +376,17 @@ class Keys: 9 = [Keys.alt_or_cmd() + "+9"] 10 = [Keys.alt_or_cmd() + "+0"] + class Direct: + # Switch to specific rooms with keybindings. + # An unlimited number of properties can be added, where each + # property maps a room to a list of keybind. + # A room's ID can be copied by right clicking on it in the room list. + "!roomID:example.org" = [] + + # If you have multiple accounts in the same room, you can also set + # which account should be targeted as " ": + "@account:example.org !roomID:example.org" = [] + class Chat: # Keybinds specific to the current chat page. diff --git a/src/gui/MainPane/RoomList.qml b/src/gui/MainPane/RoomList.qml index 2ba665fd..905ec1a0 100644 --- a/src/gui/MainPane/RoomList.qml +++ b/src/gui/MainPane/RoomList.qml @@ -73,6 +73,27 @@ HListView { keepListCentered = true } + function showById(roomId, accountId=null) { + // If only a room ID is passed, first account with this room is used + if (accountId === null) { + const roomIndex = model.findIndex(roomId) + + roomIndex === null ? + console.warn("No account with such room ID:", roomId) : + showItemAtIndex(roomIndex) + + return + } + + if (! (accountId in accountIndice)) { + console.warn("No such account:", accountId) + return + } + + pageLoader.showRoom(accountId, roomId) + startCorrectItemSearch() + } + function showAccountRoomAtIndex(index) { const item = model.get(currentIndex === -1 ? 0 : currentIndex) @@ -284,6 +305,16 @@ HListView { } } + Instantiator { + model: Object.keys(window.settings.Keys.Rooms.Direct) + delegate: Loader { + sourceComponent: HShortcut { + sequences: window.settings.Keys.Rooms.Direct[modelData] + onActivated: showById(...modelData.split(/\s+/).reverse()) + } + } + } + Rectangle { anchors.fill: parent z: -100