[Wizard] Make vfs dialog blocking
authorHannah von Reth <hannah.vonreth@owncloud.com>
Fri, 27 Nov 2020 08:58:57 +0000 (09:58 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:59:07 +0000 (10:59 +0100)
Calling the callback after the receiver was deleted caused a crash
Fixes: #7709
Fixes: #7711
src/gui/accountsettings.cpp
src/gui/folderwizard.cpp
src/gui/wizard/owncloudadvancedsetuppage.cpp
src/gui/wizard/owncloudwizard.cpp
src/gui/wizard/owncloudwizard.h

index 2e412e99197b734552d53c6f2e6fb467e021b81f..8501ad347038a9a8dc936a885383becdab95d79f 100644 (file)
@@ -667,7 +667,7 @@ void AccountSettings::slotEnableVfsCurrentFolder()
     if (!selected.isValid() || !folder)
         return;
 
-    OwncloudWizard::askExperimentalVirtualFilesFeature([folder, this](bool enable) {
+    OwncloudWizard::askExperimentalVirtualFilesFeature(this, [folder, this](bool enable) {
         if (!enable || !folder)
             return;
 
index 4fdb605fc4f00cb916255b869ffd6b48afa823e7..ae23d2a4acc480d3450d6f902e2dae3485b73d5a 100644 (file)
@@ -545,7 +545,7 @@ void FolderWizardSelectiveSync::virtualFilesCheckboxClicked()
     // The click has already had an effect on the box, so if it's
     // checked it was newly activated.
     if (_virtualFilesCheckBox->isChecked()) {
-        OwncloudWizard::askExperimentalVirtualFilesFeature([this](bool enable) {
+        OwncloudWizard::askExperimentalVirtualFilesFeature(this, [this](bool enable) {
             if (!enable)
                 _virtualFilesCheckBox->setChecked(false);
         });
index 82d168f178340e342b1c4fdfac9db2872991b512..c780707f9f33feed6c785b7816769e8c2f4b82bc 100644 (file)
@@ -368,14 +368,16 @@ void OwncloudAdvancedSetupPage::slotSelectiveSyncClicked()
 
 void OwncloudAdvancedSetupPage::slotVirtualFileSyncClicked()
 {
-    OwncloudWizard::askExperimentalVirtualFilesFeature([this](bool enable) {
-        if (!enable)
-            return;
-
-        _ui.lSelectiveSyncSizeLabel->setText(QString());
-        _selectiveSyncBlacklist.clear();
-        setRadioChecked(_ui.rVirtualFileSync);
-    });
+    if (!_ui.rVirtualFileSync->isChecked()) {
+        OwncloudWizard::askExperimentalVirtualFilesFeature(this, [this](bool enable) {
+            if (!enable)
+                return;
+
+            _ui.lSelectiveSyncSizeLabel->setText(QString());
+            _selectiveSyncBlacklist.clear();
+            setRadioChecked(_ui.rVirtualFileSync);
+        });
+    }
 }
 
 void OwncloudAdvancedSetupPage::slotSyncEverythingClicked()
index 8e53e8c19901968007cb40f26d1b30b46ba62b79..dddd5b4cf1e7955130419795b239ce436f94ef6a 100644 (file)
@@ -330,7 +330,7 @@ void OwncloudWizard::bringToTop()
     ownCloudGui::raiseDialog(this);
 }
 
-void OwncloudWizard::askExperimentalVirtualFilesFeature(const std::function<void(bool enable)> &callback)
+void OwncloudWizard::askExperimentalVirtualFilesFeature(QWidget *receiver, const std::function<void(bool enable)> &callback)
 {
     const auto bestVfsMode = bestAvailableVfsMode();
     QMessageBox *msgBox = nullptr;
@@ -369,7 +369,8 @@ void OwncloudWizard::askExperimentalVirtualFilesFeature(const std::function<void
         msgBox->addButton(tr("Enable experimental placeholder mode"), QMessageBox::AcceptRole);
         msgBox->addButton(tr("Stay safe"), QMessageBox::RejectRole);
     }
-    connect(msgBox, &QMessageBox::finished, msgBox, [callback, msgBox](int result) {
+    msgBox->setParent(receiver);
+    connect(msgBox, &QMessageBox::finished, receiver, [callback, msgBox](int result) {
         callback(result == QMessageBox::AcceptRole);
         msgBox->deleteLater();
     });
index 3dd479d597565aa16c356ee84551ec52559c5494..0f02b7c651edea769fc68a603ec75adcbb595bbd 100644 (file)
@@ -82,7 +82,7 @@ public:
      * being experimental. Calles the callback with true if enabling was
      * chosen.
      */
-    static void askExperimentalVirtualFilesFeature(const std::function<void(bool enable)> &callback);
+    static void askExperimentalVirtualFilesFeature(QWidget *receiver, const std::function<void(bool enable)> &callback);
 
     // FIXME: Can those be local variables?
     // Set from the OwncloudSetupPage, later used from OwncloudHttpCredsPage