Utils: Allow more finegrained subaspect ownership in AspectContainer

Currently this luckily conincides with the register/addAspect schism
but that's not necessarily true in the future.

Change-Id: I05a59d74182dbdf81193ebd790d6f9bab2d30439
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
hjk
2023-05-24 10:49:48 +02:00
parent 3541b692f5
commit 320064f431
5 changed files with 8 additions and 19 deletions

View File

@@ -2399,9 +2399,9 @@ namespace Internal {
class AspectContainerPrivate class AspectContainerPrivate
{ {
public: public:
QList<BaseAspect *> m_items; // Not owned QList<BaseAspect *> m_items; // Both owned and non-owned.
QList<BaseAspect *> m_ownedItems; // Owned only.
bool m_autoApply = true; bool m_autoApply = true;
bool m_ownsSubAspects = false;
QStringList m_settingsGroup; QStringList m_settingsGroup;
}; };
@@ -2416,17 +2416,18 @@ AspectContainer::AspectContainer(QObject *parent)
*/ */
AspectContainer::~AspectContainer() AspectContainer::~AspectContainer()
{ {
if (d->m_ownsSubAspects) qDeleteAll(d->m_ownedItems);
qDeleteAll(d->m_items);
} }
/*! /*!
\internal \internal
*/ */
void AspectContainer::registerAspect(BaseAspect *aspect) void AspectContainer::registerAspect(BaseAspect *aspect, bool takeOwnership)
{ {
aspect->setAutoApply(d->m_autoApply); aspect->setAutoApply(d->m_autoApply);
d->m_items.append(aspect); d->m_items.append(aspect);
if (takeOwnership)
d->m_ownedItems.append(aspect);
} }
void AspectContainer::registerAspects(const AspectContainer &aspects) void AspectContainer::registerAspects(const AspectContainer &aspects)
@@ -2547,11 +2548,6 @@ void AspectContainer::setAutoApply(bool on)
aspect->setAutoApply(on); aspect->setAutoApply(on);
} }
void AspectContainer::setOwnsSubAspects(bool on)
{
d->m_ownsSubAspects = on;
}
bool AspectContainer::isDirty() const bool AspectContainer::isDirty() const
{ {
for (BaseAspect *aspect : std::as_const(d->m_items)) { for (BaseAspect *aspect : std::as_const(d->m_items)) {

View File

@@ -651,14 +651,14 @@ public:
AspectContainer(const AspectContainer &) = delete; AspectContainer(const AspectContainer &) = delete;
AspectContainer &operator=(const AspectContainer &) = delete; AspectContainer &operator=(const AspectContainer &) = delete;
void registerAspect(BaseAspect *aspect); void registerAspect(BaseAspect *aspect, bool takeOwnership = false);
void registerAspects(const AspectContainer &aspects); void registerAspects(const AspectContainer &aspects);
template <class Aspect, typename ...Args> template <class Aspect, typename ...Args>
Aspect *addAspect(Args && ...args) Aspect *addAspect(Args && ...args)
{ {
auto aspect = new Aspect(args...); auto aspect = new Aspect(args...);
registerAspect(aspect); registerAspect(aspect, true);
return aspect; return aspect;
} }
@@ -679,7 +679,6 @@ public:
bool equals(const AspectContainer &other) const; bool equals(const AspectContainer &other) const;
void copyFrom(const AspectContainer &other); void copyFrom(const AspectContainer &other);
void setAutoApply(bool on); void setAutoApply(bool on);
void setOwnsSubAspects(bool on);
bool isDirty() const; bool isDirty() const;
template <typename T> T *aspect() const template <typename T> T *aspect() const

View File

@@ -21,8 +21,6 @@ public:
CopyStepBase(BuildStepList *bsl, Id id) CopyStepBase(BuildStepList *bsl, Id id)
: BuildStep(bsl, id) : BuildStep(bsl, id)
{ {
setOwnsSubAspects(false);
m_sourceAspect.setSettingsKey(SOURCE_KEY); m_sourceAspect.setSettingsKey(SOURCE_KEY);
m_sourceAspect.setLabelText(Tr::tr("Source:")); m_sourceAspect.setLabelText(Tr::tr("Source:"));

View File

@@ -22,8 +22,6 @@ ProjectConfiguration::ProjectConfiguration(QObject *parent, Utils::Id id)
: AspectContainer(parent) : AspectContainer(parent)
, m_id(id) , m_id(id)
{ {
setOwnsSubAspects(true);
QTC_CHECK(parent); QTC_CHECK(parent);
QTC_CHECK(id.isValid()); QTC_CHECK(id.isValid());
setObjectName(id.toString()); setObjectName(id.toString());

View File

@@ -34,8 +34,6 @@ PySideBuildStepFactory::PySideBuildStepFactory()
PySideBuildStep::PySideBuildStep(BuildStepList *bsl, Id id) PySideBuildStep::PySideBuildStep(BuildStepList *bsl, Id id)
: AbstractProcessStep(bsl, id) : AbstractProcessStep(bsl, id)
{ {
setOwnsSubAspects(false);
m_pysideProject.setSettingsKey("Python.PySideProjectTool"); m_pysideProject.setSettingsKey("Python.PySideProjectTool");
m_pysideProject.setLabelText(Tr::tr("PySide project tool:")); m_pysideProject.setLabelText(Tr::tr("PySide project tool:"));
m_pysideProject.setToolTip(Tr::tr("Enter location of PySide project tool.")); m_pysideProject.setToolTip(Tr::tr("Enter location of PySide project tool."));