diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/projectexplorer/projectconfiguration.cpp | 40 | ||||
-rw-r--r-- | 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 fafa53af3e..d51084f1ed 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 492f19467c..37ac506028 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<ProjectConfigurationAspect *> +{ + using Base = QList<ProjectConfigurationAspect *>; + +public: + ProjectConfigurationAspects(); + ~ProjectConfigurationAspects(); + + template <class Aspect, typename ...Args> + Aspect *addAspect(Args && ...args) + { + auto aspect = new Aspect(args...); + append(aspect); + return aspect; + } + + ProjectConfigurationAspect *aspect(Core::Id id) const; + + template <typename T> T *aspect() const + { + for (ProjectConfigurationAspect *aspect : *this) + if (T *result = qobject_cast<T *>(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<class Aspect, typename ...Args> Aspect *addAspect(Args && ...args) { - auto aspect = new Aspect(args...); - m_aspects.append(aspect); - return aspect; + return m_aspects.addAspect<Aspect>(std::forward<Args>(args)...); } - const QList<ProjectConfigurationAspect *> aspects() const { return m_aspects; } + const ProjectConfigurationAspects &aspects() const { return m_aspects; } ProjectConfigurationAspect *aspect(Core::Id id) const; - - template <typename T> T *aspect() const - { - for (ProjectConfigurationAspect *aspect : m_aspects) - if (T *result = qobject_cast<T *>(aspect)) - return result; - return nullptr; - } + template <typename T> T *aspect() const { return m_aspects.aspect<T>(); } signals: void displayNameChanged(); void toolTipChanged(); protected: - QList<ProjectConfigurationAspect *> m_aspects; + ProjectConfigurationAspects m_aspects; private: const Core::Id m_id; |