Files
qt-creator/src/plugins/projectexplorer/baseprojectwizarddialog.cpp
Christian Stenger 391e7ae34a Wizards: Redo sub project handling
If the user tries to add a sub project the decision for the
parent project must happen directly on the intro page
to avoid asking for build system or kit information later on.
Any of these information are provided by the parent project
and can therefore be skipped in case of having a sub project.
So, move this decision to the first page and on the last page
only let the user decide to which sub node of the chosen
project the new project will be added to.
The old approach set the IsSubproject marker quite too late
to handle this appropriate, so explicitly set this already
on the first page.
For now there should be only qmake based projects which are
capable of adding sub projects at all, but this patch should
be a generalized preparation for having similar functionality
in other build systems.

Fixes: QTCREATORBUG-30281
Change-Id: I8f1de4fa05f46d68ac2ddec788840d473adb015e
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
2024-06-19 12:04:43 +00:00

169 lines
4.8 KiB
C++

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "baseprojectwizarddialog.h"
#include "projectexplorertr.h"
#include <coreplugin/documentmanager.h>
#include <utils/projectintropage.h>
#include <QDir>
/*!
\class ProjectExplorer::BaseProjectWizardDialog
\brief The BaseProjectWizardDialog class is the base class for project
wizards.
Presents the introductory page and takes care of setting the folder chosen
as default projects' folder should the user wish to do that.
*/
using namespace Utils;
namespace ProjectExplorer {
struct BaseProjectWizardDialogPrivate
{
explicit BaseProjectWizardDialogPrivate(ProjectIntroPage *page, int id = -1)
: desiredIntroPageId(id), introPage(page)
{}
const int desiredIntroPageId;
ProjectIntroPage *introPage;
int introPageId = -1;
Id selectedPlatform;
QSet<Id> requiredFeatureSet;
};
BaseProjectWizardDialog::BaseProjectWizardDialog(const Core::BaseFileWizardFactory *factory,
QWidget *parent,
const Core::WizardDialogParameters &parameters) :
Core::BaseFileWizard(factory, parameters.extraValues(), parent),
d(std::make_unique<BaseProjectWizardDialogPrivate>(new ProjectIntroPage))
{
setFilePath(parameters.defaultPath());
setSelectedPlatform(parameters.selectedPlatform());
setRequiredFeatures(parameters.requiredFeatures());
init();
}
BaseProjectWizardDialog::BaseProjectWizardDialog(const Core::BaseFileWizardFactory *factory,
ProjectIntroPage *introPage, int introId,
QWidget *parent,
const Core::WizardDialogParameters &parameters) :
Core::BaseFileWizard(factory, parameters.extraValues(), parent),
d(std::make_unique<BaseProjectWizardDialogPrivate>(introPage, introId))
{
setFilePath(parameters.defaultPath());
setSelectedPlatform(parameters.selectedPlatform());
setRequiredFeatures(parameters.requiredFeatures());
init();
}
void BaseProjectWizardDialog::init()
{
if (d->introPageId == -1) {
d->introPageId = addPage(d->introPage);
} else {
d->introPageId = d->desiredIntroPageId;
setPage(d->desiredIntroPageId, d->introPage);
}
connect(this, &QDialog::accepted, this, &BaseProjectWizardDialog::slotAccepted);
}
BaseProjectWizardDialog::~BaseProjectWizardDialog() = default;
QString BaseProjectWizardDialog::projectName() const
{
return d->introPage->projectName();
}
FilePath BaseProjectWizardDialog::filePath() const
{
return d->introPage->filePath();
}
void BaseProjectWizardDialog::setIntroDescription(const QString &des)
{
d->introPage->setDescription(des);
}
void BaseProjectWizardDialog::setFilePath(const FilePath &path)
{
d->introPage->setFilePath(path);
}
void BaseProjectWizardDialog::setProjectName(const QString &name)
{
d->introPage->setProjectName(name);
}
void BaseProjectWizardDialog::slotAccepted()
{
if (d->introPage->useAsDefaultPath()) {
// Store the path as default path for new projects if desired.
Core::DocumentManager::setProjectsDirectory(filePath());
Core::DocumentManager::setUseProjectsDirectory(true);
}
}
bool BaseProjectWizardDialog::validateCurrentPage()
{
if (currentId() == d->introPageId)
emit projectParametersChanged(d->introPage->projectName(), d->introPage->filePath());
return Core::BaseFileWizard::validateCurrentPage();
}
ProjectIntroPage *BaseProjectWizardDialog::introPage() const
{
return d->introPage;
}
QString BaseProjectWizardDialog::uniqueProjectName(const FilePath &path)
{
const QDir pathDir(path.toString());
//: File path suggestion for a new project. If you choose
//: to translate it, make sure it is a valid path name without blanks
//: and using only ascii chars.
const QString prefix = Tr::tr("untitled");
for (unsigned i = 0; ; ++i) {
QString name = prefix;
if (i)
name += QString::number(i);
if (!pathDir.exists(name))
return name;
}
return prefix;
}
void BaseProjectWizardDialog::addExtensionPages(const QList<QWizardPage *> &wizardPageList)
{
for (QWizardPage *p : wizardPageList)
addPage(p);
}
Id BaseProjectWizardDialog::selectedPlatform() const
{
return d->selectedPlatform;
}
void BaseProjectWizardDialog::setSelectedPlatform(Id platform)
{
d->selectedPlatform = platform;
}
QSet<Id> BaseProjectWizardDialog::requiredFeatures() const
{
return d->requiredFeatureSet;
}
void BaseProjectWizardDialog::setRequiredFeatures(const QSet<Id> &featureSet)
{
d->requiredFeatureSet = featureSet;
}
} // namespace ProjectExplorer