blob: d6da5e8468267910bba37be731944cf91d651416 [file] [log] [blame]
#include "rive/data_bind/context/context_target_value.hpp"
#include "rive/data_bind/data_bind.hpp"
#include "rive/data_bind/data_values/data_value.hpp"
#include "rive/data_bind/data_values/data_value_asset_image.hpp"
#include "rive/data_bind/data_values/data_value_boolean.hpp"
#include "rive/data_bind/data_values/data_value_color.hpp"
#include "rive/data_bind/data_values/data_value_integer.hpp"
#include "rive/data_bind/data_values/data_value_number.hpp"
#include "rive/data_bind/data_values/data_value_string.hpp"
#include "rive/core/field_types/core_bool_type.hpp"
#include "rive/core/field_types/core_color_type.hpp"
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/core/field_types/core_string_type.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
#include "rive/generated/core_registry.hpp"
using namespace rive;
DataBindContextTargetValue::~DataBindContextTargetValue()
{
if (m_targetValue != nullptr)
{
delete m_targetValue;
}
};
void DataBindContextTargetValue::initialize(DataBind* dataBind)
{
m_dataBind = dataBind;
switch (CoreRegistry::propertyFieldId(dataBind->propertyKey()))
{
case CoreUintType::id:
{
// Solos are a special case where the output type is relevant to
// apply the reverse conversion. In the furute we might need to
// traverse the full conversion chain to make sure we create the
// right type.
if (dataBind->propertyKey() ==
SoloBase::activeComponentIdPropertyKey)
{
if (dataBind->sourceOutputType() == DataType::string)
{
m_targetValue = new DataValueString();
}
else if (dataBind->sourceOutputType() == DataType::number)
{
m_targetValue = new DataValueNumber();
}
}
else if (dataBind->source()->coreType() ==
ViewModelInstanceAssetImageBase::typeKey)
{
m_targetValue = new DataValueAssetImage();
}
else
{
m_targetValue = new DataValueInteger();
}
}
break;
case CoreColorType::id:
{
m_targetValue = new DataValueColor();
}
break;
case CoreDoubleType::id:
{
m_targetValue = new DataValueNumber();
}
break;
case CoreStringType::id:
{
m_targetValue = new DataValueString();
}
break;
case CoreBoolType::id:
{
m_targetValue = new DataValueBoolean();
}
break;
default:
break;
}
}
bool DataBindContextTargetValue::syncTargetValue()
{
switch (CoreRegistry::propertyFieldId(m_dataBind->propertyKey()))
{
case CoreUintType::id:
{
if (m_dataBind->propertyKey() ==
SoloBase::activeComponentIdPropertyKey &&
m_dataBind->target() && m_dataBind->target()->is<Solo>())
{
auto target = m_dataBind->target()->as<Solo>();
if (m_dataBind->sourceOutputType() == DataType::string)
{
auto value = target->getActiveChildName();
return updateValue<DataValueString, std::string>(value);
}
else if (m_dataBind->sourceOutputType() == DataType::number)
{
auto value = (float)target->getActiveChildIndex();
return updateValue<DataValueNumber, float>(value);
}
else if (m_dataBind->sourceOutputType() == DataType::integer)
{
auto value = target->getActiveChildIndex();
return updateValue<DataValueInteger, int>(value);
}
}
else if (m_dataBind->target()->coreType() ==
BindablePropertyAssetBase::typeKey)
{
auto value = CoreRegistry::getUint(m_dataBind->target(),
m_dataBind->propertyKey());
auto fileAsset = m_dataBind->target()
->as<BindablePropertyAsset>()
->fileAsset();
bool didChange = false;
if (updateValue<DataValueInteger, int>(value))
{
didChange = true;
}
if (fileAsset->renderImage() !=
m_targetValue->as<DataValueAssetImage>()->imageValue())
{
m_targetValue->as<DataValueAssetImage>()->imageValue(
fileAsset->renderImage());
didChange = true;
}
return didChange;
}
else
{
auto value = CoreRegistry::getUint(m_dataBind->target(),
m_dataBind->propertyKey());
return updateValue<DataValueInteger, int>(value);
}
}
break;
case CoreColorType::id:
{
auto value = CoreRegistry::getColor(m_dataBind->target(),
m_dataBind->propertyKey());
return updateValue<DataValueColor, int>(value);
}
break;
case CoreDoubleType::id:
{
auto value = CoreRegistry::getDouble(m_dataBind->target(),
m_dataBind->propertyKey());
return updateValue<DataValueNumber, float>(value);
}
break;
case CoreStringType::id:
{
auto value = CoreRegistry::getString(m_dataBind->target(),
m_dataBind->propertyKey());
return updateValue<DataValueString, std::string>(value);
}
break;
case CoreBoolType::id:
{
auto value = CoreRegistry::getBool(m_dataBind->target(),
m_dataBind->propertyKey());
return updateValue<DataValueBoolean, bool>(value);
}
break;
default:
break;
}
return false;
}