From 6efa9f81beaba1e7dc7d78402b25ff02af546a1d Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Thu, 4 May 2023 10:32:56 +0200 Subject: [PATCH] prevent close of conflicts dialog on focus lost Signed-off-by: Matthieu Gallien --- src/gui/ResolveConflictsDialog.qml | 22 +++++++--------------- src/gui/systray.cpp | 27 +++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/gui/ResolveConflictsDialog.qml b/src/gui/ResolveConflictsDialog.qml index 4228c7514..bf6422fe6 100644 --- a/src/gui/ResolveConflictsDialog.qml +++ b/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 { diff --git a/src/gui/systray.cpp b/src/gui/systray.cpp index 25276b84f..4e14c2b5d 100644 --- a/src/gui/systray.cpp +++ b/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(dialog); + if (!dialogWindow) { + delete dialog; + delete conflictsDialog; + return; + } + dialogWindow->show(); + dialogWindow->raise(); + dialogWindow->requestActivate(); + + delete conflictsDialog; } bool Systray::raiseDialogs() -- 2.30.2