From 53abd750bf9f073db6e94e21d44baec48623553a Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 14 Aug 2020 07:22:37 +0200 Subject: [PATCH] ProjectExplorer: Introduce an AspectContainer class For further use in conglomerates like OverrideMakeFlagAspect. Change-Id: I845ff085d15779e43431ab3858c5c1b55824f694 Reviewed-by: Christian Kandeler --- .../projectconfigurationaspects.cpp | 41 +++++++++++++++++++ .../projectconfigurationaspects.h | 28 +++++++++++++ 2 files changed, 69 insertions(+) diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.cpp b/src/plugins/projectexplorer/projectconfigurationaspects.cpp index e1c44c86a46..a9f4aaa5e20 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/projectconfigurationaspects.cpp @@ -150,6 +150,12 @@ public: QStringList m_value; }; +class AspectContainerPrivate +{ +public: + QList m_items; +}; + } // Internal /*! @@ -870,4 +876,39 @@ void StringListAspect::setValue(const QStringList &value) d->m_value = value; } +/*! + \class ProjectExplorer::AspectContainer +*/ + +AspectContainer::AspectContainer() + : d(new Internal::AspectContainerPrivate) +{} + +AspectContainer::~AspectContainer() = default; + +void AspectContainer::addAspectHelper(ProjectConfigurationAspect *aspect) +{ + d->m_items.append(aspect); +} + +void AspectContainer::addToLayout(LayoutBuilder &builder) +{ + for (ProjectConfigurationAspect *aspect : d->m_items) { + if (aspect->isVisible()) + aspect->addToLayout(builder); + } +} + +void AspectContainer::fromMap(const QVariantMap &map) +{ + for (ProjectConfigurationAspect *aspect : d->m_items) + aspect->fromMap(map); +} + +void AspectContainer::toMap(QVariantMap &map) const +{ + for (ProjectConfigurationAspect *aspect : d->m_items) + aspect->toMap(map); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.h b/src/plugins/projectexplorer/projectconfigurationaspects.h index 39784183f71..ff0a48193fe 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.h +++ b/src/plugins/projectexplorer/projectconfigurationaspects.h @@ -37,6 +37,7 @@ namespace ProjectExplorer { namespace Internal { +class AspectContainerPrivate; class BoolAspectPrivate; class IntegerAspectPrivate; class SelectionAspectPrivate; @@ -256,6 +257,33 @@ private: std::unique_ptr d; }; +class PROJECTEXPLORER_EXPORT AspectContainer : public ProjectConfigurationAspect +{ + Q_OBJECT + +public: + AspectContainer(); + ~AspectContainer() override; + + template + Aspect *addAspect(Args && ...args) + { + auto aspect = new Aspect(args...); + addAspectHelper(aspect); + return aspect; + } + + void addToLayout(LayoutBuilder &builder) override; + + void fromMap(const QVariantMap &map) override; + void toMap(QVariantMap &map) const override; + +private: + void addAspectHelper(ProjectConfigurationAspect *aspect); + + std::unique_ptr d; +}; + // FIXME: For migration. Remove after 4.15 using BaseBoolAspect = BoolAspect; using BaseIntegerAspect = IntegerAspect;