From bf7b58c959cabeb3ab060861886a26ee1a82c9d4 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Thu, 10 Mar 2022 20:42:12 +0100
Subject: [PATCH] Don't destroy components in use

Add a delay to all destructions and move the call dialog stuff up a
level, so that we don't destroy the component when destroying the parent
dialog.

fixes #984
---
 resources/qml/MessageInput.qml     |  8 ++++++++
 resources/qml/Root.qml             |  6 +++---
 resources/qml/voip/PlaceCall.qml   | 12 ++----------
 resources/qml/voip/ScreenShare.qml |  8 +++-----
 4 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index 689484526..f8ab494b4 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -29,6 +29,14 @@ Rectangle {
 
     }
 
+    Component {
+        id: screenShareDialog
+
+        ScreenShare {
+        }
+
+    }
+
     RowLayout {
         id: row
 
diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index c8c05a3ee..98212c839 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -222,12 +222,12 @@ Pane {
     }
 
     function destroyOnClose(obj) {
-        if (obj.closing != undefined) obj.closing.connect(() => obj.destroy());
-        else if (obj.closed != undefined) obj.closed.connect(() => obj.destroy());
+        if (obj.closing != undefined) obj.closing.connect(() => obj.destroy(1000));
+        else if (obj.aboutToHide != undefined) obj.aboutToHide.connect(() => obj.destroy(1000));
     }
 
     function destroyOnClosed(obj) {
-        obj.closed.connect(() => obj.destroy());
+        obj.aboutToHide.connect(() => obj.destroy(1000));
     }
 
     Connections {
diff --git a/resources/qml/voip/PlaceCall.qml b/resources/qml/voip/PlaceCall.qml
index 2639f5bbc..79fd2fc9c 100644
--- a/resources/qml/voip/PlaceCall.qml
+++ b/resources/qml/voip/PlaceCall.qml
@@ -28,14 +28,6 @@ Popup {
 
     }
 
-    Component {
-        id: screenShareDialog
-
-        ScreenShare {
-        }
-
-    }
-
     ColumnLayout {
         id: columnLayout
 
@@ -81,7 +73,7 @@ Popup {
                 height: Nheko.avatarSize
                 url: room.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
                 displayName: room.roomName
-                roomid: room.roomid
+                roomid: room.roomId
                 onClicked: TimelineManager.openImageOverlay(room, room.avatarUrl(userid), room.data.eventId)
             }
 
@@ -118,8 +110,8 @@ Popup {
                 onClicked: {
                     var dialog = screenShareDialog.createObject(timelineRoot);
                     dialog.open();
-                    close();
                     timelineRoot.destroyOnClose(dialog);
+                    close();
                 }
             }
 
diff --git a/resources/qml/voip/ScreenShare.qml b/resources/qml/voip/ScreenShare.qml
index 0b439a487..cf58f3fa3 100644
--- a/resources/qml/voip/ScreenShare.qml
+++ b/resources/qml/voip/ScreenShare.qml
@@ -11,12 +11,10 @@ import im.nheko 1.0
 
 Popup {
     modal: true
-    // only set the anchors on Qt 5.12 or higher
-    // see https://doc.qt.io/qt-5/qml-qtquick-controls2-popup.html#anchors.centerIn-prop
-    Component.onCompleted: {
-        if (anchors)
-            anchors.centerIn = parent;
 
+    anchors.centerIn: parent;
+
+    Component.onCompleted: {
         frameRateCombo.currentIndex = frameRateCombo.find(Settings.screenShareFrameRate);
     }
     palette: Nheko.colors
-- 
GitLab