From 4cc6fef901f08ccd4470e94b12e1e360ec8c09d4 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 31 Mar 2021 08:57:26 +0200 Subject: [PATCH] Utils: Merge BaseAspects and AspectContainer They were quite similar, largest difference was the ownership of subaspects, which is now handled by a bool property. Change-Id: Ib3f2f20b9a84ef40ea8a9eb59da9c89c9a281750 Reviewed-by: Christian Kandeler --- src/libs/utils/aspects.cpp | 93 ++++++++----------- src/libs/utils/aspects.h | 84 +++++++---------- .../projectexplorer/projectconfiguration.cpp | 2 + .../projectexplorer/projectconfiguration.h | 4 +- .../projectexplorer/runconfiguration.cpp | 2 +- .../runconfigurationaspects.cpp | 2 +- .../projectexplorer/runconfigurationaspects.h | 2 +- src/plugins/qtsupport/qtbuildaspects.cpp | 2 +- src/plugins/qtsupport/qtbuildaspects.h | 2 +- 9 files changed, 80 insertions(+), 113 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 5e96b9fe4a8..69894552fd5 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -551,61 +551,9 @@ QVariant BaseAspect::fromSettingsValue(const QVariant &val) const /*! \internal */ -void BaseAspect::acquaintSiblings(const BaseAspects &) +void BaseAspect::acquaintSiblings(const AspectContainer &) {} -// BaseAspects - -/*! - \class BaseAspects - \inmodule QtCreator - - \brief This class represent a collection of one or more aspects. - - A BaseAspects object assumes ownership on its aspects. -*/ - -/*! - Constructs a BaseAspects object. -*/ -BaseAspects::BaseAspects() = default; - -/*! - Destructs a BaseAspects object. -*/ -BaseAspects::~BaseAspects() -{ - qDeleteAll(m_aspects); -} - -/*! - Retrieves a BaseAspect with a given \a id, or nullptr if no such aspect is contained. - - \sa BaseAspect. -*/ -BaseAspect *BaseAspects::aspect(Utils::Id id) const -{ - return Utils::findOrDefault(m_aspects, Utils::equal(&BaseAspect::id, id)); -} - -/*! - \internal -*/ -void BaseAspects::fromMap(const QVariantMap &map) const -{ - for (BaseAspect *aspect : m_aspects) - aspect->fromMap(map); -} - -/*! - \internal -*/ -void BaseAspects::toMap(QVariantMap &map) const -{ - for (BaseAspect *aspect : m_aspects) - aspect->toMap(map); -} - namespace Internal { class BoolAspectPrivate @@ -2109,6 +2057,8 @@ void TextDisplay::setText(const QString &message) \brief The AspectContainer class wraps one or more aspects while providing the interface of a single aspect. + + Sub-aspects ownership can be declared using \a setOwnsSubAspects. */ namespace Internal { @@ -2118,6 +2068,7 @@ class AspectContainerPrivate public: QList m_items; // Not owned bool m_autoApply = true; + bool m_ownsSubAspects = false; QStringList m_settingsGroup; }; @@ -2130,7 +2081,11 @@ AspectContainer::AspectContainer() /*! \reimp */ -AspectContainer::~AspectContainer() = default; +AspectContainer::~AspectContainer() +{ + if (d->m_ownsSubAspects) + qDeleteAll(d->m_items); +} /*! \internal @@ -2147,6 +2102,31 @@ void AspectContainer::registerAspects(const AspectContainer &aspects) registerAspect(aspect); } +/*! + Retrieves a BaseAspect with a given \a id, or nullptr if no such aspect is contained. + + \sa BaseAspect. +*/ +BaseAspect *AspectContainer::aspect(Id id) const +{ + return Utils::findOrDefault(d->m_items, Utils::equal(&BaseAspect::id, id)); +} + +AspectContainer::const_iterator AspectContainer::begin() const +{ + return d->m_items.begin(); +} + +AspectContainer::const_iterator AspectContainer::end() const +{ + return d->m_items.end(); +} + +const QList &AspectContainer::aspects() const +{ + return d->m_items; +} + void AspectContainer::fromMap(const QVariantMap &map) { for (BaseAspect *aspect : qAsConst(d->m_items)) @@ -2224,6 +2204,11 @@ void AspectContainer::setAutoApply(bool on) aspect->setAutoApply(on); } +void AspectContainer::setOwnsSubAspects(bool on) +{ + d->m_ownsSubAspects = on; +} + bool AspectContainer::isDirty() const { for (BaseAspect *aspect : qAsConst(d->m_items)) { diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index ab80a89a846..1fb02aae04b 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -42,7 +42,7 @@ QT_END_NAMESPACE namespace Utils { -class BaseAspects; +class AspectContainer; class LayoutBuilder; namespace Internal { @@ -109,7 +109,7 @@ public: virtual void fromMap(const QVariantMap &map); virtual void toMap(QVariantMap &map) const; virtual void toActiveMap(QVariantMap &map) const { toMap(map); } - virtual void acquaintSiblings(const BaseAspects &); + virtual void acquaintSiblings(const AspectContainer &); virtual void addToLayout(LayoutBuilder &builder); @@ -155,53 +155,6 @@ private: std::unique_ptr d; }; -class QTCREATOR_UTILS_EXPORT BaseAspects -{ - BaseAspects(const BaseAspects &) = delete; - BaseAspects &operator=(const BaseAspects &) = delete; - -public: - using const_iterator = QList::const_iterator; - using value_type = QList::value_type; - - BaseAspects(); - ~BaseAspects(); - - template - Aspect *addAspect(Args && ...args) - { - auto aspect = new Aspect(args...); - m_aspects.append(aspect); - return aspect; - } - - BaseAspect *aspect(Utils::Id id) const; - - template T *aspect() const - { - for (BaseAspect *aspect : m_aspects) - if (T *result = qobject_cast(aspect)) - return result; - return nullptr; - } - - template T *aspect(Utils::Id id) const - { - return qobject_cast(aspect(id)); - } - - void fromMap(const QVariantMap &map) const; - void toMap(QVariantMap &map) const; - - const_iterator begin() const { return m_aspects.begin(); } - const_iterator end() const { return m_aspects.end(); } - - void append(BaseAspect *const &aspect) { m_aspects.append(aspect); } - -private: - QList m_aspects; -}; - class QTCREATOR_UTILS_EXPORT BoolAspect : public BaseAspect { Q_OBJECT @@ -521,6 +474,12 @@ public: AspectContainer(); ~AspectContainer(); + AspectContainer(const AspectContainer &) = delete; + AspectContainer &operator=(const AspectContainer &) = delete; + + void registerAspect(BaseAspect *aspect); + void registerAspects(const AspectContainer &aspects); + template Aspect *addAspect(Args && ...args) { @@ -528,9 +487,6 @@ public: registerAspect(aspect); return aspect; } - void registerAspect(BaseAspect *aspect); - void registerAspects(const AspectContainer &aspects); - void fromMap(const QVariantMap &map); void toMap(QVariantMap &map) const; @@ -548,10 +504,34 @@ public: bool equals(const AspectContainer &other) const; void copyFrom(const AspectContainer &other); void setAutoApply(bool on); + void setOwnsSubAspects(bool on); bool isDirty() const; + template T *aspect() const + { + for (BaseAspect *aspect : aspects()) + if (T *result = qobject_cast(aspect)) + return result; + return nullptr; + } + + BaseAspect *aspect(Utils::Id id) const; + + template T *aspect(Utils::Id id) const + { + return qobject_cast(aspect(id)); + } + void forEachAspect(const std::function &run) const; + const QList &aspects() const; + + using const_iterator = QList::const_iterator; + using value_type = QList::value_type; + + const_iterator begin() const; + const_iterator end() const; + private: std::unique_ptr d; }; diff --git a/src/plugins/projectexplorer/projectconfiguration.cpp b/src/plugins/projectexplorer/projectconfiguration.cpp index 10490df8542..464d3ba5c19 100644 --- a/src/plugins/projectexplorer/projectconfiguration.cpp +++ b/src/plugins/projectexplorer/projectconfiguration.cpp @@ -43,6 +43,8 @@ ProjectConfiguration::ProjectConfiguration(QObject *parent, Utils::Id id) : QObject(parent) , m_id(id) { + m_aspects.setOwnsSubAspects(true); + QTC_CHECK(parent); QTC_CHECK(id.isValid()); setObjectName(id.toString()); diff --git a/src/plugins/projectexplorer/projectconfiguration.h b/src/plugins/projectexplorer/projectconfiguration.h index eb4cc325a6a..20200daa82f 100644 --- a/src/plugins/projectexplorer/projectconfiguration.h +++ b/src/plugins/projectexplorer/projectconfiguration.h @@ -82,7 +82,7 @@ public: return m_aspects.addAspect(std::forward(args)...); } - const Utils::BaseAspects &aspects() const { return m_aspects; } + const Utils::AspectContainer &aspects() const { return m_aspects; } Utils::BaseAspect *aspect(Utils::Id id) const; template T *aspect() const { return m_aspects.aspect(); } @@ -94,7 +94,7 @@ signals: void toolTipChanged(); protected: - Utils::BaseAspects m_aspects; + Utils::AspectContainer m_aspects; private: QPointer m_target; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 5dc3cd6593d..b6767eefcae 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -543,7 +543,7 @@ RunConfiguration *RunConfigurationFactory::create(Target *target) const // Add the universal aspects. for (const RunConfiguration::AspectFactory &factory : theAspectFactories) - rc->m_aspects.append(factory(target)); + rc->m_aspects.registerAspect(factory(target)); rc->acquaintAspects(); return rc; diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index 6bce414c7c3..e08cfbdcf28 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -203,7 +203,7 @@ void WorkingDirectoryAspect::addToLayout(LayoutBuilder &builder) builder.addItems({tr("Working directory:"), m_chooser.data(), m_resetButton.data()}); } -void WorkingDirectoryAspect::acquaintSiblings(const BaseAspects &siblings) +void WorkingDirectoryAspect::acquaintSiblings(const AspectContainer &siblings) { m_envAspect = siblings.aspect(); } diff --git a/src/plugins/projectexplorer/runconfigurationaspects.h b/src/plugins/projectexplorer/runconfigurationaspects.h index 508d308ef95..ca37d063efc 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.h +++ b/src/plugins/projectexplorer/runconfigurationaspects.h @@ -76,7 +76,7 @@ public: WorkingDirectoryAspect(); void addToLayout(Utils::LayoutBuilder &builder) override; - void acquaintSiblings(const Utils::BaseAspects &) override; + void acquaintSiblings(const Utils::AspectContainer &) override; Utils::FilePath workingDirectory(const Utils::MacroExpander *expander) const; Utils::FilePath defaultWorkingDirectory() const; diff --git a/src/plugins/qtsupport/qtbuildaspects.cpp b/src/plugins/qtsupport/qtbuildaspects.cpp index 3e340029f9f..2afc339b60b 100644 --- a/src/plugins/qtsupport/qtbuildaspects.cpp +++ b/src/plugins/qtsupport/qtbuildaspects.cpp @@ -113,7 +113,7 @@ void QtQuickCompilerAspect::addToLayout(LayoutBuilder &builder) changeHandler(); } -void QtQuickCompilerAspect::acquaintSiblings(const BaseAspects &siblings) +void QtQuickCompilerAspect::acquaintSiblings(const AspectContainer &siblings) { m_qmlDebuggingAspect = siblings.aspect(); } diff --git a/src/plugins/qtsupport/qtbuildaspects.h b/src/plugins/qtsupport/qtbuildaspects.h index c9f8a12c1d6..428f9dc811a 100644 --- a/src/plugins/qtsupport/qtbuildaspects.h +++ b/src/plugins/qtsupport/qtbuildaspects.h @@ -56,7 +56,7 @@ public: private: void addToLayout(Utils::LayoutBuilder &builder) override; - void acquaintSiblings(const Utils::BaseAspects &siblings) override; + void acquaintSiblings(const Utils::AspectContainer &siblings) override; const ProjectExplorer::Kit *m_kit = nullptr; const QmlDebuggingAspect *m_qmlDebuggingAspect = nullptr;