diff --git a/src/models/messageeventmodel.cpp b/src/models/messageeventmodel.cpp index 6f9adff69..19dc6d455 100644 --- a/src/models/messageeventmodel.cpp +++ b/src/models/messageeventmodel.cpp @@ -55,7 +55,6 @@ QHash MessageEventModel::roleNames() const roles[ShowReadMarkersRole] = "showReadMarkers"; roles[ReactionRole] = "reaction"; roles[ShowReactionsRole] = "showReactions"; - roles[SourceRole] = "jsonSource"; roles[AuthorIdRole] = "authorId"; roles[VerifiedRole] = "verified"; roles[AuthorDisplayNameRole] = "authorDisplayName"; @@ -467,10 +466,6 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const return eventHandler.getPlainBody(); } - if (role == SourceRole) { - return QJsonDocument(evt.fullJson()).toJson(); - } - if (role == DelegateTypeRole) { return eventHandler.getDelegateType(); } diff --git a/src/models/messageeventmodel.h b/src/models/messageeventmodel.h index 54a11c95a..0a1565299 100644 --- a/src/models/messageeventmodel.h +++ b/src/models/messageeventmodel.h @@ -70,7 +70,6 @@ public: ShowReadMarkersRole, /**< Whether there are any other user read markers to be shown. */ ReactionRole, /**< List model for this event. */ ShowReactionsRole, /**< Whether there are any reactions to be shown. */ - SourceRole, /**< The full message source JSON. */ AuthorIdRole, /**< Matrix ID of the message author. */ diff --git a/src/models/searchmodel.cpp b/src/models/searchmodel.cpp index bc137c92b..707c3b4d6 100644 --- a/src/models/searchmodel.cpp +++ b/src/models/searchmodel.cpp @@ -184,7 +184,6 @@ QHash SearchModel::roleNames() const {MimeTypeRole, "mimeType"}, {ShowLinkPreviewRole, "showLinkPreview"}, {LinkPreviewRole, "linkPreview"}, - {SourceRole, "jsonSource"}, }; } diff --git a/src/models/searchmodel.h b/src/models/searchmodel.h index 74c110895..8c012acea 100644 --- a/src/models/searchmodel.h +++ b/src/models/searchmodel.h @@ -83,7 +83,6 @@ public: MimeTypeRole, ShowLinkPreviewRole, LinkPreviewRole, - SourceRole, }; Q_ENUM(Roles) explicit SearchModel(QObject *parent = nullptr); diff --git a/src/neochatroom.cpp b/src/neochatroom.cpp index e7ddacc98..8077f677d 100644 --- a/src/neochatroom.cpp +++ b/src/neochatroom.cpp @@ -1334,6 +1334,16 @@ void NeoChatRoom::reportEvent(const QString &eventId, const QString &reason) }); } +QByteArray NeoChatRoom::getEventJsonSource(const QString &eventId) +{ + auto evtIt = findInTimeline(eventId); + if (evtIt != messageEvents().rend() && is(**evtIt)) { + const auto event = evtIt->viewAs(); + return QJsonDocument(event->fullJson()).toJson(); + } + return {}; +} + QString NeoChatRoom::chatBoxText() const { return m_chatBoxText; diff --git a/src/neochatroom.h b/src/neochatroom.h index 155299f2f..ca36f9d8b 100644 --- a/src/neochatroom.h +++ b/src/neochatroom.h @@ -551,6 +551,8 @@ public: */ Q_INVOKABLE void reportEvent(const QString &eventId, const QString &reason); + Q_INVOKABLE QByteArray getEventJsonSource(const QString &eventId); + [[nodiscard]] bool readMarkerLoaded() const; /** diff --git a/src/qml/Component/NeochatMaximizeComponent.qml b/src/qml/Component/NeochatMaximizeComponent.qml index 4714d1cbc..eb3909879 100644 --- a/src/qml/Component/NeochatMaximizeComponent.qml +++ b/src/qml/Component/NeochatMaximizeComponent.qml @@ -26,8 +26,6 @@ Components.AlbumMaximizeComponent { readonly property var currentProgressInfo: model.data(model.index(content.currentIndex, 0), MessageEventModel.ProgressInfoRole) - readonly property var currentJsonSource: model.data(model.index(content.currentIndex, 0), MessageEventModel.SourceRole) - downloadAction: Components.DownloadAction { id: downloadAction onTriggered: { @@ -85,7 +83,6 @@ Components.AlbumMaximizeComponent { const contextMenu = fileDelegateContextMenu.createObject(parent, { author: root.currentAuthor, eventId: root.currentEventId, - source: root.currentJsonSource, file: parent, progressInfo: root.currentProgressInfo, plainText: root.currentPlainText diff --git a/src/qml/Component/Timeline/TimelineContainer.qml b/src/qml/Component/Timeline/TimelineContainer.qml index 7e8dec638..f01081240 100644 --- a/src/qml/Component/Timeline/TimelineContainer.qml +++ b/src/qml/Component/Timeline/TimelineContainer.qml @@ -212,11 +212,6 @@ ColumnLayout { */ required property bool verified - /** - * @brief The full message source JSON. - */ - required property var jsonSource - /** * @brief The x position of the message bubble. * @@ -609,7 +604,6 @@ ColumnLayout { const contextMenu = fileDelegateContextMenu.createObject(root, { author: root.author, eventId: root.eventId, - eventSource: root.jsonSource, file: file, progressInfo: root.progressInfo, plainText: root.plainText, @@ -625,7 +619,6 @@ ColumnLayout { selectedText: selectedText, author: root.author, eventId: root.eventId, - eventSource: root.jsonSource, eventType: root.delegateType, plainText: root.plainText, htmlText: root.display, diff --git a/src/qml/Menu/Timeline/FileDelegateContextMenu.qml b/src/qml/Menu/Timeline/FileDelegateContextMenu.qml index f2570719a..791f733b5 100644 --- a/src/qml/Menu/Timeline/FileDelegateContextMenu.qml +++ b/src/qml/Menu/Timeline/FileDelegateContextMenu.qml @@ -90,15 +90,7 @@ MessageDelegateContextMenu { Kirigami.Action { text: i18n("View Source") icon.name: "code-context" - onTriggered: { - applicationWindow().pageStack.pushDialogLayer('qrc:/MessageSourceSheet.qml', { - sourceText: root.eventSource - }, { - title: i18n("Message Source"), - width: Kirigami.Units.gridUnit * 25 - }); - root.closeFullscreen() - } + onTriggered: RoomManager.viewEventSource(root.eventId) } ] diff --git a/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml b/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml index 12ffd187d..fa11fb141 100644 --- a/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml +++ b/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml @@ -16,7 +16,6 @@ Loader { required property var author required property string eventId property var eventType - required property string eventSource property string selectedText: "" required property string plainText property string htmlText: undefined @@ -87,14 +86,7 @@ Loader { visible: Config.developerTools text: i18n("View Source") icon.name: "code-context" - onTriggered: { - applicationWindow().pageStack.pushDialogLayer('qrc:/MessageSourceSheet.qml', { - sourceText: root.eventSource - }, { - title: i18n("Message Source"), - width: Kirigami.Units.gridUnit * 25 - }); - } + onTriggered: RoomManager.viewEventSource(root.eventId) }, Kirigami.Action { text: i18n("Copy Link") diff --git a/src/qml/Page/RoomPage.qml b/src/qml/Page/RoomPage.qml index 31fa510c5..b7aad0107 100644 --- a/src/qml/Page/RoomPage.qml +++ b/src/qml/Page/RoomPage.qml @@ -199,6 +199,15 @@ Kirigami.Page { function onShowUserDetail(user) { root.showUserDetail(user) } + + function onShowEventSource(eventId) { + applicationWindow().pageStack.pushDialogLayer('qrc:/MessageSourceSheet.qml', { + sourceText: root.currentRoom.getEventJsonSource(eventId) + }, { + title: i18n("Message Source"), + width: Kirigami.Units.gridUnit * 25 + }); + } } function showUserDetail(user) { diff --git a/src/roommanager.cpp b/src/roommanager.cpp index df5ce8d55..cc6f05317 100644 --- a/src/roommanager.cpp +++ b/src/roommanager.cpp @@ -103,6 +103,11 @@ void RoomManager::maximizeMedia(int index) Q_EMIT showMaximizedMedia(index); } +void RoomManager::viewEventSource(const QString &eventId) +{ + Q_EMIT showEventSource(eventId); +} + bool RoomManager::hasOpenRoom() const { return m_currentRoom != nullptr; diff --git a/src/roommanager.h b/src/roommanager.h index 2371427cc..d13716546 100644 --- a/src/roommanager.h +++ b/src/roommanager.h @@ -195,6 +195,11 @@ public: */ Q_INVOKABLE void maximizeMedia(int index); + /** + * @brief Show the JSON source for the given event Matrix ID + */ + Q_INVOKABLE void viewEventSource(const QString &eventId); + /** * @brief Call this when the current used connection is dropped. */ @@ -261,6 +266,11 @@ Q_SIGNALS: */ void showMaximizedMedia(int index); + /** + * @brief Request the JSON source for the given event ID is shown. + */ + void showEventSource(const QString &eventId); + /** * @brief Show the direct chat confirmation dialog. *