forked from qt-creator/qt-creator
ProjectExplorer: Copy more RunConfiguration data to RunControl
The aspects are now responsible for defining what data needs to be copied and also to provide a suitable interface (kind of source-compatible to direct use) for access. The important change here is that RunControl::aspect(...) doesn't need to access RunControl::runConfiguration() in fully aspectified RunConfigurations anymore. In not-fully aspectified the runConfig access is moved to the user code to make the problem visible there. Long term, aspectification should be finished. As an additional benefit, the resolving of macros etc can now be done at the correct time. Change-Id: I690d9f8f696ce9b4efd42082ba3f81b514efcb77 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -82,6 +82,9 @@ public:
|
||||
int m_spanY = 1;
|
||||
BaseAspect::ConfigWidgetCreator m_configWidgetCreator;
|
||||
QList<QPointer<QWidget>> m_subWidgets;
|
||||
|
||||
BaseAspect::DataCreator m_dataCreator;
|
||||
QList<BaseAspect::DataExtractor> m_dataExtractors;
|
||||
};
|
||||
|
||||
} // Internal
|
||||
@@ -110,7 +113,9 @@ public:
|
||||
*/
|
||||
BaseAspect::BaseAspect()
|
||||
: d(new Internal::BaseAspectPrivate)
|
||||
{}
|
||||
{
|
||||
addDataExtractor(this, &BaseAspect::value, &Data::value);
|
||||
}
|
||||
|
||||
/*!
|
||||
Destructs a BaseAspect.
|
||||
@@ -772,6 +777,9 @@ StringAspect::StringAspect()
|
||||
{
|
||||
setDefaultValue(QString());
|
||||
setSpan(2, 1); // Default: Label + something
|
||||
|
||||
addDataExtractor(this, &StringAspect::value, &Data::value);
|
||||
addDataExtractor(this, &StringAspect::filePath, &Data::filePath);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1293,6 +1301,8 @@ BoolAspect::BoolAspect(const QString &settingsKey)
|
||||
setDefaultValue(false);
|
||||
setSettingsKey(settingsKey);
|
||||
setSpan(2, 1);
|
||||
|
||||
addDataExtractor(this, &BoolAspect::value, &Data::value);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1747,6 +1757,8 @@ IntegerAspect::IntegerAspect()
|
||||
{
|
||||
setDefaultValue(qint64(0));
|
||||
setSpan(2, 1);
|
||||
|
||||
addDataExtractor(this, &IntegerAspect::value, &Data::value);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -2378,4 +2390,43 @@ void AspectContainer::forEachAspect(const std::function<void(BaseAspect *)> &run
|
||||
}
|
||||
}
|
||||
|
||||
BaseAspect::Data *BaseAspect::extractData(const MacroExpander *expander) const
|
||||
{
|
||||
QTC_ASSERT(d->m_dataCreator, return nullptr);
|
||||
Data *data = d->m_dataCreator();
|
||||
data->m_classId = metaObject();
|
||||
data->m_id = id();
|
||||
for (const DataExtractor &extractor : d->m_dataExtractors)
|
||||
extractor(data, expander);
|
||||
return data;
|
||||
}
|
||||
|
||||
void BaseAspect::addDataExtractorHelper(const DataExtractor &extractor) const
|
||||
{
|
||||
d->m_dataExtractors.append(extractor);
|
||||
}
|
||||
|
||||
void BaseAspect::setDataCreatorHelper(const DataCreator &creator) const
|
||||
{
|
||||
d->m_dataCreator = creator;
|
||||
}
|
||||
|
||||
const BaseAspect::Data *AspectContainerData::aspect(Id instanceId) const
|
||||
{
|
||||
for (const BaseAspect::Data *data : m_data) {
|
||||
if (data->id() == instanceId)
|
||||
return data;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const BaseAspect::Data *AspectContainerData::aspect(BaseAspect::Data::ClassId classId) const
|
||||
{
|
||||
for (const BaseAspect::Data *data : m_data) {
|
||||
if (data->classId() == classId)
|
||||
return data;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace Utils
|
||||
|
||||
Reference in New Issue
Block a user