ProjectExplorer: Manually check whether a runconfig has a creator

This is used in ProjectConfigurationModel::data()

Constructing the full list is comparatively expensive, and the extra
decoration is not needed.

Change-Id: I5b6c76376f806ea92444916a87d1f2e671e16d5f
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-10-17 15:06:41 +02:00
parent 879692381f
commit 058a931d27
3 changed files with 30 additions and 9 deletions

View File

@@ -93,9 +93,9 @@ QVariant ProjectConfigurationModel::data(const QModelIndex &index, int role) con
{
if (index.row() >= m_projectConfigurations.size())
return {};
ProjectConfiguration * const config = m_projectConfigurations.at(index.row());
if (role == Qt::DisplayRole) {
ProjectConfiguration * const config = m_projectConfigurations.at(index.row());
QString displayName = config->expandedDisplayName();
if (const auto rc = qobject_cast<RunConfiguration *>(config); rc && !rc->hasCreator())
displayName += QString(" [%1]").arg(Tr::tr("unavailable"));

View File

@@ -140,6 +140,8 @@ void GlobalOrProjectAspect::resetProjectToGlobalSettings()
static std::vector<RunConfiguration::AspectFactory> theAspectFactories;
static QList<RunConfigurationFactory *> g_runConfigurationFactories;
RunConfiguration::RunConfiguration(Target *target, Utils::Id id)
: ProjectConfiguration(target, id)
{
@@ -236,10 +238,13 @@ bool RunConfiguration::isCustomized() const
bool RunConfiguration::hasCreator() const
{
return Utils::contains(RunConfigurationFactory::creatorsForTarget(target()),
[this](const RunConfigurationCreationInfo &info) {
return info.factory->runConfigurationId() == id() && info.buildKey == buildKey();
});
for (RunConfigurationFactory *factory : std::as_const(g_runConfigurationFactories)) {
if (factory->runConfigurationId() == id()) {
if (factory->supportsBuildKey(target(), buildKey()))
return true;
}
}
return false;
}
void RunConfiguration::setPristineState()
@@ -453,8 +458,6 @@ QVariantHash RunConfiguration::extraData() const
ExtensionSystem::IPlugin::initialize() method.
*/
static QList<RunConfigurationFactory *> g_runConfigurationFactories;
/*!
Constructs a RunConfigurationFactory instance and registers it into a global
list.
@@ -522,6 +525,14 @@ RunConfigurationFactory::availableCreators(Target *target) const
});
}
bool RunConfigurationFactory::supportsBuildKey(Target *target, const QString &key) const
{
if (!canHandle(target))
return false;
const QList<BuildTargetInfo> buildTargets = target->buildSystem()->applicationTargets();
return anyOf(buildTargets, [&key](const BuildTargetInfo &info) { return info.buildKey == key; });
}
/*!
Adds a device type for which this RunConfigurationFactory
can create RunConfigurations.
@@ -674,4 +685,11 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const
return {rci};
}
bool FixedRunConfigurationFactory::supportsBuildKey(Target *target, const QString &key) const
{
Q_UNUSED(target)
Q_UNUSED(key)
return false;
}
} // namespace ProjectExplorer

View File

@@ -197,6 +197,7 @@ public:
protected:
virtual QList<RunConfigurationCreationInfo> availableCreators(Target *target) const;
virtual bool supportsBuildKey(Target *target, const QString &key) const;
using RunConfigurationCreator = std::function<RunConfiguration *(Target *)>;
@@ -218,6 +219,7 @@ private:
RunConfiguration *create(Target *target) const;
friend class RunConfigurationCreationInfo;
friend class RunConfiguration;
RunConfigurationCreator m_creator;
Utils::Id m_runConfigurationId;
QList<Utils::Id> m_supportedProjectTypes;
@@ -231,9 +233,10 @@ public:
explicit FixedRunConfigurationFactory(const QString &displayName,
bool addDeviceName = false);
QList<RunConfigurationCreationInfo> availableCreators(Target *parent) const override;
private:
QList<RunConfigurationCreationInfo> availableCreators(Target *parent) const override;
bool supportsBuildKey(Target *target, const QString &key) const override;
const QString m_fixedBuildTarget;
const bool m_decorateTargetName;
};