diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ead953ca2..cf1012170 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,19 +9,16 @@ endif() add_subdirectory(libneochat) add_subdirectory(login) +add_subdirectory(rooms) add_subdirectory(timeline) add_library(neochat STATIC controller.cpp controller.h - models/sortfilterspacelistmodel.cpp - models/sortfilterspacelistmodel.h roommanager.cpp roommanager.h models/userfiltermodel.cpp models/userfiltermodel.h - models/publicroomlistmodel.cpp - models/publicroomlistmodel.h models/spacechildrenmodel.cpp models/spacechildrenmodel.h models/spacechildsortfiltermodel.cpp @@ -32,10 +29,6 @@ add_library(neochat STATIC models/userdirectorylistmodel.h notificationsmanager.cpp notificationsmanager.h - models/sortfilterroomlistmodel.cpp - models/sortfilterroomlistmodel.h - models/roomtreemodel.cpp - models/roomtreemodel.h models/webshortcutmodel.cpp models/webshortcutmodel.h blurhash.cpp @@ -58,21 +51,15 @@ add_library(neochat STATIC models/notificationsmodel.h proxycontroller.cpp proxycontroller.h - models/sortfilterroomtreemodel.cpp - models/sortfilterroomtreemodel.h mediamanager.cpp mediamanager.h models/statekeysmodel.cpp models/statekeysmodel.h sharehandler.cpp sharehandler.h - models/roomtreeitem.cpp - models/roomtreeitem.h foreigntypes.h identityserverhelper.cpp identityserverhelper.h - enums/roomsortparameter.cpp - enums/roomsortparameter.h models/roomsortparametermodel.cpp models/roomsortparametermodel.h models/commonroomsmodel.cpp @@ -98,15 +85,7 @@ ecm_add_qml_module(neochat URI org.kde.neochat GENERATE_PLUGIN_SOURCE QML_FILES qml/Main.qml qml/AccountMenu.qml - qml/ExploreComponent.qml - qml/ExploreComponentMobile.qml - qml/RoomContextMenu.qml qml/CollapsedRoomDelegate.qml - qml/RoomDelegate.qml - qml/RoomListPage.qml - qml/SpaceListContextMenu.qml - qml/UserInfo.qml - qml/UserInfoDesktop.qml qml/RoomPage.qml qml/ExploreRoomsPage.qml qml/ManualRoomDialog.qml @@ -141,7 +120,6 @@ ecm_add_qml_module(neochat URI org.kde.neochat GENERATE_PLUGIN_SOURCE qml/TimelineView.qml qml/InvitationView.qml qml/AvatarTabButton.qml - qml/SpaceDrawer.qml qml/OsmLocationPlugin.qml qml/TextToSpeechWrapper.qml qml/FullScreenMap.qml @@ -166,7 +144,6 @@ ecm_add_qml_module(neochat URI org.kde.neochat GENERATE_PLUGIN_SOURCE qml/UserSearchPage.qml qml/ManualUserDialog.qml qml/RecommendedSpaceDialog.qml - qml/RoomTreeSection.qml qml/DelegateContextMenu.qml qml/ShareDialog.qml qml/UnlockSSSSDialog.qml @@ -188,6 +165,7 @@ ecm_add_qml_module(neochat URI org.kde.neochat GENERATE_PLUGIN_SOURCE QtQuick IMPORTS org.kde.neochat.libneochat + org.kde.neochat.rooms org.kde.neochat.timeline org.kde.neochat.settings org.kde.neochat.devtools @@ -213,15 +191,6 @@ if(WIN32) set_target_properties(neochat PROPERTIES OUTPUT_NAME "neochatlib") endif() -ecm_qt_declare_logging_category(neochat - HEADER "publicroomlist_logging.h" - IDENTIFIER "PublicRoomList" - CATEGORY_NAME "org.kde.neochat.publicroomlistmodel" - DESCRIPTION "Neochat: publicroomlistmodel" - DEFAULT_SEVERITY Info - EXPORT NEOCHAT -) - add_executable(neochat-app main.cpp ) @@ -264,8 +233,8 @@ else() target_compile_definitions(neochat PUBLIC -DHAVE_X11=0) endif() -target_include_directories(neochat PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models ${CMAKE_CURRENT_SOURCE_DIR}/enums) -target_link_libraries(neochat PRIVATE Settingsplugin Timelineplugin devtoolsplugin Loginplugin chatbarplugin) +target_include_directories(neochat PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models) +target_link_libraries(neochat PRIVATE Settingsplugin Roomsplugin Timelineplugin devtoolsplugin Loginplugin chatbarplugin) target_link_libraries(neochat PUBLIC LibNeoChat Timeline @@ -288,6 +257,7 @@ target_link_libraries(neochat PUBLIC KF6::ItemModels QuotientQt6 Login + Rooms ) if (TARGET KF6::Crash) diff --git a/src/controller.cpp b/src/controller.cpp index c327de10b..9d219afd6 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -20,11 +20,13 @@ #include #include "accountmanager.h" +#include "enums/roomsortparameter.h" #include "mediasizehelper.h" #include "models/actionsmodel.h" #include "models/messagemodel.h" #include "models/pushrulemodel.h" #include "models/roomlistmodel.h" +#include "models/roomtreemodel.h" #include "neochatconfig.h" #include "neochatconnection.h" #include "neochatroom.h" @@ -95,6 +97,7 @@ Controller::Controller(QObject *parent) MessageModel::setHiddenFilter(hiddenEventFilter); RoomListModel::setHiddenFilter(hiddenEventFilter); + RoomTreeModel::setHiddenFilter(hiddenEventFilter); MediaSizeHelper::setMaxSize(NeoChatConfig::mediaMaxWidth(), NeoChatConfig::mediaMaxHeight()); connect(NeoChatConfig::self(), &NeoChatConfig::MediaMaxWidthChanged, this, []() { @@ -104,6 +107,26 @@ Controller::Controller(QObject *parent) MediaSizeHelper::setMaxSize(NeoChatConfig::mediaMaxWidth(), NeoChatConfig::mediaMaxHeight()); }); + RoomSortParameter::setSortOrder(static_cast(NeoChatConfig::sortOrder())); + connect(NeoChatConfig::self(), &NeoChatConfig::SortOrderChanged, this, []() { + RoomSortParameter::setSortOrder(static_cast(NeoChatConfig::sortOrder())); + }); + + QList configParamList; + const auto intList = NeoChatConfig::customSortOrder(); + std::transform(intList.constBegin(), intList.constEnd(), std::back_inserter(configParamList), [](int param) { + return static_cast(param); + }); + RoomSortParameter::setCustomSortOrder(configParamList); + connect(NeoChatConfig::self(), &NeoChatConfig::CustomSortOrderChanged, this, []() { + QList configParamList; + const auto intList = NeoChatConfig::customSortOrder(); + std::transform(intList.constBegin(), intList.constEnd(), std::back_inserter(configParamList), [](int param) { + return static_cast(param); + }); + RoomSortParameter::setCustomSortOrder(configParamList); + }); + ProxyController::instance().setApplicationProxy(); #ifndef Q_OS_ANDROID diff --git a/src/libneochat/CMakeLists.txt b/src/libneochat/CMakeLists.txt index 59f44a9e9..6d82337c2 100644 --- a/src/libneochat/CMakeLists.txt +++ b/src/libneochat/CMakeLists.txt @@ -26,6 +26,8 @@ target_sources(LibNeoChat PRIVATE enums/messagetype.h enums/powerlevel.cpp enums/pushrule.h + enums/roomsortparameter.cpp + enums/roomsortorder.h events/imagepackevent.cpp events/pollevent.cpp models/actionsmodel.cpp diff --git a/src/libneochat/enums/roomsortorder.h b/src/libneochat/enums/roomsortorder.h new file mode 100644 index 000000000..c10991546 --- /dev/null +++ b/src/libneochat/enums/roomsortorder.h @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025 James Graham +// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + +#pragma once + +#include +#include + +/** + * @class RoomSortOrder + * + * This class is designed to define the RoomSortOrder enumeration. + */ +class RoomSortOrder : public QObject +{ + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + +public: + /** + * @brief The types of messages that can be shown. + */ + enum Order { + Alphabetical = 0, /**< The room should be sorted alphabetically. */ + Activity, /**< The room should be sorted by important activity. */ + LastMessage, /**< The room should be sorted by last message in the room. */ + Custom, /**< Use a custom sort order. */ + }; + Q_ENUM(Order); +}; diff --git a/src/enums/roomsortparameter.cpp b/src/libneochat/enums/roomsortparameter.cpp similarity index 82% rename from src/enums/roomsortparameter.cpp rename to src/libneochat/enums/roomsortparameter.cpp index 609c02e23..a9a2f1561 100644 --- a/src/enums/roomsortparameter.cpp +++ b/src/libneochat/enums/roomsortparameter.cpp @@ -5,7 +5,7 @@ #include -#include "neochatconfig.h" +#include "enums/roomsortorder.h" #include "neochatroom.h" namespace @@ -49,6 +49,9 @@ static const QList lastMessageSortPriorities = { }; } +RoomSortOrder::Order RoomSortParameter::m_sortOrder = RoomSortOrder::Activity; +QList RoomSortParameter::m_customSortOrder = activitySortPriorities; + QList RoomSortParameter::allParameterList() { return allSortPriorities; @@ -57,21 +60,18 @@ QList RoomSortParameter::allParameterList() QList RoomSortParameter::currentParameterList() { QList configParamList; - switch (static_cast(NeoChatConfig::sortOrder())) { - case NeoChatConfig::EnumSortOrder::Activity: + switch (m_sortOrder) { + case RoomSortOrder::Activity: configParamList = activitySortPriorities; break; - case NeoChatConfig::EnumSortOrder::Alphabetical: + case RoomSortOrder::Alphabetical: configParamList = alphabeticalSortPriorities; break; - case NeoChatConfig::EnumSortOrder::LastMessage: + case RoomSortOrder::LastMessage: configParamList = lastMessageSortPriorities; break; - case NeoChatConfig::EnumSortOrder::Custom: { - const auto intList = NeoChatConfig::customSortOrder(); - std::transform(intList.constBegin(), intList.constEnd(), std::back_inserter(configParamList), [](int param) { - return static_cast(param); - }); + case RoomSortOrder::Custom: { + configParamList = m_customSortOrder; break; } default: @@ -84,17 +84,6 @@ QList RoomSortParameter::currentParameterList() return configParamList; } -void RoomSortParameter::saveNewParameterList(const QList &newList) -{ - QList intList; - std::transform(newList.constBegin(), newList.constEnd(), std::back_inserter(intList), [](Parameter param) { - return static_cast(param); - }); - NeoChatConfig::setCustomSortOrder(intList); - NeoChatConfig::setSortOrder(NeoChatConfig::EnumSortOrder::Custom); - NeoChatConfig::self()->save(); -} - int RoomSortParameter::compareParameter(Parameter parameter, NeoChatRoom *leftRoom, NeoChatRoom *rightRoom) { switch (parameter) { @@ -160,3 +149,13 @@ int RoomSortParameter::compareParameter(NeoChatRo { return typeCompare(leftRoom->lastActiveTime(), rightRoom->lastActiveTime()); } + +void RoomSortParameter::setSortOrder(RoomSortOrder::Order order) +{ + RoomSortParameter::m_sortOrder = order; +} + +void RoomSortParameter::setCustomSortOrder(QList order) +{ + RoomSortParameter::m_customSortOrder = order; +} diff --git a/src/enums/roomsortparameter.h b/src/libneochat/enums/roomsortparameter.h similarity index 95% rename from src/enums/roomsortparameter.h rename to src/libneochat/enums/roomsortparameter.h index b60ab75fc..0e1e07c87 100644 --- a/src/enums/roomsortparameter.h +++ b/src/libneochat/enums/roomsortparameter.h @@ -3,6 +3,7 @@ #pragma once +#include "roomsortorder.h" #include #include @@ -104,11 +105,6 @@ public: */ static QList currentParameterList(); - /** - * @brief Save the give Parameter sort order list as the custom sort order. - */ - static void saveNewParameterList(const QList &newList); - /** * @brief Compare the given parameter of the two given rooms. * @@ -118,7 +114,13 @@ public: */ static int compareParameter(Parameter parameter, NeoChatRoom *leftRoom, NeoChatRoom *rightRoom); + static void setSortOrder(RoomSortOrder::Order order); + static void setCustomSortOrder(QList order); + private: + static RoomSortOrder::Order m_sortOrder; + static QList m_customSortOrder; + template static int compareParameter(NeoChatRoom *, NeoChatRoom *) { diff --git a/src/main.cpp b/src/main.cpp index 3673082ec..a0b32216f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -240,6 +240,7 @@ int main(int argc, char *argv[]) Registration::instance().setAccountManager(accountManager.get()); Q_IMPORT_QML_PLUGIN(org_kde_neochat_settingsPlugin) + Q_IMPORT_QML_PLUGIN(org_kde_neochat_roomsPlugin) Q_IMPORT_QML_PLUGIN(org_kde_neochat_timelinePlugin) Q_IMPORT_QML_PLUGIN(org_kde_neochat_devtoolsPlugin) Q_IMPORT_QML_PLUGIN(org_kde_neochat_loginPlugin) diff --git a/src/models/roomsortparametermodel.cpp b/src/models/roomsortparametermodel.cpp index c78ae71c9..3e0ba5b27 100644 --- a/src/models/roomsortparametermodel.cpp +++ b/src/models/roomsortparametermodel.cpp @@ -3,7 +3,7 @@ #include "roomsortparametermodel.h" -#include "roomsortparameter.h" +#include "enums/roomsortparameter.h" using namespace Qt::StringLiterals; @@ -19,6 +19,15 @@ RoomSortParameterModel::RoomSortParameterModel(QList RoomSortParameterModel::currentParameterList() const +{ + QList intList; + std::transform(m_currentParameters.constBegin(), m_currentParameters.constEnd(), std::back_inserter(intList), [](RoomSortParameter::Parameter param) { + return static_cast(param); + }); + return intList; +} + QVariant RoomSortParameterModel::data(const QModelIndex &index, int role) const { if (index.row() < 0 || index.row() >= rowCount()) { @@ -93,11 +102,6 @@ void RoomSortParameterModel::moveRowDown(int row) endMoveRows(); } -void RoomSortParameterModel::saveParameterList() -{ - RoomSortParameter::saveNewParameterList(m_currentParameters); -} - RoomSortParameterModel *RoomSortParameterModel::allParameterModel() const { return new RoomSortParameterModel(RoomSortParameter::allParameterList()); diff --git a/src/models/roomsortparametermodel.h b/src/models/roomsortparametermodel.h index 33a6c9e4f..7ef85355c 100644 --- a/src/models/roomsortparametermodel.h +++ b/src/models/roomsortparametermodel.h @@ -7,6 +7,7 @@ #include #include +#include #include #include "enums/roomsortparameter.h" @@ -21,6 +22,11 @@ class RoomSortParameterModel : public QAbstractListModel Q_OBJECT QML_ELEMENT + /** + * @brief The current list of sorting paramters as an int list. + */ + Q_PROPERTY(QList currentParameterList READ currentParameterList NOTIFY currentParameterListChanged) + public: /** * @brief Defines the model roles. @@ -34,6 +40,8 @@ public: explicit RoomSortParameterModel(QObject *parent = nullptr); explicit RoomSortParameterModel(QList parameters, QObject *parent = nullptr); + QList currentParameterList() const; + /** * @brief Get the given role value at the given index. * @@ -77,16 +85,14 @@ public: */ Q_INVOKABLE void moveRowDown(int row); - /** - * @brief Save the current model parameters as a custom sort order. - */ - Q_INVOKABLE void saveParameterList(); - /** * @brief Return a RoomSortParameterModel with all available parameters. */ Q_INVOKABLE RoomSortParameterModel *allParameterModel() const; +Q_SIGNALS: + void currentParameterListChanged(); + private: QList m_currentParameters; }; diff --git a/src/neochatconfig.kcfg b/src/neochatconfig.kcfg index a2727812e..fbe76d769 100644 --- a/src/neochatconfig.kcfg +++ b/src/neochatconfig.kcfg @@ -134,21 +134,8 @@ - - - - - - - - - - - - - + - Activity diff --git a/src/roommanager.cpp b/src/roommanager.cpp index d4e35fa82..bcf4bf2d7 100644 --- a/src/roommanager.cpp +++ b/src/roommanager.cpp @@ -13,6 +13,7 @@ #include "neochatconfig.h" #include "neochatconnection.h" #include "neochatroom.h" +#include "rooms/models/sortfilterroomtreemodel.h" #include "spacehierarchycache.h" #include "urlhelper.h" @@ -59,6 +60,7 @@ RoomManager::RoomManager(QObject *parent) connect(this, &RoomManager::currentRoomChanged, this, [this]() { m_timelineModel->setRoom(m_currentRoom); + m_sortFilterRoomTreeModel->setCurrentRoom(m_currentRoom); m_userListModel->setRoom(m_currentRoom); }); @@ -117,6 +119,20 @@ RoomManager::RoomManager(QObject *parent) Q_EMIT m_timelineModel->threadsEnabledChanged(); } }); + connect(NeoChatConfig::self(), &NeoChatConfig::SortOrderChanged, this, [this]() { + m_sortFilterRoomTreeModel->invalidate(); + }); + connect(NeoChatConfig::self(), &NeoChatConfig::CollapsedChanged, this, [this]() { + m_sortFilterRoomTreeModel->invalidate(); + }); + SortFilterRoomTreeModel::setShowAllRoomsInHome(NeoChatConfig::allRoomsInHome()); + connect(NeoChatConfig::self(), &NeoChatConfig::AllRoomsInHomeChanged, this, [this]() { + SortFilterRoomTreeModel::setShowAllRoomsInHome(NeoChatConfig::allRoomsInHome()); + m_sortFilterRoomTreeModel->invalidate(); + if (NeoChatConfig::allRoomsInHome()) { + resetState(); + } + }); } RoomManager::~RoomManager() diff --git a/src/rooms/CMakeLists.txt b/src/rooms/CMakeLists.txt new file mode 100644 index 000000000..009073433 --- /dev/null +++ b/src/rooms/CMakeLists.txt @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2024 James Graham +# SPDX-License-Identifier: BSD-2-Clause + +qt_add_library(Rooms STATIC) +ecm_add_qml_module(Rooms GENERATE_PLUGIN_SOURCE + URI org.kde.neochat.rooms + OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/org/kde/neochat/rooms + QML_FILES + RoomListPage.qml + SpaceDrawer.qml + RoomDelegate.qml + RoomTreeSection.qml + ExploreComponent.qml + ExploreComponentMobile.qml + UserInfo.qml + UserInfoDesktop.qml + RoomContextMenu.qml + SpaceListContextMenu.qml + SOURCES + models/publicroomlistmodel.cpp + models/roomtreeitem.cpp + models/roomtreemodel.cpp + models/sortfilterroomlistmodel.cpp + models/sortfilterroomtreemodel.cpp + models/sortfilterspacelistmodel.cpp +) + +ecm_qt_declare_logging_category(Rooms + HEADER "publicroomlist_logging.h" + IDENTIFIER "PublicRoomList" + CATEGORY_NAME "org.kde.neochat.publicroomlistmodel" + DESCRIPTION "Neochat: publicroomlistmodel" + DEFAULT_SEVERITY Info + EXPORT NEOCHAT +) + +target_include_directories(Rooms PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models) +target_link_libraries(Rooms PRIVATE + Qt::Core + Qt::Quick + KF6::Kirigami + LibNeoChat +) diff --git a/src/qml/ExploreComponent.qml b/src/rooms/ExploreComponent.qml similarity index 100% rename from src/qml/ExploreComponent.qml rename to src/rooms/ExploreComponent.qml diff --git a/src/qml/ExploreComponentMobile.qml b/src/rooms/ExploreComponentMobile.qml similarity index 100% rename from src/qml/ExploreComponentMobile.qml rename to src/rooms/ExploreComponentMobile.qml diff --git a/src/qml/RoomContextMenu.qml b/src/rooms/RoomContextMenu.qml similarity index 100% rename from src/qml/RoomContextMenu.qml rename to src/rooms/RoomContextMenu.qml diff --git a/src/qml/RoomDelegate.qml b/src/rooms/RoomDelegate.qml similarity index 100% rename from src/qml/RoomDelegate.qml rename to src/rooms/RoomDelegate.qml diff --git a/src/qml/RoomListPage.qml b/src/rooms/RoomListPage.qml similarity index 100% rename from src/qml/RoomListPage.qml rename to src/rooms/RoomListPage.qml diff --git a/src/qml/RoomTreeSection.qml b/src/rooms/RoomTreeSection.qml similarity index 100% rename from src/qml/RoomTreeSection.qml rename to src/rooms/RoomTreeSection.qml diff --git a/src/qml/SpaceDrawer.qml b/src/rooms/SpaceDrawer.qml similarity index 100% rename from src/qml/SpaceDrawer.qml rename to src/rooms/SpaceDrawer.qml diff --git a/src/qml/SpaceListContextMenu.qml b/src/rooms/SpaceListContextMenu.qml similarity index 100% rename from src/qml/SpaceListContextMenu.qml rename to src/rooms/SpaceListContextMenu.qml diff --git a/src/qml/UserInfo.qml b/src/rooms/UserInfo.qml similarity index 100% rename from src/qml/UserInfo.qml rename to src/rooms/UserInfo.qml diff --git a/src/qml/UserInfoDesktop.qml b/src/rooms/UserInfoDesktop.qml similarity index 100% rename from src/qml/UserInfoDesktop.qml rename to src/rooms/UserInfoDesktop.qml diff --git a/src/models/publicroomlistmodel.cpp b/src/rooms/models/publicroomlistmodel.cpp similarity index 100% rename from src/models/publicroomlistmodel.cpp rename to src/rooms/models/publicroomlistmodel.cpp diff --git a/src/models/publicroomlistmodel.h b/src/rooms/models/publicroomlistmodel.h similarity index 100% rename from src/models/publicroomlistmodel.h rename to src/rooms/models/publicroomlistmodel.h diff --git a/src/models/roomtreeitem.cpp b/src/rooms/models/roomtreeitem.cpp similarity index 100% rename from src/models/roomtreeitem.cpp rename to src/rooms/models/roomtreeitem.cpp diff --git a/src/models/roomtreeitem.h b/src/rooms/models/roomtreeitem.h similarity index 100% rename from src/models/roomtreeitem.h rename to src/rooms/models/roomtreeitem.h diff --git a/src/models/roomtreemodel.cpp b/src/rooms/models/roomtreemodel.cpp similarity index 93% rename from src/models/roomtreemodel.cpp rename to src/rooms/models/roomtreemodel.cpp index 075ed56f1..d9640f405 100644 --- a/src/models/roomtreemodel.cpp +++ b/src/rooms/models/roomtreemodel.cpp @@ -8,12 +8,15 @@ #include "enums/neochatroomtype.h" #include "eventhandler.h" -#include "neochatconfig.h" #include "neochatconnection.h" #include "spacehierarchycache.h" using namespace Quotient; +std::function RoomTreeModel::m_hiddenFilter = [](const Quotient::RoomEvent *) -> bool { + return false; +}; + RoomTreeModel::RoomTreeModel(QObject *parent) : QAbstractItemModel(parent) , m_rootItem(new RoomTreeItem(nullptr)) @@ -356,22 +359,7 @@ QVariant RoomTreeModel::data(const QModelIndex &index, int role) const } return i18nc("@info:label", "%1 invited you", room->member(room->invitingUserId()).displayName()); } - const auto lastEvent = room->lastEvent([](const RoomEvent *event) -> bool { - if (event->isStateEvent() && !NeoChatConfig::showStateEvent()) { - return true; - } - if (auto roomMemberEvent = eventCast(event)) { - if ((roomMemberEvent->isJoin() || roomMemberEvent->isLeave()) && !NeoChatConfig::showLeaveJoinEvent()) { - return true; - } else if (roomMemberEvent->isRename() && !roomMemberEvent->isJoin() && !roomMemberEvent->isLeave() && !NeoChatConfig::showRename()) { - return true; - } else if (roomMemberEvent->isAvatarUpdate() && !roomMemberEvent->isJoin() && !roomMemberEvent->isLeave() - && !NeoChatConfig::showAvatarUpdate()) { - return true; - } - } - return false; - }); + const auto lastEvent = room->lastEvent(m_hiddenFilter); if (lastEvent == nullptr || room->lastEventIsSpoiler()) { return QString(); } @@ -432,4 +420,9 @@ QModelIndex RoomTreeModel::indexForRoom(NeoChatRoom *room) const return {}; } +void RoomTreeModel::setHiddenFilter(std::function hiddenFilter) +{ + RoomTreeModel::m_hiddenFilter = hiddenFilter; +} + #include "moc_roomtreemodel.cpp" diff --git a/src/models/roomtreemodel.h b/src/rooms/models/roomtreemodel.h similarity index 94% rename from src/models/roomtreemodel.h rename to src/rooms/models/roomtreemodel.h index 0644db11e..5f8e07f78 100644 --- a/src/models/roomtreemodel.h +++ b/src/rooms/models/roomtreemodel.h @@ -6,7 +6,6 @@ #include #include -#include "enums/neochatroomtype.h" #include "roomtreeitem.h" namespace Quotient @@ -77,6 +76,8 @@ public: Q_INVOKABLE QModelIndex indexForRoom(NeoChatRoom *room) const; + static void setHiddenFilter(std::function hiddenFilter); + Q_SIGNALS: void connectionChanged(); @@ -94,4 +95,6 @@ private: void moveRoom(Quotient::Room *room); void refreshRoomRoles(NeoChatRoom *room, const QList &roles = {}); + + static std::function m_hiddenFilter; }; diff --git a/src/models/sortfilterroomlistmodel.cpp b/src/rooms/models/sortfilterroomlistmodel.cpp similarity index 100% rename from src/models/sortfilterroomlistmodel.cpp rename to src/rooms/models/sortfilterroomlistmodel.cpp diff --git a/src/models/sortfilterroomlistmodel.h b/src/rooms/models/sortfilterroomlistmodel.h similarity index 100% rename from src/models/sortfilterroomlistmodel.h rename to src/rooms/models/sortfilterroomlistmodel.h diff --git a/src/models/sortfilterroomtreemodel.cpp b/src/rooms/models/sortfilterroomtreemodel.cpp similarity index 76% rename from src/models/sortfilterroomtreemodel.cpp rename to src/rooms/models/sortfilterroomtreemodel.cpp index 9abb33858..dedd4cf30 100644 --- a/src/models/sortfilterroomtreemodel.cpp +++ b/src/rooms/models/sortfilterroomtreemodel.cpp @@ -6,25 +6,19 @@ #include "enums/neochatroomtype.h" #include "enums/roomsortparameter.h" -#include "neochatconfig.h" +#include "models/roomtreemodel.h" #include "neochatconnection.h" #include "neochatroom.h" -#include "roommanager.h" -#include "roomtreemodel.h" #include "spacehierarchycache.h" +bool SortFilterRoomTreeModel::m_showAllRoomsInHome = false; + SortFilterRoomTreeModel::SortFilterRoomTreeModel(RoomTreeModel *sourceModel, QObject *parent) : QSortFilterProxyModel(parent) { Q_ASSERT(sourceModel); setSourceModel(sourceModel); - setRoomSortOrder(static_cast(NeoChatConfig::sortOrder())); - connect(NeoChatConfig::self(), &NeoChatConfig::SortOrderChanged, this, [this]() { - setRoomSortOrder(static_cast(NeoChatConfig::sortOrder())); - invalidateFilter(); - }); - setRecursiveFilteringEnabled(true); sort(0); connect(this, &SortFilterRoomTreeModel::filterTextChanged, this, &SortFilterRoomTreeModel::invalidateFilter); @@ -33,39 +27,8 @@ SortFilterRoomTreeModel::SortFilterRoomTreeModel(RoomTreeModel *sourceModel, QOb connect(this->sourceModel(), &QAbstractItemModel::rowsInserted, this, &SortFilterRoomTreeModel::invalidateFilter); connect(this->sourceModel(), &QAbstractItemModel::rowsRemoved, this, &SortFilterRoomTreeModel::invalidateFilter); }); - - connect(NeoChatConfig::self(), &NeoChatConfig::CollapsedChanged, this, &SortFilterRoomTreeModel::invalidateFilter); - connect(NeoChatConfig::self(), &NeoChatConfig::AllRoomsInHomeChanged, this, [this]() { - invalidateFilter(); - if (NeoChatConfig::self()->allRoomsInHome()) { - RoomManager::instance().resetState(); - } - }); } -void SortFilterRoomTreeModel::setRoomSortOrder(SortFilterRoomTreeModel::RoomSortOrder sortOrder) -{ - m_sortOrder = sortOrder; - invalidate(); -} - -static const QVector alphabeticalSortPriorities{ - // Does exactly what it says on the tin. - RoomSortParameter::AlphabeticalAscending, -}; - -static const QVector activitySortPriorities{ - RoomSortParameter::HasHighlight, - RoomSortParameter::MostHighlights, - RoomSortParameter::HasUnread, - RoomSortParameter::MostUnread, - RoomSortParameter::LastActive, -}; - -static const QVector lastMessageSortPriorities{ - RoomSortParameter::LastActive, -}; - bool SortFilterRoomTreeModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { // Don't sort the top level categories. @@ -141,8 +104,7 @@ bool SortFilterRoomTreeModel::filterAcceptsRow(int source_row, const QModelIndex return false; } - static auto config = NeoChatConfig::self(); - if (config->allRoomsInHome() && RoomManager::instance().currentSpace().isEmpty()) { + if (m_showAllRoomsInHome && m_activeSpaceId.isEmpty()) { return acceptRoom; } @@ -169,6 +131,11 @@ void SortFilterRoomTreeModel::setActiveSpaceId(const QString &spaceId) invalidate(); } +void SortFilterRoomTreeModel::setCurrentRoom(NeoChatRoom *room) +{ + m_currentRoom = room; +} + SortFilterRoomTreeModel::Mode SortFilterRoomTreeModel::mode() const { return m_mode; @@ -192,7 +159,12 @@ QModelIndex SortFilterRoomTreeModel::currentRoomIndex() const return {}; } - return mapFromSource(roomModel->indexForRoom(RoomManager::instance().currentRoom())); + return mapFromSource(roomModel->indexForRoom(m_currentRoom)); +} + +void SortFilterRoomTreeModel::setShowAllRoomsInHome(bool enabled) +{ + SortFilterRoomTreeModel::m_showAllRoomsInHome = enabled; } #include "moc_sortfilterroomtreemodel.cpp" diff --git a/src/models/sortfilterroomtreemodel.h b/src/rooms/models/sortfilterroomtreemodel.h similarity index 91% rename from src/models/sortfilterroomtreemodel.h rename to src/rooms/models/sortfilterroomtreemodel.h index eaac032dd..9da8a97d2 100644 --- a/src/models/sortfilterroomtreemodel.h +++ b/src/rooms/models/sortfilterroomtreemodel.h @@ -4,6 +4,7 @@ #pragma once +#include "neochatroom.h" #include #include @@ -66,19 +67,24 @@ public: explicit SortFilterRoomTreeModel(RoomTreeModel *sourceModel, QObject *parent = nullptr); - void setRoomSortOrder(RoomSortOrder sortOrder); - void setFilterText(const QString &text); [[nodiscard]] QString filterText() const; QString activeSpaceId() const; void setActiveSpaceId(const QString &spaceId); + /** + * @brief Set the current active room. + */ + void setCurrentRoom(NeoChatRoom *room); + Mode mode() const; void setMode(Mode mode); Q_INVOKABLE QModelIndex currentRoomIndex() const; + static void setShowAllRoomsInHome(bool enabled); + protected: /** * @brief Returns true if the value of source_left is less than source_right. @@ -100,8 +106,11 @@ Q_SIGNALS: void modeChanged(); private: - RoomSortOrder m_sortOrder = Activity; Mode m_mode = All; QString m_filterText; QString m_activeSpaceId; + + QPointer m_currentRoom; + + static bool m_showAllRoomsInHome; }; diff --git a/src/models/sortfilterspacelistmodel.cpp b/src/rooms/models/sortfilterspacelistmodel.cpp similarity index 100% rename from src/models/sortfilterspacelistmodel.cpp rename to src/rooms/models/sortfilterspacelistmodel.cpp diff --git a/src/models/sortfilterspacelistmodel.h b/src/rooms/models/sortfilterspacelistmodel.h similarity index 100% rename from src/models/sortfilterspacelistmodel.h rename to src/rooms/models/sortfilterspacelistmodel.h diff --git a/src/runner.cpp b/src/runner.cpp index 67479533a..eb8d3af51 100644 --- a/src/runner.cpp +++ b/src/runner.cpp @@ -7,8 +7,8 @@ #include "controller.h" #include "models/roomlistmodel.h" +#include "models/sortfilterroomlistmodel.h" #include "roommanager.h" -#include "sortfilterroomlistmodel.h" #include "windowcontroller.h" RemoteImage Runner::serializeImage(const QImage &image) diff --git a/src/settings/RoomSortParameterDialog.qml b/src/settings/RoomSortParameterDialog.qml index f7200c9e5..39cb34112 100644 --- a/src/settings/RoomSortParameterDialog.qml +++ b/src/settings/RoomSortParameterDialog.qml @@ -25,7 +25,11 @@ Kirigami.Dialog { footer.background.children[0].visible = true } - onAccepted: roomSortParameterModel.saveParameterList() + onAccepted: { + NeoChatConfig.customSortOrder = roomSortParameterModel.currentParameterList; + NeoChatConfig.sortOrder = RoomSortOrder.Custom; + NeoChatConfig.save() + } contentItem: QQC2.ScrollView { clip: true