xmake.repo/packages/n/noesis/latest/Include/NsGui/DependencyData.h
2024-12-22 19:15:02 +08:00

162 lines
5.9 KiB
C++

////////////////////////////////////////////////////////////////////////////////////////////////////
// NoesisGUI - http://www.noesisengine.com
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GUI_DEPENDENCYDATA_H__
#define __GUI_DEPENDENCYDATA_H__
#include <NsCore/Noesis.h>
#include <NsGui/DependencySystemApi.h>
#include <NsGui/DependencyProperty.h>
#include <NsCore/TypeMetaData.h>
#include <NsCore/ReflectionDeclare.h>
#include <NsCore/Ptr.h>
#include <NsCore/HashMap.h>
namespace Noesis
{
class PropertyMetadata;
class DependencyDataTest;
class UIElementDataTest;
NS_WARNING_PUSH
NS_MSVC_WARNING_DISABLE(4251 4275)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Metadata used for registering dependency properties
////////////////////////////////////////////////////////////////////////////////////////////////////
class NS_GUI_DEPENDENCYSYSTEM_API DependencyData: public TypeMetaData
{
public:
DependencyData(const TypeClass* ownerType);
/// Registers a dependency property
template<class T>
void RegisterProperty(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata);
/// Registers a dependency property with a given validation callback
template<class T>
void RegisterProperty(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata, ValidateValueCallback validate);
/// Registers a read-only dependency property
template<class T>
void RegisterPropertyRO(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata);
/// Registers a read-only dependency property with callback for getting the value
template<class T>
void RegisterPropertyRO(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata, GetReadOnlyValueCallback getReadOnlyValue);
/// Registers a read-only dependency property with a given validation callback
template<class T>
void RegisterPropertyRO(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata, ValidateValueCallback validate);
/// Adds another type as an owner of a dependency property that has already been registered,
/// providing dependency property metadata for the dependency property as it will exist on
/// the provided owner type
template<class T>
void AddOwner(const DependencyProperty*& dp, const char* name,
const DependencyProperty*& source, PropertyMetadata* metadata = 0);
/// Specifies alternate metadata for this dependency property when it is present on instances
/// of a specified type, overriding the metadata that existed for the dependency property as
/// it was inherited from base types
template<class T>
void OverrideMetadata(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata);
/// Finds a property for the given owner type name
const DependencyProperty* FindProperty(Symbol name) const;
/// Removes specified type metadatas from all registered properties
void ClearMetadata(const TypeClass* forType);
const DependencyProperty* InsertProperty(const DependencyProperty* dp);
/// Enumerates the registered properties
typedef void(*EnumPropertiesCallback)(const DependencyProperty* dp, void* user);
void EnumProperties(EnumPropertiesCallback callback, void* user) const;
protected:
const TypeClass* mOwnerType;
private:
void CheckMetadata(const char* name, PropertyMetadata* metadata, const Type* type) const;
template<class T>
void RegisterProperty(const DependencyProperty*& dp, const char* name,
PropertyMetadata* metadata, ValidateValueCallback validate, PropertyAccess access);
void RegisterExistingProperty(const DependencyProperty* dp, const char* name,
PropertyMetadata* metadata, ValidateValueCallback validate, PropertyAccess access);
typedef Int2Type<0> IsNotBaseComponent;
typedef Int2Type<1> IsBaseComponent;
template<class T>
Ptr<DependencyProperty> CreateProperty(const char* name, PropertyMetadata* metadata,
ValidateValueCallback validate, PropertyAccess access, IsNotBaseComponent);
template<class T>
Ptr<DependencyProperty> CreateProperty(const char* name, PropertyMetadata* metadata,
ValidateValueCallback validate, PropertyAccess access, IsBaseComponent);
template<class T>
Ptr<DependencyProperty> CreateProperty(const char* name, IsNotBaseComponent);
template<class T>
Ptr<DependencyProperty> CreateProperty(const char* name, IsBaseComponent);
private:
friend class DependencyDataTest;
friend class UIElementDataTest;
struct DPKeyInfo
{
static bool IsEmpty(const Ptr<const DependencyProperty>& k)
{
return k.GetPtr() == (const DependencyProperty*)0x01;
}
static void MarkEmpty(const Ptr<const DependencyProperty>& k)
{
*(const DependencyProperty**)(&k) = (const DependencyProperty*)0x01;
}
static uint32_t HashValue(const Ptr<const DependencyProperty>& k) { return k->GetName(); }
static uint32_t HashValue(Symbol k) { return k; }
static bool IsEqual(const Ptr<const DependencyProperty>& lhs, const Ptr<const DependencyProperty>& rhs)
{
return !IsEmpty(lhs) && lhs->GetName() == rhs->GetName();
}
static bool IsEqual(const Ptr<const DependencyProperty>& lhs, Symbol rhs)
{
return !IsEmpty(lhs) && lhs->GetName() == rhs;
}
};
typedef HashBucket_K<Ptr<const DependencyProperty>, DPKeyInfo> Bucket;
typedef HashSet<Ptr<const DependencyProperty>, 0, Bucket> PropertySet;
PropertySet mProperties;
friend class VisualTreeInspectorHelper;
NS_DECLARE_REFLECTION(DependencyData, TypeMetaData)
};
NS_WARNING_POP
}
#include <NsGui/DependencyData.inl>
#endif