blob: 818231f3dd0af06da75aced49d5c7ffeeed9d678 [file] [log] [blame]
#include "rive/data_bind/context/context_value_any.hpp"
#include "rive/generated/core_registry.hpp"
#include <cmath>
using namespace rive;
DataBindContextValueAny::DataBindContextValueAny(DataBind* dataBind) :
DataBindContextValue(dataBind)
{}
void DataBindContextValueAny::apply(Core* target,
uint32_t propertyKey,
bool isMainDirection)
{
syncSourceValue();
auto dataValue =
calculateUntypedDataValue(m_dataValue, isMainDirection, m_dataBind);
switch (CoreRegistry::propertyFieldId(propertyKey))
{
case CoreDoubleType::id:
if (dataValue->is<DataValueNumber>())
{
CoreRegistry::setDouble(
target,
propertyKey,
dataValue->as<DataValueNumber>()->value());
}
break;
case CoreUintType::id:
if (dataValue->is<DataValueNumber>())
{
auto value = dataValue->as<DataValueNumber>()->value();
if (target && target->is<Solo>())
{
target->as<Solo>()->updateByIndex(
(size_t)std::round(value));
}
else
{
int rounded = value < 0 ? 0 : std::round(value);
CoreRegistry::setUint(target, propertyKey, rounded);
}
}
else if (dataValue->is<DataValueString>())
{
if (target && target->is<Solo>())
{
target->as<Solo>()->updateByName(
dataValue->as<DataValueString>()->value());
}
}
break;
case CoreStringType::id:
if (dataValue->is<DataValueString>())
{
CoreRegistry::setString(
target,
propertyKey,
dataValue->as<DataValueString>()->value());
}
break;
case CoreBoolType::id:
if (dataValue->is<DataValueBoolean>())
{
CoreRegistry::setBool(
target,
propertyKey,
dataValue->as<DataValueBoolean>()->value());
}
break;
case CoreColorType::id:
if (dataValue->is<DataValueColor>())
{
CoreRegistry::setColor(
target,
propertyKey,
dataValue->as<DataValueColor>()->value());
}
break;
}
}