ProjectExplorer: Streamline build step creation via menu

Change-Id: I801031d5a3d3ad8d8e5cf61766ca4e9791d7a96c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2020-08-18 11:28:40 +02:00
parent d3c31917aa
commit fb262ce24d
4 changed files with 23 additions and 35 deletions

View File

@@ -463,12 +463,9 @@ Utils::Id BuildStepFactory::stepId() const
return m_info.id; return m_info.id;
} }
BuildStep *BuildStepFactory::create(BuildStepList *parent, Utils::Id id) BuildStep *BuildStepFactory::create(BuildStepList *parent)
{ {
BuildStep *bs = nullptr; return m_info.creator(parent);
if (id == m_info.id)
bs = m_info.creator(parent);
return bs;
} }
BuildStep *BuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map) BuildStep *BuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map)

View File

@@ -186,7 +186,7 @@ public:
BuildStepInfo stepInfo() const; BuildStepInfo stepInfo() const;
Utils::Id stepId() const; Utils::Id stepId() const;
BuildStep *create(BuildStepList *parent, Utils::Id id); BuildStep *create(BuildStepList *parent);
BuildStep *restore(BuildStepList *parent, const QVariantMap &map); BuildStep *restore(BuildStepList *parent, const QVariantMap &map);
bool canHandle(BuildStepList *bsl) const; bool canHandle(BuildStepList *bsl) const;

View File

@@ -167,7 +167,9 @@ void BuildStepList::insertStep(int position, BuildStep *step)
void BuildStepList::insertStep(int position, Utils::Id stepId) void BuildStepList::insertStep(int position, Utils::Id stepId)
{ {
for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) { for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) {
if (BuildStep *step = factory->create(this, stepId)) { if (factory->stepId() == stepId) {
BuildStep *step = factory->create(this);
QTC_ASSERT(step, break);
insertStep(position, step); insertStep(position, step);
return; return;
} }

View File

@@ -253,37 +253,26 @@ void BuildStepListWidget::updateEnabledState()
void BuildStepListWidget::updateAddBuildStepMenu() void BuildStepListWidget::updateAddBuildStepMenu()
{ {
QMap<QString, QPair<Utils::Id, BuildStepFactory *> > map;
//Build up a list of possible steps and save map the display names to the (internal) name and factories.
for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) {
if (factory->canHandle(m_buildStepList)) {
const BuildStepInfo &info = factory->stepInfo();
if (info.flags & BuildStepInfo::Uncreatable)
continue;
if ((info.flags & BuildStepInfo::UniqueStep) && m_buildStepList->contains(info.id))
continue;
map.insert(info.displayName, qMakePair(info.id, factory));
}
}
// Ask the user which one to add
QMenu *menu = m_addButton->menu(); QMenu *menu = m_addButton->menu();
menu->clear(); menu->clear();
if (!map.isEmpty()) {
QMap<QString, QPair<Utils::Id, BuildStepFactory *> >::const_iterator it, end;
end = map.constEnd();
for (it = map.constBegin(); it != end; ++it) {
QAction *action = menu->addAction(it.key());
BuildStepFactory *factory = it.value().second;
Utils::Id id = it.value().first;
connect(action, &QAction::triggered, [id, factory, this]() { for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) {
BuildStep *newStep = factory->create(m_buildStepList, id); if (!factory->canHandle(m_buildStepList))
QTC_ASSERT(newStep, return); continue;
int pos = m_buildStepList->count();
m_buildStepList->insertStep(pos, newStep); const BuildStepInfo &info = factory->stepInfo();
}); if (info.flags & BuildStepInfo::Uncreatable)
} continue;
if ((info.flags & BuildStepInfo::UniqueStep) && m_buildStepList->contains(info.id))
continue;
QAction *action = menu->addAction(info.displayName);
connect(action, &QAction::triggered, this, [factory, this] {
BuildStep *newStep = factory->create(m_buildStepList);
QTC_ASSERT(newStep, return);
m_buildStepList->appendStep(newStep);
});
} }
} }