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 <hjk@qt.io>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2019-04-10 11:04:55 +02:00
parent e95fd876aa
commit ca39832c5d

View File

@@ -80,6 +80,12 @@ class TargetSetupPageWrapper : public QWidget
public: public:
explicit TargetSetupPageWrapper(Project *project); explicit TargetSetupPageWrapper(Project *project);
void ensureSetupPage()
{
if (!m_targetSetupPage)
addTargetSetupPage();
}
protected: protected:
void keyReleaseEvent(QKeyEvent *event) override void keyReleaseEvent(QKeyEvent *event) override
{ {
@@ -91,22 +97,22 @@ protected:
{ {
if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) {
event->accept(); event->accept();
done(); if (m_targetSetupPage)
done();
} }
} }
private: private:
void done() void done()
{ {
QTC_ASSERT(m_targetSetupPage, return);
m_targetSetupPage->disconnect();
m_targetSetupPage->setupProject(m_project); m_targetSetupPage->setupProject(m_project);
m_targetSetupPage->deleteLater();
m_targetSetupPage = nullptr;
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
} }
void cancel()
{
ProjectExplorerPlugin::unloadProject(m_project);
}
void kitUpdated(ProjectExplorer::Kit *k) void kitUpdated(ProjectExplorer::Kit *k)
{ {
if (k == KitManager::defaultKit()) if (k == KitManager::defaultKit())
@@ -115,29 +121,21 @@ private:
void completeChanged() void completeChanged()
{ {
m_configureButton->setEnabled(m_targetSetupPage->isComplete()); m_configureButton->setEnabled(m_targetSetupPage && m_targetSetupPage->isComplete());
} }
void updateNoteText(); void updateNoteText();
void addTargetSetupPage();
Project *m_project; Project * const m_project;
TargetSetupPage *m_targetSetupPage; TargetSetupPage *m_targetSetupPage = nullptr;
QPushButton *m_configureButton; QPushButton *m_configureButton = nullptr;
QVBoxLayout *m_setupPageContainer = nullptr;
}; };
TargetSetupPageWrapper::TargetSetupPageWrapper(Project *project) TargetSetupPageWrapper::TargetSetupPageWrapper(Project *project)
: m_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); auto box = new QDialogButtonBox(this);
m_configureButton = new QPushButton(this); m_configureButton = new QPushButton(this);
@@ -150,20 +148,13 @@ TargetSetupPageWrapper::TargetSetupPageWrapper(Project *project)
auto layout = new QVBoxLayout(this); auto layout = new QVBoxLayout(this);
layout->setMargin(0); layout->setMargin(0);
layout->addWidget(m_targetSetupPage); m_setupPageContainer = new QVBoxLayout;
layout->addLayout(m_setupPageContainer);
layout->addLayout(hbox); layout->addLayout(hbox);
layout->addStretch(10); layout->addStretch(10);
completeChanged(); completeChanged();
connect(m_configureButton, &QAbstractButton::clicked, connect(m_configureButton, &QAbstractButton::clicked,
this, &TargetSetupPageWrapper::done); 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() void TargetSetupPageWrapper::updateNoteText()
@@ -198,6 +189,29 @@ void TargetSetupPageWrapper::updateNoteText()
m_targetSetupPage->showOptionsHint(showHint); 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 // TargetSettingsPanelItem
// //
@@ -228,6 +242,7 @@ public:
QPointer<QWidget> m_noKitLabel; QPointer<QWidget> m_noKitLabel;
QPointer<QWidget> m_configurePage; QPointer<QWidget> m_configurePage;
QPointer<QWidget> m_configuredPage; QPointer<QWidget> m_configuredPage;
TargetSetupPageWrapper *m_targetSetupPageWrapper = nullptr;
}; };
void TargetGroupItemPrivate::ensureWidget() void TargetGroupItemPrivate::ensureWidget()
@@ -253,12 +268,13 @@ void TargetGroupItemPrivate::ensureWidget()
} }
if (!m_configurePage) { if (!m_configurePage) {
auto widget = new TargetSetupPageWrapper(m_project); m_targetSetupPageWrapper = new TargetSetupPageWrapper(m_project);
m_configurePage = new PanelsWidget(tr("Configure Project"), m_configurePage = new PanelsWidget(tr("Configure Project"),
QIcon(":/projectexplorer/images/unconfigured.png"), QIcon(":/projectexplorer/images/unconfigured.png"),
widget); m_targetSetupPageWrapper);
m_configurePage->setFocusProxy(widget); m_configurePage->setFocusProxy(m_targetSetupPageWrapper);
} }
m_targetSetupPageWrapper->ensureSetupPage();
if (!m_configuredPage) { if (!m_configuredPage) {
auto widget = new QWidget; auto widget = new QWidget;