diff --git a/imports/NeoChat/Page/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml index b8a34d310..5352312f1 100644 --- a/imports/NeoChat/Page/RoomPage.qml +++ b/imports/NeoChat/Page/RoomPage.qml @@ -211,25 +211,10 @@ Kirigami.ScrollablePage { } - KSortFilterProxyModel { + MessageFilterModel { id: sortedMessageEventModel sourceModel: messageEventModel - - filterRowCallback: Config.showLeaveJoinEvent ? dontFilterLeaveJoin : filterLeaveJoin - - function dontFilterLeaveJoin(row, parent) { - return messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.SpecialMarksRole) !== EventStatus.Hidden - && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.MessageRole) !== 0x10 - && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.EventTypeRole) !== "other"; - } - - function filterLeaveJoin(row, parent) { - return messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.SpecialMarksRole) !== EventStatus.Hidden - && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.MessageRole) !== 0x10 - && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.EventTypeRole) !== "other" - && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.EventTypeRole) !== "state"; - } } // populate: Transition { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 31ce5dad9..bc002367d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(neochat clipboard.cpp matriximageprovider.cpp messageeventmodel.cpp + messagefiltermodel.cpp roomlistmodel.cpp neochatroom.cpp neochatuser.cpp diff --git a/src/main.cpp b/src/main.cpp index fdc7cca3b..0113d70c0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,6 +34,7 @@ #include "filetypesingleton.h" #include "matriximageprovider.h" #include "messageeventmodel.h" +#include "messagefiltermodel.h" #include "neochatconfig.h" #include "neochatroom.h" #include "neochatuser.h" @@ -107,6 +108,7 @@ int main(int argc, char *argv[]) qmlRegisterType("org.kde.neochat", 1, 0, "RoomListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "UserListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "MessageEventModel"); + qmlRegisterType("org.kde.neochat", 1, 0, "MessageFilterModel"); qmlRegisterType("org.kde.neochat", 1, 0, "PublicRoomListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "UserDirectoryListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "EmojiModel"); diff --git a/src/messagefiltermodel.cpp b/src/messagefiltermodel.cpp new file mode 100644 index 000000000..50f8e5a41 --- /dev/null +++ b/src/messagefiltermodel.cpp @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2021 Nicolas Fella + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + */ + +#include "messagefiltermodel.h" + +#include "messageeventmodel.h" +#include "neochatconfig.h" + +bool MessageFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + const QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + + if (index.data(MessageEventModel::SpecialMarksRole).toInt() == EventStatus::Hidden) { + return false; + } + + if (index.data(MessageEventModel::MessageRole).toInt() == 0x10) { + return false; + } + + const QString eventType = index.data(MessageEventModel::EventTypeRole).toString(); + + if (eventType == QLatin1String("other")) { + return false; + } + + if (!NeoChatConfig::self()->showLeaveJoinEvent() && eventType == QLatin1String("state")) { + return false; + } + + return true; +} diff --git a/src/messagefiltermodel.h b/src/messagefiltermodel.h new file mode 100644 index 000000000..157e1a3fc --- /dev/null +++ b/src/messagefiltermodel.h @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2021 Nicolas Fella + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + */ +#pragma once + +#include + +class MessageFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT +public: + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; + +};