summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/projectexplorer/projectconfiguration.cpp40
-rw-r--r--src/plugins/projectexplorer/projectconfiguration.h59
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;