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
|
\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 {
|
namespace Internal {
|
||||||
|
|
||||||
class BoolAspectPrivate
|
class BoolAspectPrivate
|
||||||
@@ -2109,6 +2057,8 @@ void TextDisplay::setText(const QString &message)
|
|||||||
|
|
||||||
\brief The AspectContainer class wraps one or more aspects while providing
|
\brief The AspectContainer class wraps one or more aspects while providing
|
||||||
the interface of a single aspect.
|
the interface of a single aspect.
|
||||||
|
|
||||||
|
Sub-aspects ownership can be declared using \a setOwnsSubAspects.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -2118,6 +2068,7 @@ class AspectContainerPrivate
|
|||||||
public:
|
public:
|
||||||
QList<BaseAspect *> m_items; // Not owned
|
QList<BaseAspect *> m_items; // Not owned
|
||||||
bool m_autoApply = true;
|
bool m_autoApply = true;
|
||||||
|
bool m_ownsSubAspects = false;
|
||||||
QStringList m_settingsGroup;
|
QStringList m_settingsGroup;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2130,7 +2081,11 @@ AspectContainer::AspectContainer()
|
|||||||
/*!
|
/*!
|
||||||
\reimp
|
\reimp
|
||||||
*/
|
*/
|
||||||
AspectContainer::~AspectContainer() = default;
|
AspectContainer::~AspectContainer()
|
||||||
|
{
|
||||||
|
if (d->m_ownsSubAspects)
|
||||||
|
qDeleteAll(d->m_items);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\internal
|
\internal
|
||||||
@@ -2147,6 +2102,31 @@ void AspectContainer::registerAspects(const AspectContainer &aspects)
|
|||||||
registerAspect(aspect);
|
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)
|
void AspectContainer::fromMap(const QVariantMap &map)
|
||||||
{
|
{
|
||||||
for (BaseAspect *aspect : qAsConst(d->m_items))
|
for (BaseAspect *aspect : qAsConst(d->m_items))
|
||||||
@@ -2224,6 +2204,11 @@ void AspectContainer::setAutoApply(bool on)
|
|||||||
aspect->setAutoApply(on);
|
aspect->setAutoApply(on);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AspectContainer::setOwnsSubAspects(bool on)
|
||||||
|
{
|
||||||
|
d->m_ownsSubAspects = on;
|
||||||
|
}
|
||||||
|
|
||||||
bool AspectContainer::isDirty() const
|
bool AspectContainer::isDirty() const
|
||||||
{
|
{
|
||||||
for (BaseAspect *aspect : qAsConst(d->m_items)) {
|
for (BaseAspect *aspect : qAsConst(d->m_items)) {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ QT_END_NAMESPACE
|
|||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
class BaseAspects;
|
class AspectContainer;
|
||||||
class LayoutBuilder;
|
class LayoutBuilder;
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -109,7 +109,7 @@ public:
|
|||||||
virtual void fromMap(const QVariantMap &map);
|
virtual void fromMap(const QVariantMap &map);
|
||||||
virtual void toMap(QVariantMap &map) const;
|
virtual void toMap(QVariantMap &map) const;
|
||||||
virtual void toActiveMap(QVariantMap &map) const { toMap(map); }
|
virtual void toActiveMap(QVariantMap &map) const { toMap(map); }
|
||||||
virtual void acquaintSiblings(const BaseAspects &);
|
virtual void acquaintSiblings(const AspectContainer &);
|
||||||
|
|
||||||
virtual void addToLayout(LayoutBuilder &builder);
|
virtual void addToLayout(LayoutBuilder &builder);
|
||||||
|
|
||||||
@@ -155,53 +155,6 @@ private:
|
|||||||
std::unique_ptr<Internal::BaseAspectPrivate> d;
|
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
|
class QTCREATOR_UTILS_EXPORT BoolAspect : public BaseAspect
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -521,6 +474,12 @@ public:
|
|||||||
AspectContainer();
|
AspectContainer();
|
||||||
~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>
|
template <class Aspect, typename ...Args>
|
||||||
Aspect *addAspect(Args && ...args)
|
Aspect *addAspect(Args && ...args)
|
||||||
{
|
{
|
||||||
@@ -528,9 +487,6 @@ public:
|
|||||||
registerAspect(aspect);
|
registerAspect(aspect);
|
||||||
return aspect;
|
return aspect;
|
||||||
}
|
}
|
||||||
void registerAspect(BaseAspect *aspect);
|
|
||||||
void registerAspects(const AspectContainer &aspects);
|
|
||||||
|
|
||||||
void fromMap(const QVariantMap &map);
|
void fromMap(const QVariantMap &map);
|
||||||
void toMap(QVariantMap &map) const;
|
void toMap(QVariantMap &map) const;
|
||||||
|
|
||||||
@@ -548,10 +504,34 @@ public:
|
|||||||
bool equals(const AspectContainer &other) const;
|
bool equals(const AspectContainer &other) const;
|
||||||
void copyFrom(const AspectContainer &other);
|
void copyFrom(const AspectContainer &other);
|
||||||
void setAutoApply(bool on);
|
void setAutoApply(bool on);
|
||||||
|
void setOwnsSubAspects(bool on);
|
||||||
bool isDirty() const;
|
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;
|
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:
|
private:
|
||||||
std::unique_ptr<Internal::AspectContainerPrivate> d;
|
std::unique_ptr<Internal::AspectContainerPrivate> d;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ ProjectConfiguration::ProjectConfiguration(QObject *parent, Utils::Id id)
|
|||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_id(id)
|
, m_id(id)
|
||||||
{
|
{
|
||||||
|
m_aspects.setOwnsSubAspects(true);
|
||||||
|
|
||||||
QTC_CHECK(parent);
|
QTC_CHECK(parent);
|
||||||
QTC_CHECK(id.isValid());
|
QTC_CHECK(id.isValid());
|
||||||
setObjectName(id.toString());
|
setObjectName(id.toString());
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public:
|
|||||||
return m_aspects.addAspect<Aspect>(std::forward<Args>(args)...);
|
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;
|
Utils::BaseAspect *aspect(Utils::Id id) const;
|
||||||
template <typename T> T *aspect() const { return m_aspects.aspect<T>(); }
|
template <typename T> T *aspect() const { return m_aspects.aspect<T>(); }
|
||||||
@@ -94,7 +94,7 @@ signals:
|
|||||||
void toolTipChanged();
|
void toolTipChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Utils::BaseAspects m_aspects;
|
Utils::AspectContainer m_aspects;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPointer<Target> m_target;
|
QPointer<Target> m_target;
|
||||||
|
|||||||
@@ -543,7 +543,7 @@ RunConfiguration *RunConfigurationFactory::create(Target *target) const
|
|||||||
|
|
||||||
// Add the universal aspects.
|
// Add the universal aspects.
|
||||||
for (const RunConfiguration::AspectFactory &factory : theAspectFactories)
|
for (const RunConfiguration::AspectFactory &factory : theAspectFactories)
|
||||||
rc->m_aspects.append(factory(target));
|
rc->m_aspects.registerAspect(factory(target));
|
||||||
|
|
||||||
rc->acquaintAspects();
|
rc->acquaintAspects();
|
||||||
return rc;
|
return rc;
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ void WorkingDirectoryAspect::addToLayout(LayoutBuilder &builder)
|
|||||||
builder.addItems({tr("Working directory:"), m_chooser.data(), m_resetButton.data()});
|
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>();
|
m_envAspect = siblings.aspect<EnvironmentAspect>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public:
|
|||||||
WorkingDirectoryAspect();
|
WorkingDirectoryAspect();
|
||||||
|
|
||||||
void addToLayout(Utils::LayoutBuilder &builder) override;
|
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 workingDirectory(const Utils::MacroExpander *expander) const;
|
||||||
Utils::FilePath defaultWorkingDirectory() const;
|
Utils::FilePath defaultWorkingDirectory() const;
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ void QtQuickCompilerAspect::addToLayout(LayoutBuilder &builder)
|
|||||||
changeHandler();
|
changeHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtQuickCompilerAspect::acquaintSiblings(const BaseAspects &siblings)
|
void QtQuickCompilerAspect::acquaintSiblings(const AspectContainer &siblings)
|
||||||
{
|
{
|
||||||
m_qmlDebuggingAspect = siblings.aspect<QmlDebuggingAspect>();
|
m_qmlDebuggingAspect = siblings.aspect<QmlDebuggingAspect>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void addToLayout(Utils::LayoutBuilder &builder) override;
|
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 ProjectExplorer::Kit *m_kit = nullptr;
|
||||||
const QmlDebuggingAspect *m_qmlDebuggingAspect = nullptr;
|
const QmlDebuggingAspect *m_qmlDebuggingAspect = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user