From 01d19b4f7059094019e4f861357dd54f2adbaeb7 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 5 Nov 2018 17:20:54 +0100 Subject: ProjectExplorer: Use separate class for aspect collection Better encapsulation. Change-Id: Ia77acf71493f8c7fe1436b2123eaa3adca6917ee Reviewed-by: Christian Kandeler --- .../projectexplorer/projectconfiguration.cpp | 40 +++++++++++---- src/plugins/projectexplorer/projectconfiguration.h | 59 +++++++++++++++++----- 2 files changed, 77 insertions(+), 22 deletions(-) diff --git a/src/plugins/projectexplorer/projectconfiguration.cpp b/src/plugins/projectexplorer/projectconfiguration.cpp index fafa53af3e2..d51084f1eda 100644 --- a/src/plugins/projectexplorer/projectconfiguration.cpp +++ b/src/plugins/projectexplorer/projectconfiguration.cpp @@ -52,6 +52,33 @@ QWidget *ProjectConfigurationAspect::createConfigWidget() const } +// ProjectConfigurationAspects + +ProjectConfigurationAspects::ProjectConfigurationAspects() = default; + +ProjectConfigurationAspects::~ProjectConfigurationAspects() +{ + qDeleteAll(base()); +} + +ProjectConfigurationAspect *ProjectConfigurationAspects::aspect(Core::Id id) const +{ + return Utils::findOrDefault(base(), Utils::equal(&ProjectConfigurationAspect::id, id)); +} + +void ProjectConfigurationAspects::fromMap(const QVariantMap &map) const +{ + for (ProjectConfigurationAspect *aspect : *this) + aspect->fromMap(map); +} + +void ProjectConfigurationAspects::toMap(QVariantMap &map) const +{ + for (ProjectConfigurationAspect *aspect : *this) + aspect->toMap(map); +} + + // ProjectConfiguration ProjectConfiguration::ProjectConfiguration(QObject *parent, Core::Id id) @@ -61,10 +88,7 @@ ProjectConfiguration::ProjectConfiguration(QObject *parent, Core::Id id) setObjectName(id.toString()); } -ProjectConfiguration::~ProjectConfiguration() -{ - qDeleteAll(m_aspects); -} +ProjectConfiguration::~ProjectConfiguration() = default; Core::Id ProjectConfiguration::id() const { @@ -130,8 +154,7 @@ QVariantMap ProjectConfiguration::toMap() const map.insert(QLatin1String(DISPLAY_NAME_KEY), m_displayName); map.insert(QLatin1String(DEFAULT_DISPLAY_NAME_KEY), m_defaultDisplayName); - for (const auto &aspect : m_aspects) - aspect->toMap(map); + m_aspects.toMap(map); return map; } @@ -148,15 +171,14 @@ bool ProjectConfiguration::fromMap(const QVariantMap &map) m_defaultDisplayName.isEmpty() ? m_displayName : m_defaultDisplayName).toString(); - for (const auto &aspect : qAsConst(m_aspects)) - aspect->fromMap(map); + m_aspects.fromMap(map); return true; } ProjectConfigurationAspect *ProjectConfiguration::aspect(Core::Id id) const { - return Utils::findOrDefault(m_aspects, Utils::equal(&ProjectConfigurationAspect::id, id)); + return m_aspects.aspect(id); } Core::Id ProjectExplorer::idFromMap(const QVariantMap &map) diff --git a/src/plugins/projectexplorer/projectconfiguration.h b/src/plugins/projectexplorer/projectconfiguration.h index 492f19467c6..37ac506028c 100644 --- a/src/plugins/projectexplorer/projectconfiguration.h +++ b/src/plugins/projectexplorer/projectconfiguration.h @@ -80,6 +80,48 @@ protected: ConfigWidgetCreator m_configWidgetCreator; }; +class PROJECTEXPLORER_EXPORT ProjectConfigurationAspects + : private QList +{ + using Base = QList; + +public: + ProjectConfigurationAspects(); + ~ProjectConfigurationAspects(); + + template + Aspect *addAspect(Args && ...args) + { + auto aspect = new Aspect(args...); + append(aspect); + return aspect; + } + + ProjectConfigurationAspect *aspect(Core::Id id) const; + + template T *aspect() const + { + for (ProjectConfigurationAspect *aspect : *this) + if (T *result = qobject_cast(aspect)) + return result; + return nullptr; + } + + void fromMap(const QVariantMap &map) const; + void toMap(QVariantMap &map) const; + + using Base::append; + using Base::begin; + using Base::end; + +private: + Base &base() { return *this; } + const Base &base() const { return *this; } + + ProjectConfigurationAspects(const ProjectConfigurationAspects &) = delete; + ProjectConfigurationAspects &operator=(const ProjectConfigurationAspects &) = delete; +}; + class PROJECTEXPLORER_EXPORT ProjectConfiguration : public QObject { Q_OBJECT @@ -119,29 +161,20 @@ public: template Aspect *addAspect(Args && ...args) { - auto aspect = new Aspect(args...); - m_aspects.append(aspect); - return aspect; + return m_aspects.addAspect(std::forward(args)...); } - const QList aspects() const { return m_aspects; } + const ProjectConfigurationAspects &aspects() const { return m_aspects; } ProjectConfigurationAspect *aspect(Core::Id id) const; - - template T *aspect() const - { - for (ProjectConfigurationAspect *aspect : m_aspects) - if (T *result = qobject_cast(aspect)) - return result; - return nullptr; - } + template T *aspect() const { return m_aspects.aspect(); } signals: void displayNameChanged(); void toolTipChanged(); protected: - QList m_aspects; + ProjectConfigurationAspects m_aspects; private: const Core::Id m_id; -- cgit v1.2.3