From 6ed56f640a67224dcdbd19731660d6896dfda119 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 28 Jul 2023 08:35:29 +0200 Subject: [PATCH] Utils: Make it possible to change internal aspect updates ... without subclassing. This is useful in situations where there are small modifications needed for simple aspects that are themselves exposed as members of an aspect container in a header but we don't want to create a subclass for it. Change-Id: I058643137c38e564072af9a2f45b1576ea058651 Reviewed-by: Marcus Tillmanns --- src/libs/utils/aspects.cpp | 1 - src/libs/utils/aspects.h | 51 +++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 1f039fa22a9..7461b378f24 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -2739,5 +2739,4 @@ SettingsGroupNester::~SettingsGroupNester() theSettings->endGroup(); } - } // namespace Utils diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index 2e20f75800a..0622c6a66f3 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -222,7 +222,7 @@ protected: protected: template - bool updateStorage(Value &target, const Value &val) + static bool updateStorage(Value &target, const Value &val) { if (target == val) return false; @@ -354,6 +354,55 @@ protected: ValueType m_buffer{}; }; +template +class FlexibleTypedAspect : public TypedAspect +{ +public: + using Base = TypedAspect; + using Updater = std::function; + + using Base::Base; + + void setInternalToBuffer(const Updater &updater) { m_internalToBuffer = updater; } + void setBufferToInternal(const Updater &updater) { m_bufferToInternal = updater; } + void setInternalToExternal(const Updater &updater) { m_internalToExternal = updater; } + void setExternalToInternal(const Updater &updater) { m_externalToInternal = updater; } + +protected: + bool internalToBuffer() override + { + if (m_internalToBuffer) + return m_internalToBuffer(Base::m_buffer, Base::m_internal); + return Base::internalToBuffer(); + } + + bool bufferToInternal() override + { + if (m_bufferToInternal) + return m_bufferToInternal(Base::m_internal, Base::m_buffer); + return Base::bufferToInternal(); + } + + bool internalToExternal() override + { + if (m_internalToExternal) + return m_internalToExternal(Base::m_external, Base::m_internal); + return Base::internalToExternal(); + } + + bool externalToInternal() override + { + if (m_externalToInternal) + return m_externalToInternal(Base::m_internal, Base::m_external); + return Base::externalToInternal(); + } + + Updater m_internalToBuffer; + Updater m_bufferToInternal; + Updater m_internalToExternal; + Updater m_externalToInternal; +}; + class QTCREATOR_UTILS_EXPORT BoolAspect : public TypedAspect { Q_OBJECT