diff --git a/imports/NeoChat/Page/RoomListPage.qml b/imports/NeoChat/Page/RoomListPage.qml index d87dd0b56..164043cdc 100644 --- a/imports/NeoChat/Page/RoomListPage.qml +++ b/imports/NeoChat/Page/RoomListPage.qml @@ -42,16 +42,6 @@ Kirigami.ScrollablePage { } } - - Connections { - target: SpaceHierarchyCache - function onSpaceHierarchyChanged() { - if (spaceList.activeSpaceId !== '') { - sortFilterRoomListModel.activeSpaceRooms = SpaceHierarchyCache.getRoomListForSpace(spaceList.activeSpaceId, false); - } - } - } - header: QQC2.Control { contentItem: QQC2.RoundButton { id: homeButton @@ -62,7 +52,7 @@ Kirigami.ScrollablePage { display: QQC2.AbstractButton.IconOnly onClicked: { - sortFilterRoomListModel.activeSpaceRooms = []; + sortFilterRoomListModel.activeSpaceId = ""; spaceList.activeSpaceId = ''; listView.positionViewAtIndex(0, ListView.Beginning); } @@ -82,13 +72,10 @@ Kirigami.ScrollablePage { implicitHeight: ListView.view.headerItem.implicitHeight contentItem: Kirigami.Avatar { - id: del - actions.main: Kirigami.Action { - id: enterSpaceAction onTriggered: { spaceList.activeSpaceId = id; - sortFilterRoomListModel.activeSpaceRooms = SpaceHierarchyCache.getRoomListForSpace(id, true); + sortFilterRoomListModel.activeSpaceId = id; } } diff --git a/src/main.cpp b/src/main.cpp index d9959df0e..51d396d6a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -178,7 +178,6 @@ int main(int argc, char *argv[]) Login *login = new Login(); ChatBoxHelper chatBoxHelper; UrlHelper urlHelper; - SpaceHierarchyCache spaceHierarchyCache; #ifdef HAVE_COLORSCHEME ColorSchemer colorScheme; @@ -199,7 +198,7 @@ int main(int argc, char *argv[]) qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "EmojiModel", new EmojiModel(&app)); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "CommandModel", new CommandModel(&app)); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "AccountRegistry", &Quotient::AccountRegistry::instance()); - qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "SpaceHierarchyCache", &spaceHierarchyCache); + qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "SpaceHierarchyCache", &SpaceHierarchyCache::instance()); qmlRegisterType("org.kde.neochat", 1, 0, "ActionsHandler"); qmlRegisterType("org.kde.neochat", 1, 0, "ChatBoxHelper"); qmlRegisterType("org.kde.neochat", 1, 0, "ChatDocumentHandler"); diff --git a/src/sortfilterroomlistmodel.cpp b/src/sortfilterroomlistmodel.cpp index 074cdc826..4378bd553 100644 --- a/src/sortfilterroomlistmodel.cpp +++ b/src/sortfilterroomlistmodel.cpp @@ -4,6 +4,7 @@ #include "sortfilterroomlistmodel.h" #include "roomlistmodel.h" +#include "spacehierarchycache.h" SortFilterRoomListModel::SortFilterRoomListModel(QObject *parent) : QSortFilterProxyModel(parent) @@ -81,18 +82,23 @@ bool SortFilterRoomListModel::filterAcceptsRow(int source_row, const QModelIndex && sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::JoinStateRole).toString() != "upgraded" && sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::IsSpaceRole).toBool() == false; - if (m_activeSpaceRooms.empty()) + if (m_activeSpaceId.isEmpty()) { return acceptRoom; - else - return std::find(m_activeSpaceRooms.begin(), - m_activeSpaceRooms.end(), - sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::IdRole).toString()) - != m_activeSpaceRooms.end() + } else { + const auto &rooms = SpaceHierarchyCache::instance().getRoomListForSpace(m_activeSpaceId, false); + return std::find(rooms.begin(), rooms.end(), sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::IdRole).toString()) != rooms.end() && acceptRoom; + } } -void SortFilterRoomListModel::setActiveSpaceRooms(QVector activeSpaceRooms) +QString SortFilterRoomListModel::activeSpaceId() const { - this->m_activeSpaceRooms = activeSpaceRooms; + return m_activeSpaceId; +} + +void SortFilterRoomListModel::setActiveSpaceId(const QString &spaceId) +{ + m_activeSpaceId = spaceId; + Q_EMIT activeSpaceIdChanged(); invalidate(); } diff --git a/src/sortfilterroomlistmodel.h b/src/sortfilterroomlistmodel.h index b87734cb0..8e7b84d0c 100644 --- a/src/sortfilterroomlistmodel.h +++ b/src/sortfilterroomlistmodel.h @@ -11,7 +11,7 @@ class SortFilterRoomListModel : public QSortFilterProxyModel Q_PROPERTY(RoomSortOrder roomSortOrder READ roomSortOrder WRITE setRoomSortOrder NOTIFY roomSortOrderChanged) Q_PROPERTY(QString filterText READ filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged) - Q_PROPERTY(QVector activeSpaceRooms WRITE setActiveSpaceRooms) + Q_PROPERTY(QString activeSpaceId READ activeSpaceId WRITE setActiveSpaceId NOTIFY activeSpaceIdChanged) public: enum RoomSortOrder { @@ -31,7 +31,8 @@ public: [[nodiscard]] bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; - Q_INVOKABLE void setActiveSpaceRooms(QVector activeSpaceRooms); + QString activeSpaceId() const; + void setActiveSpaceId(const QString &spaceId); protected: [[nodiscard]] bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; @@ -39,9 +40,10 @@ protected: Q_SIGNALS: void roomSortOrderChanged(); void filterTextChanged(); + void activeSpaceIdChanged(); private: RoomSortOrder m_sortOrder = Categories; QString m_filterText; - QVector m_activeSpaceRooms; + QString m_activeSpaceId; }; diff --git a/src/spacehierarchycache.cpp b/src/spacehierarchycache.cpp index d90dc1b72..c25d2e96e 100644 --- a/src/spacehierarchycache.cpp +++ b/src/spacehierarchycache.cpp @@ -66,7 +66,7 @@ void SpaceHierarchyCache::populateSpaceHierarchy(const QString &spaceId) #endif } -QVector SpaceHierarchyCache::getRoomListForSpace(const QString &spaceId, bool updateCache) +QVector &SpaceHierarchyCache::getRoomListForSpace(const QString &spaceId, bool updateCache) { if (updateCache) { populateSpaceHierarchy(spaceId); diff --git a/src/spacehierarchycache.h b/src/spacehierarchycache.h index 32299fca8..0e1e32dda 100644 --- a/src/spacehierarchycache.h +++ b/src/spacehierarchycache.h @@ -13,14 +13,20 @@ class SpaceHierarchyCache : public QObject Q_OBJECT public: - explicit SpaceHierarchyCache(QObject *parent = nullptr); + static SpaceHierarchyCache &instance() + { + static SpaceHierarchyCache _instance; + return _instance; + } - [[nodiscard]] Q_INVOKABLE QVector getRoomListForSpace(const QString &spaceId, bool updateCache); + [[nodiscard]] QVector &getRoomListForSpace(const QString &spaceId, bool updateCache); Q_SIGNALS: void spaceHierarchyChanged(); private: + explicit SpaceHierarchyCache(QObject *parent = nullptr); + QVector m_activeSpaceRooms; QHash> m_spaceHierarchy; void cacheSpaceHierarchy();