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 <christian.kandeler@qt.io>
This commit is contained in:
hjk
2021-03-31 08:57:26 +02:00
parent d8770be95e
commit 4cc6fef901
9 changed files with 80 additions and 113 deletions

View File

@@ -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<BaseAspect *> 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<BaseAspect *> &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)) {

View File

@@ -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<Internal::BaseAspectPrivate> d;
};
class QTCREATOR_UTILS_EXPORT BaseAspects
{
BaseAspects(const BaseAspects &) = delete;
BaseAspects &operator=(const BaseAspects &) = delete;
public:
using const_iterator = QList<BaseAspect *>::const_iterator;
using value_type = QList<BaseAspect *>::value_type;
BaseAspects();
~BaseAspects();
template <class Aspect, typename ...Args>
Aspect *addAspect(Args && ...args)
{
auto aspect = new Aspect(args...);
m_aspects.append(aspect);
return aspect;
}
BaseAspect *aspect(Utils::Id id) const;
template <typename T> T *aspect() const
{
for (BaseAspect *aspect : m_aspects)
if (T *result = qobject_cast<T *>(aspect))
return result;
return nullptr;
}
template <typename T> T *aspect(Utils::Id id) const
{
return qobject_cast<T*>(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<BaseAspect *> 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 <class Aspect, typename ...Args>
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 <typename T> T *aspect() const
{
for (BaseAspect *aspect : aspects())
if (T *result = qobject_cast<T *>(aspect))
return result;
return nullptr;
}
BaseAspect *aspect(Utils::Id id) const;
template <typename T> T *aspect(Utils::Id id) const
{
return qobject_cast<T*>(aspect(id));
}
void forEachAspect(const std::function<void(BaseAspect *)> &run) const;
const QList<BaseAspect *> &aspects() const;
using const_iterator = QList<BaseAspect *>::const_iterator;
using value_type = QList<BaseAspect *>::value_type;
const_iterator begin() const;
const_iterator end() const;
private:
std::unique_ptr<Internal::AspectContainerPrivate> d;
};

View File

@@ -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());

View File

@@ -82,7 +82,7 @@ public:
return m_aspects.addAspect<Aspect>(std::forward<Args>(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 <typename T> T *aspect() const { return m_aspects.aspect<T>(); }
@@ -94,7 +94,7 @@ signals:
void toolTipChanged();
protected:
Utils::BaseAspects m_aspects;
Utils::AspectContainer m_aspects;
private:
QPointer<Target> m_target;

View File

@@ -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;

View File

@@ -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<EnvironmentAspect>();
}

View File

@@ -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;

View File

@@ -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<QmlDebuggingAspect>();
}

View File

@@ -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;