ProjectExplorer: Allow an extraInit function to be called

... when BuildSteps are created. Potentially useful to tweak
step behavior without the need to inherit or such.

Change-Id: I8c8e9bdec84fafc454db9dc9a492d399b00b7f57
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Dominik Holland
2023-12-20 10:30:31 +01:00
parent 5b69d70d10
commit eccc244537
3 changed files with 24 additions and 6 deletions

View File

@@ -3,6 +3,8 @@
#pragma once #pragma once
#include <qglobal.h>
#include "cmakeabstractprocessstep.h" #include "cmakeabstractprocessstep.h"
#include <utils/treemodel.h> #include <utils/treemodel.h>
@@ -39,7 +41,7 @@ public:
CMakeBuildStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id); CMakeBuildStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id);
QStringList buildTargets() const; QStringList buildTargets() const;
void setBuildTargets(const QStringList &target); void setBuildTargets(const QStringList &target) override;
bool buildsBuildTarget(const QString &target) const; bool buildsBuildTarget(const QString &target) const;
void setBuildsBuildTarget(const QString &target, bool on); void setBuildsBuildTarget(const QString &target, bool on);

View File

@@ -349,6 +349,11 @@ void BuildStepFactory::setFlags(BuildStep::Flags flags)
m_flags = flags; m_flags = flags;
} }
void BuildStepFactory::setExtraInit(const std::function<void (BuildStep *)> &extraInit)
{
m_extraInit = extraInit;
}
void BuildStepFactory::setSupportedStepList(Id id) void BuildStepFactory::setSupportedStepList(Id id)
{ {
m_supportedStepLists = {id}; m_supportedStepLists = {id};
@@ -392,7 +397,7 @@ Id BuildStepFactory::stepId() const
BuildStep *BuildStepFactory::create(BuildStepList *parent) BuildStep *BuildStepFactory::create(BuildStepList *parent)
{ {
QTC_ASSERT(m_creator, return nullptr); QTC_ASSERT(m_creator, return nullptr);
BuildStep *step = m_creator(parent); BuildStep *step = m_creator(this, parent);
step->setDefaultDisplayName(m_displayName); step->setDefaultDisplayName(m_displayName);
return step; return step;
} }

View File

@@ -76,6 +76,8 @@ public:
QString summaryText() const; QString summaryText() const;
QWidget *doCreateConfigWidget(); QWidget *doCreateConfigWidget();
virtual void setBuildTargets(const QStringList &) {}
signals: signals:
void updateSummary(); void updateSummary();
@@ -143,15 +145,22 @@ public:
QString displayName() const; QString displayName() const;
protected: virtual void setBuildTargets(const QStringList &) const {}
using BuildStepCreator = std::function<BuildStep *(BuildStepList *)>;
template <class BuildStepType> protected:
using BuildStepCreator = std::function<BuildStep *(BuildStepFactory *bsf, BuildStepList *)>;
template <typename BuildStepType>
void registerStep(Utils::Id id) void registerStep(Utils::Id id)
{ {
QTC_CHECK(!m_creator); QTC_CHECK(!m_creator);
m_stepId = id; m_stepId = id;
m_creator = [id](BuildStepList *bsl) { return new BuildStepType(bsl, id); }; m_creator = [id, this](BuildStepFactory *bsf, BuildStepList *bsl) {
auto bs = new BuildStepType(bsl, id);
if (bsf->m_extraInit)
bsf->m_extraInit(bs);
return bs;
};
} }
void cloneStepCreator(Utils::Id exitstingStepId, Utils::Id overrideNewStepId = {}); void cloneStepCreator(Utils::Id exitstingStepId, Utils::Id overrideNewStepId = {});
@@ -164,6 +173,7 @@ protected:
void setRepeatable(bool on) { m_isRepeatable = on; } void setRepeatable(bool on) { m_isRepeatable = on; }
void setDisplayName(const QString &displayName); void setDisplayName(const QString &displayName);
void setFlags(BuildStep::Flags flags); void setFlags(BuildStep::Flags flags);
void setExtraInit(const std::function<void(BuildStep *)> &extraInit);
private: private:
Utils::Id m_stepId; Utils::Id m_stepId;
@@ -176,6 +186,7 @@ private:
QList<Utils::Id> m_supportedStepLists; QList<Utils::Id> m_supportedStepLists;
Utils::Id m_supportedConfiguration; Utils::Id m_supportedConfiguration;
bool m_isRepeatable = true; bool m_isRepeatable = true;
std::function<void(BuildStep *)> m_extraInit;
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer