diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8ab37751a..ead953ca2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,14 +14,10 @@ add_subdirectory(timeline) add_library(neochat STATIC controller.cpp controller.h - models/roomlistmodel.cpp - models/roomlistmodel.h models/sortfilterspacelistmodel.cpp models/sortfilterspacelistmodel.h roommanager.cpp roommanager.h - models/userlistmodel.cpp - models/userlistmodel.h models/userfiltermodel.cpp models/userfiltermodel.h models/publicroomlistmodel.cpp @@ -40,8 +36,6 @@ add_library(neochat STATIC models/sortfilterroomlistmodel.h models/roomtreemodel.cpp models/roomtreemodel.h - chatdocumenthandler.cpp - chatdocumenthandler.h models/webshortcutmodel.cpp models/webshortcutmodel.h blurhash.cpp @@ -50,10 +44,6 @@ add_library(neochat STATIC blurhashimageprovider.h windowcontroller.cpp windowcontroller.h - models/completionmodel.cpp - models/completionmodel.h - models/completionproxymodel.cpp - models/completionproxymodel.h models/serverlistmodel.cpp models/serverlistmodel.h models/statemodel.cpp @@ -68,7 +58,6 @@ add_library(neochat STATIC models/notificationsmodel.h proxycontroller.cpp proxycontroller.h - enums/neochatroomtype.h models/sortfilterroomtreemodel.cpp models/sortfilterroomtreemodel.h mediamanager.cpp @@ -233,13 +222,6 @@ ecm_qt_declare_logging_category(neochat EXPORT NEOCHAT ) -ecm_qt_declare_logging_category(neochat - HEADER "chatdocumenthandler_logging.h" - IDENTIFIER "ChatDocumentHandling" - CATEGORY_NAME "org.kde.neochat.chatdocumenthandler" - DEFAULT_SEVERITY Info -) - add_executable(neochat-app main.cpp ) diff --git a/src/chatbar/CompletionMenu.qml b/src/chatbar/CompletionMenu.qml index 88dac3db3..3588ee939 100644 --- a/src/chatbar/CompletionMenu.qml +++ b/src/chatbar/CompletionMenu.qml @@ -27,6 +27,7 @@ QQC2.Popup { Component.onCompleted: { chatDocumentHandler.completionModel.roomListModel = RoomManager.roomListModel; + chatDocumentHandler.completionModel.userListModel = RoomManager.userListModel; } function incrementIndex() { diff --git a/src/controller.cpp b/src/controller.cpp index 4cf46a26c..c327de10b 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -19,11 +19,12 @@ #include #include -#include "mediasizehelper.h" #include "accountmanager.h" +#include "mediasizehelper.h" #include "models/actionsmodel.h" #include "models/messagemodel.h" #include "models/pushrulemodel.h" +#include "models/roomlistmodel.h" #include "neochatconfig.h" #include "neochatconnection.h" #include "neochatroom.h" @@ -50,6 +51,22 @@ using namespace Quotient; +static std::function hiddenEventFilter = [](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; +}; + Controller::Controller(QObject *parent) : QObject(parent) { @@ -76,21 +93,8 @@ Controller::Controller(QObject *parent) ActionsModel::setAllowQuickEdit(NeoChatConfig::allowQuickEdit()); }); - MessageModel::setHiddenFilter([](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; - }); + MessageModel::setHiddenFilter(hiddenEventFilter); + RoomListModel::setHiddenFilter(hiddenEventFilter); MediaSizeHelper::setMaxSize(NeoChatConfig::mediaMaxWidth(), NeoChatConfig::mediaMaxHeight()); connect(NeoChatConfig::self(), &NeoChatConfig::MediaMaxWidthChanged, this, []() { diff --git a/src/libneochat/CMakeLists.txt b/src/libneochat/CMakeLists.txt index 98185142b..59f44a9e9 100644 --- a/src/libneochat/CMakeLists.txt +++ b/src/libneochat/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources(LibNeoChat PRIVATE neochatroommember.cpp accountmanager.cpp chatbarcache.cpp + chatdocumenthandler.cpp clipboard.cpp delegatesizehelper.cpp emojitones.cpp @@ -28,12 +29,16 @@ target_sources(LibNeoChat PRIVATE events/imagepackevent.cpp events/pollevent.cpp models/actionsmodel.cpp + models/completionmodel.cpp + models/completionproxymodel.cpp models/customemojimodel.cpp models/emojimodel.cpp models/imagepacksmodel.cpp models/livelocationsmodel.cpp models/locationsmodel.cpp + models/roomlistmodel.cpp models/stickermodel.cpp + models/userlistmodel.cpp ) ecm_add_qml_module(LibNeoChat GENERATE_PLUGIN_SOURCE @@ -48,16 +53,25 @@ ecm_qt_declare_logging_category(LibNeoChat DEFAULT_SEVERITY Info ) +ecm_qt_declare_logging_category(LibNeoChat + HEADER "chatdocumenthandler_logging.h" + IDENTIFIER "ChatDocumentHandling" + CATEGORY_NAME "org.kde.neochat.chatdocumenthandler" + DEFAULT_SEVERITY Info +) + generate_export_header(LibNeoChat BASE_NAME LibNeoChat) target_include_directories(LibNeoChat PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/enums ${CMAKE_CURRENT_SOURCE_DIR}/events ${CMAKE_CURRENT_SOURCE_DIR}/models) target_link_libraries(LibNeoChat PUBLIC Qt::Core Qt::Multimedia Qt::Quick + Qt::QuickControls2 KF6::ConfigCore KF6::CoreAddons KF6::I18n KF6::Kirigami + KF6::SonnetCore QuotientQt6 cmark::cmark QCoro::Core diff --git a/src/chatdocumenthandler.cpp b/src/libneochat/chatdocumenthandler.cpp similarity index 100% rename from src/chatdocumenthandler.cpp rename to src/libneochat/chatdocumenthandler.cpp diff --git a/src/chatdocumenthandler.h b/src/libneochat/chatdocumenthandler.h similarity index 100% rename from src/chatdocumenthandler.h rename to src/libneochat/chatdocumenthandler.h diff --git a/src/enums/neochatroomtype.h b/src/libneochat/enums/neochatroomtype.h similarity index 100% rename from src/enums/neochatroomtype.h rename to src/libneochat/enums/neochatroomtype.h diff --git a/src/models/completionmodel.cpp b/src/libneochat/models/completionmodel.cpp similarity index 95% rename from src/models/completionmodel.cpp rename to src/libneochat/models/completionmodel.cpp index c515e8373..5be52a616 100644 --- a/src/models/completionmodel.cpp +++ b/src/libneochat/models/completionmodel.cpp @@ -9,13 +9,11 @@ #include "models/customemojimodel.h" #include "models/emojimodel.h" #include "neochatroom.h" -#include "roommanager.h" #include "userlistmodel.h" CompletionModel::CompletionModel(QObject *parent) : QAbstractListModel(parent) , m_filterModel(new CompletionProxyModel()) - , m_userListModel(RoomManager::instance().userListModel()) , m_emojiModel(new QConcatenateTablesProxyModel(this)) { connect(this, &CompletionModel::textChanged, this, &CompletionModel::updateCompletion); @@ -192,4 +190,19 @@ void CompletionModel::setRoomListModel(RoomListModel *roomListModel) Q_EMIT roomListModelChanged(); } +UserListModel *CompletionModel::userListModel() const +{ + return m_userListModel; +} + +void CompletionModel::setUserListModel(UserListModel *userListModel) +{ + if (userListModel == m_userListModel) { + return; + } + + m_userListModel = userListModel; + Q_EMIT userListModelChanged(); +} + #include "moc_completionmodel.cpp" diff --git a/src/models/completionmodel.h b/src/libneochat/models/completionmodel.h similarity index 91% rename from src/models/completionmodel.h rename to src/libneochat/models/completionmodel.h index 6f52f1c30..32092330f 100644 --- a/src/models/completionmodel.h +++ b/src/libneochat/models/completionmodel.h @@ -49,6 +49,11 @@ class CompletionModel : public QAbstractListModel */ Q_PROPERTY(RoomListModel *roomListModel READ roomListModel WRITE setRoomListModel NOTIFY roomListModelChanged) + /** + * @brief The UserListModel to be used for room completions. + */ + Q_PROPERTY(UserListModel *userListModel READ userListModel WRITE setUserListModel NOTIFY userListModelChanged) + public: /** * @brief Defines the different types of completion available. @@ -105,6 +110,9 @@ public: RoomListModel *roomListModel() const; void setRoomListModel(RoomListModel *roomListModel); + UserListModel *userListModel() const; + void setUserListModel(UserListModel *userListModel); + AutoCompletionType autoCompletionType() const; void setAutoCompletionType(AutoCompletionType autoCompletionType); @@ -113,6 +121,7 @@ Q_SIGNALS: void roomChanged(); void autoCompletionTypeChanged(); void roomListModelChanged(); + void userListModelChanged(); private: QString m_text; diff --git a/src/models/completionproxymodel.cpp b/src/libneochat/models/completionproxymodel.cpp similarity index 100% rename from src/models/completionproxymodel.cpp rename to src/libneochat/models/completionproxymodel.cpp diff --git a/src/models/completionproxymodel.h b/src/libneochat/models/completionproxymodel.h similarity index 100% rename from src/models/completionproxymodel.h rename to src/libneochat/models/completionproxymodel.h diff --git a/src/models/roomlistmodel.cpp b/src/libneochat/models/roomlistmodel.cpp similarity index 90% rename from src/models/roomlistmodel.cpp rename to src/libneochat/models/roomlistmodel.cpp index 9acf9f34b..25e1c9c78 100644 --- a/src/models/roomlistmodel.cpp +++ b/src/libneochat/models/roomlistmodel.cpp @@ -5,11 +5,10 @@ #include +#include "enums/neochatroomtype.h" #include "eventhandler.h" -#include "neochatconfig.h" #include "neochatconnection.h" #include "neochatroom.h" -#include "roommanager.h" #include "spacehierarchycache.h" #include @@ -18,6 +17,10 @@ using namespace Quotient; Q_DECLARE_METATYPE(Quotient::JoinState) +std::function RoomListModel::m_hiddenFilter = [](const Quotient::RoomEvent *) -> bool { + return false; +}; + RoomListModel::RoomListModel(QObject *parent) : QAbstractListModel(parent) { @@ -242,22 +245,7 @@ QVariant RoomListModel::data(const QModelIndex &index, int role) const return QVariant::fromValue(room); } if (role == SubtitleTextRole) { - 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(); } @@ -332,4 +320,9 @@ int RoomListModel::rowForRoom(NeoChatRoom *room) const return m_rooms.indexOf(room); } +void RoomListModel::setHiddenFilter(std::function hiddenFilter) +{ + RoomListModel::m_hiddenFilter = hiddenFilter; +} + #include "moc_roomlistmodel.cpp" diff --git a/src/models/roomlistmodel.h b/src/libneochat/models/roomlistmodel.h similarity index 95% rename from src/models/roomlistmodel.h rename to src/libneochat/models/roomlistmodel.h index 9fc2c03f6..6f12f50d1 100644 --- a/src/models/roomlistmodel.h +++ b/src/libneochat/models/roomlistmodel.h @@ -11,6 +11,7 @@ class NeoChatRoom; namespace Quotient { class Room; +class RoomEvent; } class NeoChatConnection; @@ -99,6 +100,8 @@ public: */ Q_INVOKABLE NeoChatRoom *roomByAliasOrId(const QString &aliasOrId); + static void setHiddenFilter(std::function hiddenFilter); + private Q_SLOTS: void doResetModel(); void doAddRoom(Quotient::Room *room); @@ -114,6 +117,8 @@ private: void connectRoomSignals(NeoChatRoom *room); + static std::function m_hiddenFilter; + Q_SIGNALS: void connectionChanged(); void roomAdded(NeoChatRoom *_t1); diff --git a/src/models/userlistmodel.cpp b/src/libneochat/models/userlistmodel.cpp similarity index 100% rename from src/models/userlistmodel.cpp rename to src/libneochat/models/userlistmodel.cpp diff --git a/src/models/userlistmodel.h b/src/libneochat/models/userlistmodel.h similarity index 100% rename from src/models/userlistmodel.h rename to src/libneochat/models/userlistmodel.h diff --git a/src/models/roomtreemodel.cpp b/src/models/roomtreemodel.cpp index 52030f1b0..075ed56f1 100644 --- a/src/models/roomtreemodel.cpp +++ b/src/models/roomtreemodel.cpp @@ -6,10 +6,10 @@ #include #include +#include "enums/neochatroomtype.h" #include "eventhandler.h" #include "neochatconfig.h" #include "neochatconnection.h" -#include "neochatroomtype.h" #include "spacehierarchycache.h" using namespace Quotient; diff --git a/src/models/sortfilterroomlistmodel.cpp b/src/models/sortfilterroomlistmodel.cpp index eda422ef9..8ad723de2 100644 --- a/src/models/sortfilterroomlistmodel.cpp +++ b/src/models/sortfilterroomlistmodel.cpp @@ -3,7 +3,7 @@ #include "sortfilterroomlistmodel.h" -#include "roomlistmodel.h" +#include "models/roomlistmodel.h" #include "neochatconnection.h" diff --git a/src/models/sortfilterroomtreemodel.cpp b/src/models/sortfilterroomtreemodel.cpp index 260c1d54c..9abb33858 100644 --- a/src/models/sortfilterroomtreemodel.cpp +++ b/src/models/sortfilterroomtreemodel.cpp @@ -4,11 +4,11 @@ #include "sortfilterroomtreemodel.h" +#include "enums/neochatroomtype.h" #include "enums/roomsortparameter.h" #include "neochatconfig.h" #include "neochatconnection.h" #include "neochatroom.h" -#include "neochatroomtype.h" #include "roommanager.h" #include "roomtreemodel.h" #include "spacehierarchycache.h" diff --git a/src/models/sortfilterspacelistmodel.cpp b/src/models/sortfilterspacelistmodel.cpp index 541072218..465ceee3d 100644 --- a/src/models/sortfilterspacelistmodel.cpp +++ b/src/models/sortfilterspacelistmodel.cpp @@ -3,7 +3,7 @@ #include "sortfilterspacelistmodel.h" -#include "roomlistmodel.h" +#include "models/roomlistmodel.h" using namespace Qt::StringLiterals; diff --git a/src/models/userfiltermodel.cpp b/src/models/userfiltermodel.cpp index 320165402..825502635 100644 --- a/src/models/userfiltermodel.cpp +++ b/src/models/userfiltermodel.cpp @@ -3,7 +3,7 @@ #include "userfiltermodel.h" -#include "userlistmodel.h" +#include "models/userlistmodel.h" bool UserFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { diff --git a/src/runner.cpp b/src/runner.cpp index aee28e296..67479533a 100644 --- a/src/runner.cpp +++ b/src/runner.cpp @@ -6,7 +6,7 @@ #include #include "controller.h" -#include "roomlistmodel.h" +#include "models/roomlistmodel.h" #include "roommanager.h" #include "sortfilterroomlistmodel.h" #include "windowcontroller.h"