From ca39832c5df3c92ac1544168fbd5655886ea6c1e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 10 Apr 2019 11:04:55 +0200 Subject: [PATCH] ProjectExplorer: Make sure the target setup page does not persist The TargetSetupPage is not designed to stay around after setupProject() has been called. So let's throw it away in the TargetSetupPageWrapper and create a new one on demand. Fixes: QTCREATORBUG-21242 Change-Id: I1d6f4214e7bfdfef9d58593007728612642b90d6 Reviewed-by: hjk Reviewed-by: Christian Stenger --- .../projectexplorer/targetsettingspanel.cpp | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 78d7daabc8f..045ea97d043 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -80,6 +80,12 @@ class TargetSetupPageWrapper : public QWidget public: explicit TargetSetupPageWrapper(Project *project); + void ensureSetupPage() + { + if (!m_targetSetupPage) + addTargetSetupPage(); + } + protected: void keyReleaseEvent(QKeyEvent *event) override { @@ -91,22 +97,22 @@ protected: { if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { event->accept(); - done(); + if (m_targetSetupPage) + done(); } } private: void done() { + QTC_ASSERT(m_targetSetupPage, return); + m_targetSetupPage->disconnect(); m_targetSetupPage->setupProject(m_project); + m_targetSetupPage->deleteLater(); + m_targetSetupPage = nullptr; Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); } - void cancel() - { - ProjectExplorerPlugin::unloadProject(m_project); - } - void kitUpdated(ProjectExplorer::Kit *k) { if (k == KitManager::defaultKit()) @@ -115,29 +121,21 @@ private: void completeChanged() { - m_configureButton->setEnabled(m_targetSetupPage->isComplete()); + m_configureButton->setEnabled(m_targetSetupPage && m_targetSetupPage->isComplete()); } void updateNoteText(); + void addTargetSetupPage(); - Project *m_project; - TargetSetupPage *m_targetSetupPage; - QPushButton *m_configureButton; + Project * const m_project; + TargetSetupPage *m_targetSetupPage = nullptr; + QPushButton *m_configureButton = nullptr; + QVBoxLayout *m_setupPageContainer = nullptr; }; TargetSetupPageWrapper::TargetSetupPageWrapper(Project *project) : m_project(project) { - m_targetSetupPage = new TargetSetupPage(this); - m_targetSetupPage->setUseScrollArea(false); - m_targetSetupPage->setProjectPath(project->projectFilePath().toString()); - m_targetSetupPage->setRequiredKitPredicate(project->requiredKitPredicate()); - m_targetSetupPage->setPreferredKitPredicate(project->preferredKitPredicate()); - m_targetSetupPage->setProjectImporter(project->projectImporter()); - m_targetSetupPage->initializePage(); - m_targetSetupPage->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - updateNoteText(); - auto box = new QDialogButtonBox(this); m_configureButton = new QPushButton(this); @@ -150,20 +148,13 @@ TargetSetupPageWrapper::TargetSetupPageWrapper(Project *project) auto layout = new QVBoxLayout(this); layout->setMargin(0); - layout->addWidget(m_targetSetupPage); + m_setupPageContainer = new QVBoxLayout; + layout->addLayout(m_setupPageContainer); layout->addLayout(hbox); layout->addStretch(10); - completeChanged(); - connect(m_configureButton, &QAbstractButton::clicked, this, &TargetSetupPageWrapper::done); - connect(m_targetSetupPage, &QWizardPage::completeChanged, - this, &TargetSetupPageWrapper::completeChanged); - connect(KitManager::instance(), &KitManager::defaultkitChanged, - this, &TargetSetupPageWrapper::updateNoteText); - connect(KitManager::instance(), &KitManager::kitUpdated, - this, &TargetSetupPageWrapper::kitUpdated); } void TargetSetupPageWrapper::updateNoteText() @@ -198,6 +189,29 @@ void TargetSetupPageWrapper::updateNoteText() m_targetSetupPage->showOptionsHint(showHint); } +void TargetSetupPageWrapper::addTargetSetupPage() +{ + m_targetSetupPage = new TargetSetupPage(this); + m_targetSetupPage->setUseScrollArea(false); + m_targetSetupPage->setProjectPath(m_project->projectFilePath().toString()); + m_targetSetupPage->setRequiredKitPredicate(m_project->requiredKitPredicate()); + m_targetSetupPage->setPreferredKitPredicate(m_project->preferredKitPredicate()); + m_targetSetupPage->setProjectImporter(m_project->projectImporter()); + m_targetSetupPage->initializePage(); + m_targetSetupPage->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + m_setupPageContainer->addWidget(m_targetSetupPage); + updateNoteText(); + + completeChanged(); + + connect(m_targetSetupPage, &QWizardPage::completeChanged, + this, &TargetSetupPageWrapper::completeChanged); + connect(KitManager::instance(), &KitManager::defaultkitChanged, + this, &TargetSetupPageWrapper::updateNoteText); + connect(KitManager::instance(), &KitManager::kitUpdated, + this, &TargetSetupPageWrapper::kitUpdated); +} + // // TargetSettingsPanelItem // @@ -228,6 +242,7 @@ public: QPointer m_noKitLabel; QPointer m_configurePage; QPointer m_configuredPage; + TargetSetupPageWrapper *m_targetSetupPageWrapper = nullptr; }; void TargetGroupItemPrivate::ensureWidget() @@ -253,12 +268,13 @@ void TargetGroupItemPrivate::ensureWidget() } if (!m_configurePage) { - auto widget = new TargetSetupPageWrapper(m_project); + m_targetSetupPageWrapper = new TargetSetupPageWrapper(m_project); m_configurePage = new PanelsWidget(tr("Configure Project"), QIcon(":/projectexplorer/images/unconfigured.png"), - widget); - m_configurePage->setFocusProxy(widget); + m_targetSetupPageWrapper); + m_configurePage->setFocusProxy(m_targetSetupPageWrapper); } + m_targetSetupPageWrapper->ensureSetupPage(); if (!m_configuredPage) { auto widget = new QWidget;