blob: c26730b200f1e74231996ae41b63b1c6748bab79 [file] [log] [blame]
#ifndef _RIVE_DATA_BIND_CONTEXT_VALUE_HPP_
#define _RIVE_DATA_BIND_CONTEXT_VALUE_HPP_
#include "rive/viewmodel/viewmodel_instance_value.hpp"
#include "rive/data_bind/converters/data_converter.hpp"
#include <stdio.h>
namespace rive
{
class DataBindContextValue
{
protected:
ViewModelInstanceValue* m_source;
DataConverter* m_converter;
DataValue* m_dataValue;
public:
DataBindContextValue(ViewModelInstanceValue* source, DataConverter* converter);
virtual ~DataBindContextValue(){};
virtual void applyToSource(Core* component, uint32_t propertyKey, bool isMainDirection);
virtual void apply(Core* component, uint32_t propertyKey, bool isMainDirection){};
virtual void update(Core* component){};
virtual DataValue* getTargetValue(Core* target, uint32_t propertyKey) { return nullptr; };
void updateSourceValue();
template <typename T = DataValue, typename U> U getDataValue(DataValue* input)
{
auto dataValue = m_converter != nullptr ? m_converter->convert(input) : input;
if (dataValue->is<T>())
{
return dataValue->as<T>()->value();
}
return (new T())->value();
};
template <typename T = DataValue, typename U> U getReverseDataValue(DataValue* input)
{
auto dataValue = m_converter != nullptr ? m_converter->reverseConvert(input) : input;
if (dataValue->is<T>())
{
return dataValue->as<T>()->value();
}
return (new T())->value();
};
template <typename T = DataValue, typename U>
U calculateValue(DataValue* input, bool isMainDirection)
{
return isMainDirection ? getDataValue<T, U>(input) : getReverseDataValue<T, U>(input);
};
};
} // namespace rive
#endif