179 lines
6.7 KiB
C++
179 lines
6.7 KiB
C++
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// NoesisGUI - http://www.noesisengine.com
|
|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
namespace Noesis
|
|
{
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::RegisterProperty(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata)
|
|
{
|
|
RegisterProperty<T>(dp, name, metadata, nullptr, PropertyAccess_ReadWrite);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::RegisterProperty(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata, ValidateValueCallback validate)
|
|
{
|
|
RegisterProperty<T>(dp, name, metadata, validate, PropertyAccess_ReadWrite);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::RegisterPropertyRO(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata)
|
|
{
|
|
RegisterProperty<T>(dp, name, metadata, nullptr, PropertyAccess_ReadOnly);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::RegisterPropertyRO(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata, GetReadOnlyValueCallback getReadOnlyValue)
|
|
{
|
|
RegisterProperty<T>(dp, name, metadata, nullptr, PropertyAccess_ReadOnly);
|
|
((DependencyProperty*)dp)->SetGetReadOnlyValueCallback(getReadOnlyValue);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::RegisterPropertyRO(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata, ValidateValueCallback validate)
|
|
{
|
|
RegisterProperty<T>(dp, name, metadata, validate, PropertyAccess_ReadOnly);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::AddOwner(const DependencyProperty*& dp, const char* name,
|
|
const DependencyProperty*& source, PropertyMetadata* metadata)
|
|
{
|
|
static_assert(!IsInterface<RemovePtr<T>>::Result, "Interface not supported in DPs");
|
|
const Type* type = TypeOf<RemovePtr<T>>();
|
|
|
|
NS_ASSERT(!StrIsNullOrEmpty(name));
|
|
NS_ASSERT(dp == 0 || dp->GetName() == Symbol(name));
|
|
NS_ASSERT(dp == 0 || type == dp->GetType());
|
|
|
|
if (source != 0)
|
|
{
|
|
NS_ASSERT(source->GetName() == Symbol(name));
|
|
NS_ASSERT(type == source->GetType());
|
|
dp = InsertProperty(source);
|
|
}
|
|
else
|
|
{
|
|
// Ensure insertion because the property could had been created in a previous call to
|
|
// OverrideMetadata but not registered in the owner DependencyData
|
|
if (dp != 0)
|
|
{
|
|
InsertProperty(dp);
|
|
}
|
|
else
|
|
{
|
|
Ptr<DependencyProperty> prop = CreateProperty<T>(name, Int2Type<IsPtr<T>::Result>());
|
|
dp = InsertProperty(prop);
|
|
}
|
|
|
|
source = dp;
|
|
}
|
|
|
|
if (dp != 0 && metadata != 0)
|
|
{
|
|
NS_ASSERT(!metadata->HasDefaultValue() || metadata->GetValueManager()->CheckType(type));
|
|
const_cast<DependencyProperty*>(dp)->AddMetadata(mOwnerType, metadata);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::OverrideMetadata(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata)
|
|
{
|
|
static_assert(!IsInterface<RemovePtr<T>>::Result, "Interface not supported in DPs");
|
|
const Type* type = TypeOf<RemovePtr<T>>();
|
|
|
|
NS_CHECK(metadata != nullptr,
|
|
"Can't override dependency property '%s.%s', metadata is null",
|
|
mOwnerType->GetName(), name);
|
|
|
|
if (dp != 0)
|
|
{
|
|
NS_ASSERT(!StrIsNullOrEmpty(name));
|
|
NS_ASSERT(dp->GetName() == Symbol(name));
|
|
NS_ASSERT(type == dp->GetType());
|
|
}
|
|
else
|
|
{
|
|
Ptr<DependencyProperty> prop = CreateProperty<T>(name, Int2Type<IsPtr<T>::Result>());
|
|
dp = InsertProperty(prop.GetPtr());
|
|
}
|
|
|
|
if (dp != 0)
|
|
{
|
|
NS_ASSERT(!metadata->HasDefaultValue() || metadata->GetValueManager()->CheckType(type));
|
|
const_cast<DependencyProperty*>(dp)->AddMetadata(mOwnerType, metadata);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
void DependencyData::RegisterProperty(const DependencyProperty*& dp, const char* name,
|
|
PropertyMetadata* metadata, ValidateValueCallback validate, PropertyAccess access)
|
|
{
|
|
static_assert(!IsInterface<RemovePtr<T>>::Result, "Interface not supported in DPs");
|
|
const Type* type = TypeOf<RemovePtr<T>>();
|
|
|
|
CheckMetadata(name, metadata, type);
|
|
|
|
if (dp != 0)
|
|
{
|
|
NS_ASSERT(type == dp->GetType());
|
|
RegisterExistingProperty(dp, name, metadata, validate, access);
|
|
}
|
|
else
|
|
{
|
|
Ptr<DependencyProperty> prop = CreateProperty<T>(name, metadata, validate, access,
|
|
Int2Type<IsPtr<T>::Result>());
|
|
dp = InsertProperty(prop);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
Ptr<DependencyProperty> DependencyData::CreateProperty(const char* name, PropertyMetadata* metadata,
|
|
ValidateValueCallback validate, PropertyAccess access, IsNotBaseComponent)
|
|
{
|
|
return DependencyProperty::Create<T>(name, mOwnerType, metadata, validate, access);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
Ptr<DependencyProperty> DependencyData::CreateProperty(const char* name, PropertyMetadata* metadata,
|
|
ValidateValueCallback validate, PropertyAccess access, IsBaseComponent)
|
|
{
|
|
return DependencyProperty::Create<Ptr<BaseComponent>>(name, TypeOf<typename T::Type>(),
|
|
mOwnerType, metadata, validate, access);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
Ptr<DependencyProperty> DependencyData::CreateProperty(const char* name, IsNotBaseComponent)
|
|
{
|
|
return DependencyProperty::Create<T>(name);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class T>
|
|
Ptr<DependencyProperty> DependencyData::CreateProperty(const char* name, IsBaseComponent)
|
|
{
|
|
return DependencyProperty::Create<Ptr<BaseComponent>>(name, TypeOf<typename T::Type>());
|
|
}
|
|
|
|
}
|