diff --git a/thirdparty/next/inc/core/object.h b/thirdparty/next/inc/core/object.h index cf8aa5191..d011a3afa 100644 --- a/thirdparty/next/inc/core/object.h +++ b/thirdparty/next/inc/core/object.h @@ -136,6 +136,9 @@ class NEXT_LIBRARY_EXPORT Object { virtual Variant property(const char *name) const; virtual void setProperty(const char *name, const Variant &value); + void setDynamicPropertyInfo(const char *name, const char *info); + std::string dynamicPropertyInfo(const char *name); + const std::list &dynamicPropertyNames() const; virtual bool event(Event *event); @@ -194,6 +197,7 @@ class NEXT_LIBRARY_EXPORT Object { std::queue m_eventQueue; std::list m_dynamicPropertyNames; + std::list m_dynamicPropertyInfo; std::list m_dynamicPropertyValues; Object *m_currentSender; diff --git a/thirdparty/next/src/core/object.cpp b/thirdparty/next/src/core/object.cpp index d562b00d7..55ea58ff8 100644 --- a/thirdparty/next/src/core/object.cpp +++ b/thirdparty/next/src/core/object.cpp @@ -900,32 +900,38 @@ Variant Object::property(const char *name) const { /*! Sets the property with \a name to \a value. - If property not found do nothing. + If property not found the object adds dynamic property. Property must be defined as A_PROPERTY(). Information of all properties which provided by this object can be found in MetaObject. + An invalid \a value will bring to deletion of dynamic property. - \sa property(), metaObject(), Variant::isValid() + \sa property(), metaObject(), Variant::isValid(), dynamicPropertyNames() */ void Object::setProperty(const char *name, const Variant &value) { PROFILE_FUNCTION(); const MetaObject *meta = metaObject(); int index = meta->indexOfProperty(name); if(index < 0) { - auto nameIterator = std::find(m_dynamicPropertyNames.begin(), m_dynamicPropertyNames.end(), name); + std::string localName(name); + auto nameIterator = std::find(m_dynamicPropertyNames.begin(), m_dynamicPropertyNames.end(), localName); if(nameIterator != m_dynamicPropertyNames.end()) { index = std::distance(m_dynamicPropertyNames.begin(), nameIterator); } if(!value.isValid() && index > -1) { if(index > -1) { // Remove dynamic property if exists + auto infoIterator = std::next(m_dynamicPropertyInfo.begin(), index); auto valueIterator = std::next(m_dynamicPropertyValues.begin(), index); + m_dynamicPropertyNames.erase(nameIterator); + m_dynamicPropertyInfo.erase(infoIterator); m_dynamicPropertyValues.erase(valueIterator); } - } else { // Set a new value + } else if(!localName.empty()) { // Set a new value if(index < 0) { - m_dynamicPropertyNames.push_back(name); + m_dynamicPropertyNames.push_back(localName); m_dynamicPropertyValues.push_back(value); + m_dynamicPropertyInfo.push_back(std::string()); } else { *std::next(m_dynamicPropertyValues.begin(), index) = value; } @@ -936,6 +942,36 @@ void Object::setProperty(const char *name, const Variant &value) { meta->property(index).write(this, value); } +/*! + Adds additional \a info for the dynamic property with \a name. + + Can be used to store meta information mostly used for the editor. +*/ +void Object::setDynamicPropertyInfo(const char *name, const char *info) { + int index = -1; + + std::string localName(name); + auto nameIterator = std::find(m_dynamicPropertyNames.begin(), m_dynamicPropertyNames.end(), localName); + if(nameIterator != m_dynamicPropertyNames.end()) { + index = std::distance(m_dynamicPropertyNames.begin(), nameIterator); + } + + if(index > -1) { + *std::next(m_dynamicPropertyInfo.begin(), index) = info; + } +} +/*! + Returns an additional information for the dynamic property. +*/ +std::string Object::dynamicPropertyInfo(const char *name) { + auto it = std::find(m_dynamicPropertyNames.begin(), m_dynamicPropertyNames.end(), name); + if(it == m_dynamicPropertyNames.end()) { + return std::string(); + } + + int index = std::distance(m_dynamicPropertyNames.begin(), it); + return *std::next(m_dynamicPropertyInfo.begin(), index); +} /*! Returns the names of all properties that were dynamically added to the object using setProperty() */