173 lines
6.5 KiB
Plaintext
173 lines
6.5 KiB
Plaintext
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
// NoesisGUI - http://www.noesisengine.com
|
||
|
|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
|
||
|
|
#include <NsCore/Ptr.h>
|
||
|
|
#include <NsCore/TypeOf.h>
|
||
|
|
|
||
|
|
|
||
|
|
namespace Noesis
|
||
|
|
{
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
inline DependencyPropertyChangedEventArgs::DependencyPropertyChangedEventArgs(
|
||
|
|
const DependencyProperty* dp, const void* oldValue_, const void* newValue_,
|
||
|
|
const PropertyMetadata* metadata_): prop(dp), oldValue(oldValue_), newValue(newValue_),
|
||
|
|
metadata(metadata_)
|
||
|
|
{
|
||
|
|
NS_ASSERT(dp != 0);
|
||
|
|
NS_ASSERT(oldValue_ != 0);
|
||
|
|
NS_ASSERT(newValue_ != 0);
|
||
|
|
NS_ASSERT(metadata != 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T> const T& DependencyPropertyChangedEventArgs::OldValue() const
|
||
|
|
{
|
||
|
|
return *(const T*) oldValue;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T> const T& DependencyPropertyChangedEventArgs::NewValue() const
|
||
|
|
{
|
||
|
|
return *(const T*) newValue;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
const T& DependencyObject::GetValue(const DependencyProperty* dp) const
|
||
|
|
{
|
||
|
|
return *static_cast<const T*>(GetValue(dp, sizeof(T)));
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
const T& DependencyObject::GetBaseValue(const DependencyProperty* dp) const
|
||
|
|
{
|
||
|
|
return *static_cast<const T*>(GetBaseValue(dp, sizeof(T)));
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetValue(const DependencyProperty* dp, typename SetValueType<T>::Type value)
|
||
|
|
{
|
||
|
|
enum { ValueTypeId = IsSame<T, String>::Result ? 2 : IsPtr<T>::Result ? 1 : 0 };
|
||
|
|
SetValue_<T>(Int2Type<ValueTypeId>(), dp, value, Value::Destination_BaseValue, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetReadOnlyProperty(const DependencyProperty* dp,
|
||
|
|
typename SetValueType<T>::Type value) const
|
||
|
|
{
|
||
|
|
DependencyObject* this_ = const_cast<DependencyObject*>(this);
|
||
|
|
enum { ValueTypeId = IsSame<T, String>::Result ? 2 : IsPtr<T>::Result ? 1 : 0 };
|
||
|
|
this_->SetValue_<T>(Int2Type<ValueTypeId>(), dp, value, Value::Destination_BaseValue, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetCurrentValue(const DependencyProperty* dp,
|
||
|
|
typename SetValueType<T>::Type value)
|
||
|
|
{
|
||
|
|
enum { ValueTypeId = IsSame<T, String>::Result ? 2 : IsPtr<T>::Result ? 1 : 0 };
|
||
|
|
SetValue_<T>(Int2Type<ValueTypeId>(), dp, value, Value::Destination_CurrentValue, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetAnimation(const DependencyProperty* dp,
|
||
|
|
typename SetValueType<T>::Type value)
|
||
|
|
{
|
||
|
|
enum { ValueTypeId = IsSame<T, String>::Result ? 2 : IsPtr<T>::Result ? 1 : 0 };
|
||
|
|
SetValue_<T>(Int2Type<ValueTypeId>(), dp, value, Value::Destination_Animation, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::ClearAnimation(const DependencyProperty* dp)
|
||
|
|
{
|
||
|
|
T oldValue, coercedValue, baseValue;
|
||
|
|
ClearAnimation(dp, sizeof(T), &oldValue, &coercedValue, &baseValue, IsPtr<T>::Result);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::CoerceValue(const DependencyProperty* dp)
|
||
|
|
{
|
||
|
|
T oldValue, coercedValue;
|
||
|
|
CoerceValue(dp, sizeof(T), &oldValue, &coercedValue, IsPtr<T>::Result);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetValue_(IsNotBaseComponent, const DependencyProperty* dp,
|
||
|
|
typename Param<T>::Type value, Value::Destination destination, bool readonly)
|
||
|
|
{
|
||
|
|
T oldValue, coercedValue;
|
||
|
|
SetValue(dp, sizeof(T), &oldValue, &value, &coercedValue, destination, TypeOf<T>(), readonly);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetValue_(IsBaseComponent, const DependencyProperty* dp,
|
||
|
|
BaseComponent* value, Value::Destination destination, bool readonly)
|
||
|
|
{
|
||
|
|
// To avoid creating a temp Ptr<T> here, we assume T* can be reinterpreted as Ptr<T>
|
||
|
|
static_assert(sizeof(BaseComponent*) == sizeof(Ptr<BaseComponent>), "");
|
||
|
|
|
||
|
|
Ptr<BaseComponent> oldValue, coercedValue;
|
||
|
|
SetValuePtr(dp, &oldValue, &value, &coercedValue, destination, readonly);
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
template<class T>
|
||
|
|
void DependencyObject::SetValue_(IsString, const DependencyProperty* dp, const char* value,
|
||
|
|
Value::Destination destination, bool readonly)
|
||
|
|
{
|
||
|
|
FixedString<512> oldValue, coercedValue, newValue(value);
|
||
|
|
SetValue(dp, sizeof(String), &oldValue, &newValue, &coercedValue, destination,
|
||
|
|
TypeOf<String>(), readonly);
|
||
|
|
}
|
||
|
|
|
||
|
|
enum DOFlags
|
||
|
|
{
|
||
|
|
DOFlags_Initializing = 1 << 0,
|
||
|
|
DOFlags_Initialized = 1 << 1,
|
||
|
|
DOFlags_Sealed = 1 << 2
|
||
|
|
};
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
inline bool DependencyObject::IsInitialized() const
|
||
|
|
{
|
||
|
|
return (mFlags & DOFlags_Initialized) != 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
inline void DependencyObject::BeginInit()
|
||
|
|
{
|
||
|
|
mFlags |= DOFlags_Initializing;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
inline void DependencyObject::EndInit()
|
||
|
|
{
|
||
|
|
mFlags &= ~DOFlags_Initializing;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
inline void DependencyObject::Seal()
|
||
|
|
{
|
||
|
|
mFlags |= DOFlags_Sealed;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
inline bool DependencyObject::IsSealed() const
|
||
|
|
{
|
||
|
|
return (mFlags & DOFlags_Sealed) != 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|