Kaynağa Gözat

prevent close of conflicts dialog on focus lost

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
Matthieu Gallien 2 yıl önce
ebeveyn
işleme
6efa9f81be
2 değiştirilmiş dosya ile 30 ekleme ve 19 silme
  1. 7 15
      src/gui/ResolveConflictsDialog.qml
  2. 23 4
      src/gui/systray.cpp

+ 7 - 15
src/gui/ResolveConflictsDialog.qml

@@ -14,7 +14,7 @@
 
 import QtQml 2.15
 import QtQuick 2.15
-import QtQuick.Window 2.15
+import QtQuick.Window 2.15 as QtWindow
 import QtQuick.Layouts 1.15
 import QtQuick.Controls 2.15
 import QtQml.Models 2.15
@@ -22,12 +22,12 @@ import Style 1.0
 import com.nextcloud.desktopclient 1.0
 import "./tray"
 
-Window {
-    id: root
+QtWindow.Window {
+    id: conflictsDialog
 
     required property var allConflicts
 
-    flags: Qt.Dialog
+    flags: Qt.Window | Qt.Dialog
     visible: true
 
     width: 600
@@ -36,17 +36,9 @@ Window {
     minimumHeight: 800
     title: qsTr('Solve sync conflicts')
 
-    onClosing: function() {
+    onClosing: function(close) {
         Systray.destroyDialog(root);
-    }
-
-    Component.onCompleted: {
-        Systray.forceWindowInit(root);
-        Systray.positionNotificationWindow(root);
-
-        root.show();
-        root.raise();
-        root.requestActivate();
+        close.accepted = true
     }
 
     ColumnLayout {
@@ -115,7 +107,7 @@ Window {
         SyncConflictsModel {
             id: realModel
 
-            conflictActivities: root.allConflicts
+            conflictActivities: conflictsDialog.allConflicts
         }
 
         ScrollView {

+ 23 - 4
src/gui/systray.cpp

@@ -287,19 +287,38 @@ void Systray::destroyEditFileLocallyLoadingDialog()
 
 void Systray::createResolveConflictsDialog(const OCC::ActivityList &allConflicts)
 {
-    const auto callDialog = new QQmlComponent(_trayEngine, QStringLiteral("qrc:/qml/src/gui/ResolveConflictsDialog.qml"));
+    const auto conflictsDialog = new QQmlComponent(_trayEngine, QStringLiteral("qrc:/qml/src/gui/ResolveConflictsDialog.qml"));
     const QVariantMap initialProperties{
                                         {"allConflicts", QVariant::fromValue(allConflicts)},
     };
 
-    if(callDialog->isError()) {
-        qCWarning(lcSystray) << callDialog->errorString();
+    if(conflictsDialog->isError()) {
+        qCWarning(lcSystray) << conflictsDialog->errorString();
+        delete conflictsDialog;
         return;
     }
 
     // This call dialog gets deallocated on close conditions
     // by a call from the QML side to the destroyDialog slot
-    callDialog->createWithInitialProperties(initialProperties);
+    auto dialog = conflictsDialog->createWithInitialProperties(initialProperties);
+    if (!dialog) {
+        delete dialog;
+        delete conflictsDialog;
+        return;
+    }
+    dialog->setParent(QGuiApplication::instance());
+
+    auto dialogWindow = qobject_cast<QQuickWindow*>(dialog);
+    if (!dialogWindow) {
+        delete dialog;
+        delete conflictsDialog;
+        return;
+    }
+    dialogWindow->show();
+    dialogWindow->raise();
+    dialogWindow->requestActivate();
+
+    delete conflictsDialog;
 }
 
 bool Systray::raiseDialogs()