ProjectExplorer: Pimpl BuildConfiguration

It's quite fat already and will own the BuildSystem later.

Change-Id: I5b9edd27fbd485b4e2b74cd9c57084d2874089bb
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-10-21 14:47:17 +02:00
parent ab36004fdc
commit b00e82c3e8
2 changed files with 106 additions and 69 deletions

View File

@@ -62,9 +62,31 @@ static const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.BuildConfigu
static const char BUILDDIRECTORY_KEY[] = "ProjectExplorer.BuildConfiguration.BuildDirectory"; static const char BUILDDIRECTORY_KEY[] = "ProjectExplorer.BuildConfiguration.BuildDirectory";
namespace ProjectExplorer { namespace ProjectExplorer {
namespace Internal {
class BuildConfigurationPrivate
{
public:
bool m_clearSystemEnvironment = false;
Utils::EnvironmentItems m_userEnvironmentChanges;
QList<BuildStepList *> m_stepLists;
ProjectExplorer::BaseStringAspect *m_buildDirectoryAspect = nullptr;
Utils::FilePath m_lastEmittedBuildDirectory;
mutable Utils::Environment m_cachedEnvironment;
QString m_configWidgetDisplayName;
bool m_configWidgetHasFrame = false;
// FIXME: Remove.
BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown;
Utils::FilePath m_initialBuildDirectory;
QString m_initialDisplayName;
QVariant m_extraInfo;
};
} // Internal
BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) BuildConfiguration::BuildConfiguration(Target *target, Core::Id id)
: ProjectConfiguration(target, id) : ProjectConfiguration(target, id), d(new Internal::BuildConfigurationPrivate)
{ {
QTC_CHECK(target && target == this->target()); QTC_CHECK(target && target == this->target());
Utils::MacroExpander *expander = macroExpander(); Utils::MacroExpander *expander = macroExpander();
@@ -91,18 +113,18 @@ BuildConfiguration::BuildConfiguration(Target *target, Core::Id id)
connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged, connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged,
this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged); this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged);
m_buildDirectoryAspect = addAspect<BaseStringAspect>(); d->m_buildDirectoryAspect = addAspect<BaseStringAspect>();
m_buildDirectoryAspect->setSettingsKey(BUILDDIRECTORY_KEY); d->m_buildDirectoryAspect->setSettingsKey(BUILDDIRECTORY_KEY);
m_buildDirectoryAspect->setLabelText(tr("Build directory:")); d->m_buildDirectoryAspect->setLabelText(tr("Build directory:"));
m_buildDirectoryAspect->setDisplayStyle(BaseStringAspect::PathChooserDisplay); d->m_buildDirectoryAspect->setDisplayStyle(BaseStringAspect::PathChooserDisplay);
m_buildDirectoryAspect->setExpectedKind(Utils::PathChooser::Directory); d->m_buildDirectoryAspect->setExpectedKind(Utils::PathChooser::Directory);
m_buildDirectoryAspect->setBaseFileName(target->project()->projectDirectory()); d->m_buildDirectoryAspect->setBaseFileName(target->project()->projectDirectory());
m_buildDirectoryAspect->setEnvironment(environment()); d->m_buildDirectoryAspect->setEnvironment(environment());
connect(m_buildDirectoryAspect, &BaseStringAspect::changed, connect(d->m_buildDirectoryAspect, &BaseStringAspect::changed,
this, &BuildConfiguration::buildDirectoryChanged); this, &BuildConfiguration::buildDirectoryChanged);
connect(this, &BuildConfiguration::environmentChanged, this, [this] { connect(this, &BuildConfiguration::environmentChanged, this, [this] {
m_buildDirectoryAspect->setEnvironment(environment()); d->m_buildDirectoryAspect->setEnvironment(environment());
this->target()->buildEnvironmentChanged(this); this->target()->buildEnvironmentChanged(this);
}); });
@@ -117,34 +139,39 @@ BuildConfiguration::BuildConfiguration(Target *target, Core::Id id)
}); });
} }
BuildConfiguration::~BuildConfiguration()
{
delete d;
}
Utils::FilePath BuildConfiguration::buildDirectory() const Utils::FilePath BuildConfiguration::buildDirectory() const
{ {
QString path = environment().expandVariables(m_buildDirectoryAspect->value().trimmed()); QString path = environment().expandVariables(d->m_buildDirectoryAspect->value().trimmed());
path = QDir::cleanPath(macroExpander()->expand(path)); path = QDir::cleanPath(macroExpander()->expand(path));
return Utils::FilePath::fromString(QDir::cleanPath(QDir(target()->project()->projectDirectory().toString()).absoluteFilePath(path))); return Utils::FilePath::fromString(QDir::cleanPath(QDir(target()->project()->projectDirectory().toString()).absoluteFilePath(path)));
} }
Utils::FilePath BuildConfiguration::rawBuildDirectory() const Utils::FilePath BuildConfiguration::rawBuildDirectory() const
{ {
return m_buildDirectoryAspect->filePath(); return d->m_buildDirectoryAspect->filePath();
} }
void BuildConfiguration::setBuildDirectory(const Utils::FilePath &dir) void BuildConfiguration::setBuildDirectory(const Utils::FilePath &dir)
{ {
if (dir == m_buildDirectoryAspect->filePath()) if (dir == d->m_buildDirectoryAspect->filePath())
return; return;
m_buildDirectoryAspect->setFilePath(dir); d->m_buildDirectoryAspect->setFilePath(dir);
emitBuildDirectoryChanged(); emitBuildDirectoryChanged();
} }
NamedWidget *BuildConfiguration::createConfigWidget() NamedWidget *BuildConfiguration::createConfigWidget()
{ {
NamedWidget *named = new NamedWidget; NamedWidget *named = new NamedWidget;
named->setDisplayName(m_configWidgetDisplayName); named->setDisplayName(d->m_configWidgetDisplayName);
QWidget *widget = nullptr; QWidget *widget = nullptr;
if (m_configWidgetHasFrame) { if (d->m_configWidgetHasFrame) {
auto container = new Utils::DetailsWidget(named); auto container = new Utils::DetailsWidget(named);
widget = new QWidget(container); widget = new QWidget(container);
container->setState(Utils::DetailsWidget::NoSummary); container->setState(Utils::DetailsWidget::NoSummary);
@@ -170,8 +197,8 @@ NamedWidget *BuildConfiguration::createConfigWidget()
void BuildConfiguration::initialize() void BuildConfiguration::initialize()
{ {
m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_BUILD)); d->m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_BUILD));
m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_CLEAN)); d->m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_CLEAN));
} }
QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets() QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets()
@@ -181,36 +208,36 @@ QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets()
QList<Core::Id> BuildConfiguration::knownStepLists() const QList<Core::Id> BuildConfiguration::knownStepLists() const
{ {
return Utils::transform(m_stepLists, &BuildStepList::id); return Utils::transform(d->m_stepLists, &BuildStepList::id);
} }
BuildStepList *BuildConfiguration::stepList(Core::Id id) const BuildStepList *BuildConfiguration::stepList(Core::Id id) const
{ {
return Utils::findOrDefault(m_stepLists, Utils::equal(&BuildStepList::id, id)); return Utils::findOrDefault(d->m_stepLists, Utils::equal(&BuildStepList::id, id));
} }
QVariantMap BuildConfiguration::toMap() const QVariantMap BuildConfiguration::toMap() const
{ {
QVariantMap map(ProjectConfiguration::toMap()); QVariantMap map(ProjectConfiguration::toMap());
map.insert(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY), m_clearSystemEnvironment); map.insert(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY), d->m_clearSystemEnvironment);
map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), Utils::EnvironmentItem::toStringList(m_userEnvironmentChanges)); map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), Utils::EnvironmentItem::toStringList(d->m_userEnvironmentChanges));
map.insert(QLatin1String(BUILD_STEP_LIST_COUNT), m_stepLists.count()); map.insert(QLatin1String(BUILD_STEP_LIST_COUNT), d->m_stepLists.count());
for (int i = 0; i < m_stepLists.count(); ++i) for (int i = 0; i < d->m_stepLists.count(); ++i)
map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QString::number(i), m_stepLists.at(i)->toMap()); map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QString::number(i), d->m_stepLists.at(i)->toMap());
return map; return map;
} }
bool BuildConfiguration::fromMap(const QVariantMap &map) bool BuildConfiguration::fromMap(const QVariantMap &map)
{ {
m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool(); d->m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool();
m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList()); d->m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
updateCacheAndEmitEnvironmentChanged(); updateCacheAndEmitEnvironmentChanged();
qDeleteAll(m_stepLists); qDeleteAll(d->m_stepLists);
m_stepLists.clear(); d->m_stepLists.clear();
int maxI = map.value(QLatin1String(BUILD_STEP_LIST_COUNT), 0).toInt(); int maxI = map.value(QLatin1String(BUILD_STEP_LIST_COUNT), 0).toInt();
for (int i = 0; i < maxI; ++i) { for (int i = 0; i < maxI; ++i) {
@@ -225,7 +252,7 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
delete list; delete list;
return false; return false;
} }
m_stepLists.append(list); d->m_stepLists.append(list);
} }
// We currently assume there to be at least a clean and build list! // We currently assume there to be at least a clean and build list!
@@ -239,48 +266,53 @@ void BuildConfiguration::updateCacheAndEmitEnvironmentChanged()
{ {
Utils::Environment env = baseEnvironment(); Utils::Environment env = baseEnvironment();
env.modify(userEnvironmentChanges()); env.modify(userEnvironmentChanges());
if (env == m_cachedEnvironment) if (env == d->m_cachedEnvironment)
return; return;
m_cachedEnvironment = env; d->m_cachedEnvironment = env;
emit environmentChanged(); // might trigger buildDirectoryChanged signal! emit environmentChanged(); // might trigger buildDirectoryChanged signal!
} }
void BuildConfiguration::emitBuildDirectoryChanged() void BuildConfiguration::emitBuildDirectoryChanged()
{ {
if (buildDirectory() != m_lastEmmitedBuildDirectory) { if (buildDirectory() != d->m_lastEmittedBuildDirectory) {
m_lastEmmitedBuildDirectory = buildDirectory(); d->m_lastEmittedBuildDirectory = buildDirectory();
emit buildDirectoryChanged(); emit buildDirectoryChanged();
} }
} }
QString BuildConfiguration::initialDisplayName() const QString BuildConfiguration::initialDisplayName() const
{ {
return m_initialDisplayName; return d->m_initialDisplayName;
}
QVariant BuildConfiguration::extraInfo() const
{
return d->m_extraInfo;
} }
ProjectExplorer::BaseStringAspect *BuildConfiguration::buildDirectoryAspect() const ProjectExplorer::BaseStringAspect *BuildConfiguration::buildDirectoryAspect() const
{ {
return m_buildDirectoryAspect; return d->m_buildDirectoryAspect;
} }
void BuildConfiguration::setConfigWidgetDisplayName(const QString &display) void BuildConfiguration::setConfigWidgetDisplayName(const QString &display)
{ {
m_configWidgetDisplayName = display; d->m_configWidgetDisplayName = display;
} }
void BuildConfiguration::setBuildDirectoryHistoryCompleter(const QString &history) void BuildConfiguration::setBuildDirectoryHistoryCompleter(const QString &history)
{ {
m_buildDirectoryAspect->setHistoryCompleter(history); d->m_buildDirectoryAspect->setHistoryCompleter(history);
} }
void BuildConfiguration::setConfigWidgetHasFrame(bool configWidgetHasFrame) void BuildConfiguration::setConfigWidgetHasFrame(bool configWidgetHasFrame)
{ {
m_configWidgetHasFrame = configWidgetHasFrame; d->m_configWidgetHasFrame = configWidgetHasFrame;
} }
void BuildConfiguration::setBuildDirectorySettingsKey(const QString &key) void BuildConfiguration::setBuildDirectorySettingsKey(const QString &key)
{ {
m_buildDirectoryAspect->setSettingsKey(key); d->m_buildDirectoryAspect->setSettingsKey(key);
} }
Utils::Environment BuildConfiguration::baseEnvironment() const Utils::Environment BuildConfiguration::baseEnvironment() const
@@ -303,14 +335,14 @@ QString BuildConfiguration::baseEnvironmentText() const
Utils::Environment BuildConfiguration::environment() const Utils::Environment BuildConfiguration::environment() const
{ {
return m_cachedEnvironment; return d->m_cachedEnvironment;
} }
void BuildConfiguration::setUseSystemEnvironment(bool b) void BuildConfiguration::setUseSystemEnvironment(bool b)
{ {
if (useSystemEnvironment() == b) if (useSystemEnvironment() == b)
return; return;
m_clearSystemEnvironment = !b; d->m_clearSystemEnvironment = !b;
updateCacheAndEmitEnvironmentChanged(); updateCacheAndEmitEnvironmentChanged();
} }
@@ -321,19 +353,19 @@ void BuildConfiguration::addToEnvironment(Utils::Environment &env) const
bool BuildConfiguration::useSystemEnvironment() const bool BuildConfiguration::useSystemEnvironment() const
{ {
return !m_clearSystemEnvironment; return !d->m_clearSystemEnvironment;
} }
Utils::EnvironmentItems BuildConfiguration::userEnvironmentChanges() const Utils::EnvironmentItems BuildConfiguration::userEnvironmentChanges() const
{ {
return m_userEnvironmentChanges; return d->m_userEnvironmentChanges;
} }
void BuildConfiguration::setUserEnvironmentChanges(const Utils::EnvironmentItems &diff) void BuildConfiguration::setUserEnvironmentChanges(const Utils::EnvironmentItems &diff)
{ {
if (m_userEnvironmentChanges == diff) if (d->m_userEnvironmentChanges == diff)
return; return;
m_userEnvironmentChanges = diff; d->m_userEnvironmentChanges = diff;
updateCacheAndEmitEnvironmentChanged(); updateCacheAndEmitEnvironmentChanged();
} }
@@ -357,6 +389,21 @@ bool BuildConfiguration::regenerateBuildFiles(Node *node)
return false; return false;
} }
BuildConfiguration::BuildType BuildConfiguration::buildType() const
{
return d->m_initialBuildType;
}
BuildConfiguration::BuildType BuildConfiguration::initialBuildType() const
{
return d->m_initialBuildType;
}
FilePath BuildConfiguration::initialBuildDirectory() const
{
return d->m_initialBuildDirectory;
}
QString BuildConfiguration::buildTypeName(BuildConfiguration::BuildType type) QString BuildConfiguration::buildTypeName(BuildConfiguration::BuildType type)
{ {
switch (type) { switch (type) {
@@ -510,10 +557,10 @@ BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const Buil
bc->setDefaultDisplayName(info.displayName); bc->setDefaultDisplayName(info.displayName);
bc->setBuildDirectory(info.buildDirectory); bc->setBuildDirectory(info.buildDirectory);
bc->m_initialBuildType = info.buildType; bc->d->m_initialBuildType = info.buildType;
bc->m_initialDisplayName = info.displayName; bc->d->m_initialDisplayName = info.displayName;
bc->m_initialBuildDirectory = info.buildDirectory; bc->d->m_initialBuildDirectory = info.buildDirectory;
bc->m_extraInfo = info.extraInfo; bc->d->m_extraInfo = info.extraInfo;
bc->initialize(); bc->initialize();

View File

@@ -34,6 +34,8 @@
namespace ProjectExplorer { namespace ProjectExplorer {
namespace Internal { class BuildConfigurationPrivate; }
class BaseStringAspect; class BaseStringAspect;
class BuildInfo; class BuildInfo;
class BuildStepList; class BuildStepList;
@@ -51,6 +53,8 @@ protected:
explicit BuildConfiguration(Target *target, Core::Id id); explicit BuildConfiguration(Target *target, Core::Id id);
public: public:
~BuildConfiguration();
Utils::FilePath buildDirectory() const; Utils::FilePath buildDirectory() const;
Utils::FilePath rawBuildDirectory() const; Utils::FilePath rawBuildDirectory() const;
void setBuildDirectory(const Utils::FilePath &dir); void setBuildDirectory(const Utils::FilePath &dir);
@@ -86,12 +90,12 @@ public:
Profile, Profile,
Release Release
}; };
virtual BuildType buildType() const { return m_initialBuildType; } virtual BuildType buildType() const;
BuildType initialBuildType() const { return m_initialBuildType; } // FIXME: Remove. BuildType initialBuildType() const; // FIXME: Remove.
Utils::FilePath initialBuildDirectory() const { return m_initialBuildDirectory; } // FIXME: Remove. Utils::FilePath initialBuildDirectory() const; // FIXME: Remove.
QString initialDisplayName() const; // FIXME: Remove. QString initialDisplayName() const; // FIXME: Remove.
QVariant extraInfo() const { return m_extraInfo; } // FIXME: Remove. QVariant extraInfo() const; // FIXME: Remove.
static QString buildTypeName(BuildType type); static QString buildTypeName(BuildType type);
@@ -117,21 +121,7 @@ protected:
private: private:
void emitBuildDirectoryChanged(); void emitBuildDirectoryChanged();
Internal::BuildConfigurationPrivate *d = nullptr;
bool m_clearSystemEnvironment = false;
Utils::EnvironmentItems m_userEnvironmentChanges;
QList<BuildStepList *> m_stepLists;
ProjectExplorer::BaseStringAspect *m_buildDirectoryAspect = nullptr;
Utils::FilePath m_lastEmmitedBuildDirectory;
mutable Utils::Environment m_cachedEnvironment;
QString m_configWidgetDisplayName;
bool m_configWidgetHasFrame = false;
// FIXME: Remove.
BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown;
Utils::FilePath m_initialBuildDirectory;
QString m_initialDisplayName;
QVariant m_extraInfo;
}; };
class PROJECTEXPLORER_EXPORT BuildConfigurationFactory : public QObject class PROJECTEXPLORER_EXPORT BuildConfigurationFactory : public QObject