From 68b00b9fc50390a38a97e5f75b0af71d7dc11d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veres=20K=C3=A1roly?= Date: Fri, 26 Dec 2025 04:11:50 +0100 Subject: [PATCH] Extract the space selection logic from setCurrentRoom and use it for setting lastRoomConfig too. If a setCurrentRoom call changed the active space at the end of its execution, the new room's ID ended up still being written to the old space's lastRoomConfig. By extracting this space selection logic into a helper function, we can now calculate this value earlier and use it as the space id when writing lastRoomConfig. --- src/app/roommanager.cpp | 97 ++++++++++++++++++++++------------------- src/app/roommanager.h | 9 ++++ 2 files changed, 60 insertions(+), 46 deletions(-) diff --git a/src/app/roommanager.cpp b/src/app/roommanager.cpp index 7d18f7eb6..0845b6a16 100644 --- a/src/app/roommanager.cpp +++ b/src/app/roommanager.cpp @@ -554,6 +554,45 @@ void RoomManager::setCurrentSpace(const QString &spaceId, bool setRoom) setCurrentRoom({}); } +QString RoomManager::findSpaceIdForCurrentRoom() const +{ + if (!m_currentRoom) { + return m_currentSpaceId; + } + if (m_currentRoom->isDirectChat()) { + const auto roomsInSpace = SpaceHierarchyCache::instance().getRoomListForSpace(m_currentSpaceId, false); + if (roomsInSpace.contains(m_currentRoom->id())) { + return m_currentSpaceId; + } + return "DM"_L1; + } + const auto &parentSpaces = SpaceHierarchyCache::instance().parentSpaces(m_currentRoom->id()); + if (parentSpaces.contains(m_currentSpaceId)) { + return m_currentSpaceId; + } + static auto config = NeoChatConfig::self(); + if (config->allRoomsInHome()) { + return {}; + } + if (const auto &parent = m_connection->room(m_currentRoom->canonicalParent())) { + for (const auto &parentParent : SpaceHierarchyCache::instance().parentSpaces(parent->id())) { + if (SpaceHierarchyCache::instance().parentSpaces(parentParent).isEmpty()) { + return parentParent; + } + } + return parent->id(); + } + for (const auto &space : parentSpaces) { + if (SpaceHierarchyCache::instance().parentSpaces(space).isEmpty()) { + return space; + } + } + if (m_currentRoom->isSpace()) { + return m_currentSpaceId; + } + return {}; +} + void RoomManager::setCurrentRoom(const QString &roomId) { if (m_currentRoom != nullptr) { @@ -571,57 +610,23 @@ void RoomManager::setCurrentRoom(const QString &roomId) } Q_EMIT currentRoomChanged(); - if (m_connection) { - if (roomId.isEmpty()) { - m_lastRoomConfig.deleteEntry(m_currentSpaceId); - } else { - // We can't have empty keys in KConfig, so name it "Home" - if (m_currentSpaceId.isEmpty()) { - m_lastRoomConfig.writeEntry(u"Home"_s, roomId); - } else { - m_lastRoomConfig.writeEntry(m_currentSpaceId, roomId); - } - } - } + if (roomId.isEmpty()) { + m_lastRoomConfig.deleteEntry(m_currentSpaceId); return; } - if (m_currentRoom->isSpace()) { - return; + + const auto spaceIdForRoom = findSpaceIdForCurrentRoom(); + // We can't have empty keys in KConfig, so name it "Home" + if (spaceIdForRoom.isEmpty()) { + m_lastRoomConfig.writeEntry(u"Home"_s, roomId); + } else { + m_lastRoomConfig.writeEntry(spaceIdForRoom, roomId); } - if (m_currentRoom->isDirectChat()) { - const auto roomsInSpace = SpaceHierarchyCache::instance().getRoomListForSpace(m_currentSpaceId, false); - if (!roomsInSpace.contains(m_currentRoom->id()) && m_currentSpaceId != "DM"_L1) { - setCurrentSpace("DM"_L1, false); - } - return; + + if (m_currentSpaceId != spaceIdForRoom) { + setCurrentSpace(spaceIdForRoom, false); } - const auto &parentSpaces = SpaceHierarchyCache::instance().parentSpaces(roomId); - if (parentSpaces.contains(m_currentSpaceId)) { - return; - } - static auto config = NeoChatConfig::self(); - if (config->allRoomsInHome()) { - setCurrentSpace({}, false); - return; - } - if (const auto &parent = m_connection->room(m_currentRoom->canonicalParent())) { - for (const auto &parentParent : SpaceHierarchyCache::instance().parentSpaces(parent->id())) { - if (SpaceHierarchyCache::instance().parentSpaces(parentParent).isEmpty()) { - setCurrentSpace(parentParent, false); - return; - } - } - setCurrentSpace(parent->id(), false); - return; - } - for (const auto &space : parentSpaces) { - if (SpaceHierarchyCache::instance().parentSpaces(space).isEmpty()) { - setCurrentSpace(space, false); - return; - } - } - setCurrentSpace({}, false); } void RoomManager::clearCurrentRoom() diff --git a/src/app/roommanager.h b/src/app/roommanager.h index f169e99e5..e8feff45d 100644 --- a/src/app/roommanager.h +++ b/src/app/roommanager.h @@ -373,6 +373,15 @@ private: void setCurrentRoom(const QString &roomId); + /** + * @brief Find the most appropriate space for the currently selected room + * + * Should be used to figure out what space to switch to after a room change. + * + * @return The Space ID that the currently set room should be displayed as part of. (or "DM" for DM and "" for Home) + */ + QString findSpaceIdForCurrentRoom() const; + // Space ID, "DM", or empty string void setCurrentSpace(const QString &spaceId, bool setRoom = true);