From fdc3b7c8da501b9ce13edf475901e8e0fba96fb2 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Fri, 27 Nov 2020 09:58:57 +0100 Subject: [PATCH] [Wizard] Make vfs dialog blocking Calling the callback after the receiver was deleted caused a crash Fixes: #7709 Fixes: #7711 --- src/gui/accountsettings.cpp | 2 +- src/gui/folderwizard.cpp | 2 +- src/gui/wizard/owncloudadvancedsetuppage.cpp | 18 ++++++++++-------- src/gui/wizard/owncloudwizard.cpp | 5 +++-- src/gui/wizard/owncloudwizard.h | 2 +- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 2e412e991..8501ad347 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -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; diff --git a/src/gui/folderwizard.cpp b/src/gui/folderwizard.cpp index 4fdb605fc..ae23d2a4a 100644 --- a/src/gui/folderwizard.cpp +++ b/src/gui/folderwizard.cpp @@ -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); }); diff --git a/src/gui/wizard/owncloudadvancedsetuppage.cpp b/src/gui/wizard/owncloudadvancedsetuppage.cpp index 82d168f17..c780707f9 100644 --- a/src/gui/wizard/owncloudadvancedsetuppage.cpp +++ b/src/gui/wizard/owncloudadvancedsetuppage.cpp @@ -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() diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp index 8e53e8c19..dddd5b4cf 100644 --- a/src/gui/wizard/owncloudwizard.cpp +++ b/src/gui/wizard/owncloudwizard.cpp @@ -330,7 +330,7 @@ void OwncloudWizard::bringToTop() ownCloudGui::raiseDialog(this); } -void OwncloudWizard::askExperimentalVirtualFilesFeature(const std::function &callback) +void OwncloudWizard::askExperimentalVirtualFilesFeature(QWidget *receiver, const std::function &callback) { const auto bestVfsMode = bestAvailableVfsMode(); QMessageBox *msgBox = nullptr; @@ -369,7 +369,8 @@ void OwncloudWizard::askExperimentalVirtualFilesFeature(const std::functionaddButton(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(); }); diff --git a/src/gui/wizard/owncloudwizard.h b/src/gui/wizard/owncloudwizard.h index 3dd479d59..0f02b7c65 100644 --- a/src/gui/wizard/owncloudwizard.h +++ b/src/gui/wizard/owncloudwizard.h @@ -82,7 +82,7 @@ public: * being experimental. Calles the callback with true if enabling was * chosen. */ - static void askExperimentalVirtualFilesFeature(const std::function &callback); + static void askExperimentalVirtualFilesFeature(QWidget *receiver, const std::function &callback); // FIXME: Can those be local variables? // Set from the OwncloudSetupPage, later used from OwncloudHttpCredsPage -- 2.30.2