From dab1c9068ac6d48a1faba54d7510deb360ae74e3 Mon Sep 17 00:00:00 2001
From: Loren Burkholder <computersemiexpert@outlook.com>
Date: Fri, 30 Jul 2021 22:13:58 -0400
Subject: [PATCH] QML the raw message dialog

---
 CMakeLists.txt                     |  1 -
 resources/qml/RawMessageDialog.qml | 46 +++++++++++++++++++++++
 resources/qml/Root.qml             |  8 ++++
 resources/qml/TimelineView.qml     |  7 ++++
 resources/res.qrc                  |  1 +
 src/dialogs/RawMessage.h           | 60 ------------------------------
 src/timeline/TimelineModel.cpp     | 11 ++----
 src/timeline/TimelineModel.h       |  5 ++-
 src/ui/NhekoGlobalObject.h         |  5 +++
 9 files changed, 74 insertions(+), 70 deletions(-)
 create mode 100644 resources/qml/RawMessageDialog.qml
 delete mode 100644 src/dialogs/RawMessage.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 80ea628fc..9f8240481 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -496,7 +496,6 @@ qt5_wrap_cpp(MOC_HEADERS
 	src/dialogs/LeaveRoom.h
 	src/dialogs/Logout.h
 	src/dialogs/PreviewUploadOverlay.h
-	src/dialogs/RawMessage.h
 	src/dialogs/ReCaptcha.h
 
 	# Emoji
diff --git a/resources/qml/RawMessageDialog.qml b/resources/qml/RawMessageDialog.qml
new file mode 100644
index 000000000..62a5770f8
--- /dev/null
+++ b/resources/qml/RawMessageDialog.qml
@@ -0,0 +1,46 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import im.nheko 1.0
+
+ApplicationWindow {
+    id: rawMessageRoot
+
+    property alias rawMessage: rawMessageView.text
+
+    x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
+    y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
+    height: 420
+    width: 420
+    palette: Nheko.colors
+    color: Nheko.colors.window
+    flags: Qt.Tool | Qt.WindowStaysOnTopHint
+
+    Shortcut {
+        sequence: StandardKey.Cancel
+        onActivated: rawMessageRoot.close()
+    }
+
+    ScrollView {
+        anchors.fill: parent
+        palette: Nheko.colors
+        padding: Nheko.paddingMedium
+
+        TextArea {
+            id: rawMessageView
+
+            font: Nheko.monospaceFont()
+            palette: Nheko.colors
+            readOnly: true
+        }
+
+    }
+
+    footer: DialogButtonBox {
+        standardButtons: DialogButtonBox.Ok
+        onAccepted: rawMessageRoot.close()
+    }
+}
diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index 7d91beaef..70cfbda50 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -104,6 +104,14 @@ Page {
 
     }
 
+    Component {
+        id: rawMessageDialog
+
+        RawMessageDialog {
+        }
+
+    }
+
     Shortcut {
         sequence: "Ctrl+K"
         onActivated: {
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index d19f2cc90..e4036eb76 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -258,6 +258,13 @@ Item {
             dialog.show();
         }
 
+        function onShowRawMessageDialog(rawMessage) {
+            var dialog = rawMessageDialog.createObject(timelineRoot, {
+                "rawMessage": rawMessage
+            });
+            dialog.show();
+        }
+
         target: room
     }
 
diff --git a/resources/res.qrc b/resources/res.qrc
index 2b655b9e1..c911653ce 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -177,6 +177,7 @@
         <file>qml/RoomMembers.qml</file>
         <file>qml/InviteDialog.qml</file>
         <file>qml/ReadReceipts.qml</file>
+        <file>qml/RawMessageDialog.qml</file>
     </qresource>
     <qresource prefix="/media">
         <file>media/ring.ogg</file>
diff --git a/src/dialogs/RawMessage.h b/src/dialogs/RawMessage.h
deleted file mode 100644
index e95f675cd..000000000
--- a/src/dialogs/RawMessage.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// SPDX-FileCopyrightText: 2021 Nheko Contributors
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include <QFont>
-#include <QFontDatabase>
-#include <QTextBrowser>
-#include <QVBoxLayout>
-#include <QWidget>
-
-#include "nlohmann/json.hpp"
-
-#include "Logging.h"
-#include "MainWindow.h"
-#include "ui/FlatButton.h"
-
-namespace dialogs {
-
-class RawMessage : public QWidget
-{
-        Q_OBJECT
-public:
-        RawMessage(QString msg, QWidget *parent = nullptr)
-          : QWidget{parent}
-        {
-                QFont monospaceFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
-
-                auto layout = new QVBoxLayout{this};
-                auto viewer = new QTextBrowser{this};
-                viewer->setFont(monospaceFont);
-                viewer->setText(msg);
-
-                layout->setSpacing(0);
-                layout->setMargin(0);
-                layout->addWidget(viewer);
-
-                setAutoFillBackground(true);
-                setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
-                setAttribute(Qt::WA_DeleteOnClose, true);
-
-                QSize winsize;
-                QPoint center;
-
-                auto window = MainWindow::instance();
-                if (window) {
-                        winsize = window->frameGeometry().size();
-                        center  = window->frameGeometry().center();
-
-                        move(center.x() - (width() * 0.5), center.y() - (height() * 0.5));
-                } else {
-                        nhlog::ui()->warn("unable to retrieve MainWindow's size");
-                }
-
-                raise();
-                show();
-        }
-};
-} // namespace dialogs
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 6ae0c4d1a..a8adf05b5 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -31,7 +31,6 @@
 #include "ReadReceiptsModel.h"
 #include "TimelineViewManager.h"
 #include "Utils.h"
-#include "dialogs/RawMessage.h"
 
 Q_DECLARE_METATYPE(QModelIndex)
 
@@ -1026,14 +1025,13 @@ TimelineModel::formatDateSeparator(QDate date) const
 }
 
 void
-TimelineModel::viewRawMessage(QString id) const
+TimelineModel::viewRawMessage(QString id)
 {
         auto e = events.get(id.toStdString(), "", false);
         if (!e)
                 return;
         std::string ev = mtx::accessors::serialize_event(*e).dump(4);
-        auto dialog    = new dialogs::RawMessage(QString::fromStdString(ev));
-        Q_UNUSED(dialog);
+        emit showRawMessageDialog(QString::fromStdString(ev));
 }
 
 void
@@ -1047,15 +1045,14 @@ TimelineModel::forwardMessage(QString eventId, QString roomId)
 }
 
 void
-TimelineModel::viewDecryptedRawMessage(QString id) const
+TimelineModel::viewDecryptedRawMessage(QString id)
 {
         auto e = events.get(id.toStdString(), "");
         if (!e)
                 return;
 
         std::string ev = mtx::accessors::serialize_event(*e).dump(4);
-        auto dialog    = new dialogs::RawMessage(QString::fromStdString(ev));
-        Q_UNUSED(dialog);
+        emit showRawMessageDialog(QString::fromStdString(ev));
 }
 
 void
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 0d5f71098..f62c5360d 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -236,9 +236,9 @@ public:
         Q_INVOKABLE QString formatGuestAccessEvent(QString id);
         Q_INVOKABLE QString formatPowerLevelEvent(QString id);
 
-        Q_INVOKABLE void viewRawMessage(QString id) const;
+        Q_INVOKABLE void viewRawMessage(QString id);
         Q_INVOKABLE void forwardMessage(QString eventId, QString roomId);
-        Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
+        Q_INVOKABLE void viewDecryptedRawMessage(QString id);
         Q_INVOKABLE void openUserProfile(QString userid);
         Q_INVOKABLE void editAction(QString id);
         Q_INVOKABLE void replyAction(QString id);
@@ -350,6 +350,7 @@ signals:
         void replyChanged(QString reply);
         void editChanged(QString reply);
         void openReadReceiptsDialog(ReadReceiptsProxy *rr);
+        void showRawMessageDialog(QString rawMessage);
         void paginationInProgressChanged(const bool);
         void newCallEvent(const mtx::events::collections::TimelineEvents &event);
         void scrollToIndex(int index);
diff --git a/src/ui/NhekoGlobalObject.h b/src/ui/NhekoGlobalObject.h
index 14135fd11..cfe982c5f 100644
--- a/src/ui/NhekoGlobalObject.h
+++ b/src/ui/NhekoGlobalObject.h
@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include <QFontDatabase>
 #include <QObject>
 #include <QPalette>
 
@@ -38,6 +39,10 @@ public:
         int paddingLarge() const { return 20; }
         UserProfile *currentUser() const;
 
+        Q_INVOKABLE QFont monospaceFont() const
+        {
+                return QFontDatabase::systemFont(QFontDatabase::FixedFont);
+        }
         Q_INVOKABLE void openLink(QString link) const;
         Q_INVOKABLE void setStatusMessage(QString msg) const;
         Q_INVOKABLE void showUserSettingsPage() const;
-- 
GitLab