forked from qt-creator/qt-creator
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:
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user