From 81406171a0d6b6751e9eb1777faf6ea895affcc7 Mon Sep 17 00:00:00 2001
From: Loren Burkholder <computersemiexpert@outlook.com>
Date: Wed, 29 Sep 2021 20:15:25 -0400
Subject: [PATCH] QML the logout dialog

---
 resources/qml/Root.qml                 | 16 ++++++++++++++++
 resources/qml/dialogs/LogoutDialog.qml | 19 +++++++++++++++++++
 resources/res.qrc                      |  1 +
 src/MainWindow.cpp                     | 19 -------------------
 src/MainWindow.h                       |  1 -
 src/ui/NhekoGlobalObject.cpp           |  5 +++--
 src/ui/NhekoGlobalObject.h             |  4 +++-
 7 files changed, 42 insertions(+), 23 deletions(-)
 create mode 100644 resources/qml/dialogs/LogoutDialog.qml

diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index 4207f35b6..29da45eb8 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -111,6 +111,13 @@ Page {
 
     }
 
+    Component {
+        id: logoutDialog
+
+        LogoutDialog {
+        }
+    }
+
     Shortcut {
         sequence: "Ctrl+K"
         onActivated: {
@@ -135,6 +142,15 @@ Page {
         onActivated: Rooms.previousRoom()
     }
 
+    Connections {
+        function onOpenLogoutDialog() {
+            var dialog = logoutDialog.createObject(timelineRoot);
+            dialog.open();
+        }
+
+        target: Nheko
+    }
+
     Connections {
         function onNewDeviceVerificationRequest(flow) {
             var dialog = deviceVerificationDialog.createObject(timelineRoot, {
diff --git a/resources/qml/dialogs/LogoutDialog.qml b/resources/qml/dialogs/LogoutDialog.qml
new file mode 100644
index 000000000..9e107097b
--- /dev/null
+++ b/resources/qml/dialogs/LogoutDialog.qml
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import Qt.labs.platform 1.1
+import im.nheko 1.0
+
+MessageDialog {
+    id: logoutRoot
+
+    title: qsTr("Log out")
+    text: CallManager.isOnCall ? qsTr("A call is in progress. Log out?") : qsTr("Are you sure you want to log out?")
+    modality: Qt.WindowModal
+    flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
+    buttons: Dialog.Ok | Dialog.Cancel
+    onAccepted: Nheko.logout()
+}
diff --git a/resources/res.qrc b/resources/res.qrc
index a001a9290..af684fc0a 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -183,6 +183,7 @@
         <file>qml/dialogs/RoomMembers.qml</file>
         <file>qml/dialogs/RoomSettings.qml</file>
         <file>qml/dialogs/UserProfile.qml</file>
+        <file>qml/dialogs/LogoutDialog.qml</file>
     </qresource>
     <qresource prefix="/media">
         <file>media/ring.ogg</file>
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index bc53b9063..0978fc258 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -35,7 +35,6 @@
 #include "dialogs/CreateRoom.h"
 #include "dialogs/JoinRoom.h"
 #include "dialogs/LeaveRoom.h"
-#include "dialogs/Logout.h"
 
 MainWindow *MainWindow::instance_ = nullptr;
 
@@ -372,24 +371,6 @@ MainWindow::showSolidOverlayModal(QWidget *content, QFlags<Qt::AlignmentFlag> fl
     modal_->show();
 }
 
-void
-MainWindow::openLogoutDialog()
-{
-    auto dialog = new dialogs::Logout(this);
-    connect(dialog, &dialogs::Logout::loggingOut, this, [this]() {
-        if (WebRTCSession::instance().state() != webrtc::State::DISCONNECTED) {
-            if (QMessageBox::question(this, "nheko", "A call is in progress. Log out?") !=
-                QMessageBox::Yes) {
-                return;
-            }
-            WebRTCSession::instance().end();
-        }
-        chat_page_->initiateLogout();
-    });
-
-    showDialog(dialog);
-}
-
 bool
 MainWindow::hasActiveDialogs() const
 {
diff --git a/src/MainWindow.h b/src/MainWindow.h
index eff8fbe77..a3c3c7671 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -64,7 +64,6 @@ public:
     void openCreateRoomDialog(
       std::function<void(const mtx::requests::CreateRoom &request)> callback);
     void openJoinRoomDialog(std::function<void(const QString &room_id)> callback);
-    void openLogoutDialog();
 
     void hideOverlay();
     void showSolidOverlayModal(QWidget *content, QFlags<Qt::AlignmentFlag> flags = Qt::AlignCenter);
diff --git a/src/ui/NhekoGlobalObject.cpp b/src/ui/NhekoGlobalObject.cpp
index d68249960..1a20cbc2c 100644
--- a/src/ui/NhekoGlobalObject.cpp
+++ b/src/ui/NhekoGlobalObject.cpp
@@ -13,6 +13,7 @@
 #include "Logging.h"
 #include "MainWindow.h"
 #include "UserSettingsPage.h"
+#include "WebRTCSession.h"
 #include "Utils.h"
 
 Nheko::Nheko()
@@ -83,9 +84,9 @@ Nheko::showUserSettingsPage() const
 }
 
 void
-Nheko::openLogoutDialog() const
+Nheko::logout() const
 {
-    MainWindow::instance()->openLogoutDialog();
+    ChatPage::instance()->initiateLogout();
 }
 
 void
diff --git a/src/ui/NhekoGlobalObject.h b/src/ui/NhekoGlobalObject.h
index aa8435d18..64aad941a 100644
--- a/src/ui/NhekoGlobalObject.h
+++ b/src/ui/NhekoGlobalObject.h
@@ -48,7 +48,7 @@ public:
     Q_INVOKABLE void openLink(QString link) const;
     Q_INVOKABLE void setStatusMessage(QString msg) const;
     Q_INVOKABLE void showUserSettingsPage() const;
-    Q_INVOKABLE void openLogoutDialog() const;
+    Q_INVOKABLE void logout() const;
     Q_INVOKABLE void openCreateRoomDialog() const;
     Q_INVOKABLE void openJoinRoomDialog() const;
     Q_INVOKABLE void reparent(QWindow *win) const;
@@ -60,6 +60,8 @@ signals:
     void colorsChanged();
     void profileChanged();
 
+    void openLogoutDialog();
+
 private:
     QScopedPointer<UserProfile> currentUser_;
 };
-- 
GitLab