+ index = iter->first;
+ }
+ else if(GetBaseType(mBaseType, mTypeRegistry, mBaseTypeName))
+ {
+ // call base type recursively
+ index = mBaseType->GetChildPropertyIndex(name);
+ }
+
+ return index;
+}
+
+std::string_view TypeInfo::GetChildPropertyName(Property::Index index) const
+{
+#ifdef USE_INDEXED_MAP_CONTAINER_AT_TYPE_INFO
+ const auto& iter = mRegisteredChildProperties.Get(static_cast<std::uint32_t>(index));
+#else
+ RegisteredPropertyContainer::const_iterator iter = find_if(mRegisteredChildProperties.begin(), mRegisteredChildProperties.end(), PairFinder<Property::Index, RegisteredPropertyPair>(index));
+#endif
+ if(iter != mRegisteredChildProperties.end())
+ {
+ return iter->second.name.GetStringView();
+ }
+
+ if(GetBaseType(mBaseType, mTypeRegistry, mBaseTypeName))
+ {
+ // call base type recursively
+ return mBaseType->GetChildPropertyName(index);
+ }
+
+ DALI_LOG_ERROR("Property index %d not found\n", index);
+
+ return {};
+}
+
+Property::Type TypeInfo::GetChildPropertyType(Property::Index index) const
+{
+ Property::Type type(Property::NONE);
+
+#ifdef USE_INDEXED_MAP_CONTAINER_AT_TYPE_INFO
+ const auto& iter = mRegisteredChildProperties.Get(static_cast<std::uint32_t>(index));
+#else
+ RegisteredPropertyContainer::const_iterator iter = find_if(mRegisteredChildProperties.begin(), mRegisteredChildProperties.end(), PairFinder<Property::Index, RegisteredPropertyPair>(index));
+#endif
+ if(iter != mRegisteredChildProperties.end())
+ {
+ type = iter->second.type;
+ }
+ else if(GetBaseType(mBaseType, mTypeRegistry, mBaseTypeName))
+ {
+ // call base type recursively
+ type = mBaseType->GetChildPropertyType(index);
+ }
+ else
+ {
+ DALI_LOG_ERROR("Property index %d not found\n", index);
+ }
+
+ return type;
+}
+
+bool TypeInfo::IsPropertyWritable(Property::Index index) const
+{
+ bool writable = false;
+ bool found = false;
+
+ // default property?
+ if((index < DEFAULT_PROPERTY_MAX_COUNT) && mDefaultProperties)
+ {
+ found = GetDefaultPropertyField(mDefaultProperties, mDefaultPropertyCount, index, &Dali::PropertyDetails::writable, writable);
+ }
+ else if((index >= ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX) && (index <= ANIMATABLE_PROPERTY_REGISTRATION_MAX_INDEX))
+ {
+ writable = true; // animatable property is writable
+ found = true;
+ }
+ else
+ {
+#ifdef USE_INDEXED_MAP_CONTAINER_AT_TYPE_INFO
+ const auto& iter = mRegisteredProperties.Get(static_cast<std::uint32_t>(index));
+#else
+ RegisteredPropertyContainer::const_iterator iter = find_if(mRegisteredProperties.begin(), mRegisteredProperties.end(), PairFinder<Property::Index, RegisteredPropertyPair>(index));
+#endif
+ if(iter != mRegisteredProperties.end())