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;
}
BuildStep *BuildStepFactory::create(BuildStepList *parent, Utils::Id id)
BuildStep *BuildStepFactory::create(BuildStepList *parent)
{
BuildStep *bs = nullptr;
if (id == m_info.id)
bs = m_info.creator(parent);
return bs;
return m_info.creator(parent);
}
BuildStep *BuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map)

View File

@@ -186,7 +186,7 @@ public:
BuildStepInfo stepInfo() const;
Utils::Id stepId() const;
BuildStep *create(BuildStepList *parent, Utils::Id id);
BuildStep *create(BuildStepList *parent);
BuildStep *restore(BuildStepList *parent, const QVariantMap &map);
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)
{
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);
return;
}

View File

@@ -253,38 +253,27 @@ void BuildStepListWidget::updateEnabledState()
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.
QMenu *menu = m_addButton->menu();
menu->clear();
for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) {
if (factory->canHandle(m_buildStepList)) {
if (!factory->canHandle(m_buildStepList))
continue;
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();
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]() {
BuildStep *newStep = factory->create(m_buildStepList, id);
QAction *action = menu->addAction(info.displayName);
connect(action, &QAction::triggered, this, [factory, this] {
BuildStep *newStep = factory->create(m_buildStepList);
QTC_ASSERT(newStep, return);
int pos = m_buildStepList->count();
m_buildStepList->insertStep(pos, newStep);
m_buildStepList->appendStep(newStep);
});
}
}
}
void BuildStepListWidget::addBuildStep(int pos)