blob: 6cd43f8623be716dba273056e9986ef93cfb21ff [file] [log] [blame]
#include "rive/importers/scripted_object_importer.hpp"
#include "rive/scripted/scripted_drawable.hpp"
#include "rive/script_input_viewmodel_property.hpp"
#include "rive/viewmodel/viewmodel_instance_value.hpp"
#include "rive/viewmodel/viewmodel_property_enum_custom.hpp"
#include "rive/viewmodel/viewmodel_property_viewmodel.hpp"
#include "rive/custom_property_container.hpp"
using namespace rive;
ScriptInputViewModelProperty::~ScriptInputViewModelProperty()
{
auto obj = scriptedObject();
if (obj != nullptr)
{
obj->removeProperty(this);
}
}
void ScriptInputViewModelProperty::decodeDataBindPathIds(
Span<const uint8_t> value)
{
BinaryReader reader(value);
while (!reader.reachedEnd())
{
auto val = reader.readVarUintAs<uint32_t>();
m_DataBindPathIdsBuffer.push_back(val);
}
}
void ScriptInputViewModelProperty::copyDataBindPathIds(
const ScriptInputViewModelPropertyBase& object)
{
m_DataBindPathIdsBuffer =
object.as<ScriptInputViewModelProperty>()->m_DataBindPathIdsBuffer;
}
void ScriptInputViewModelProperty::initScriptedValue()
{
ScriptInput::initScriptedValue();
if (m_viewModelInstanceValue == nullptr)
{
return;
}
auto obj = scriptedObject();
if (obj)
{
obj->setViewModelInput(name(), m_viewModelInstanceValue);
}
}
bool ScriptInputViewModelProperty::validateForScriptInit()
{
m_viewModelInstanceValue = nullptr;
auto scriptedObj = scriptedObject();
if (scriptedObj == nullptr)
{
return false;
}
auto dataContext = scriptedObj->dataContext();
if (dataContext == nullptr)
{
return false;
}
auto instanceValue = dataContext->getViewModelProperty(dataBindPathIds());
if (instanceValue == nullptr)
{
return false;
}
auto viewModelProperty = instanceValue->viewModelProperty();
if (viewModelProperty == nullptr)
{
return false;
}
m_viewModelInstanceValue = instanceValue;
return true;
}
StatusCode ScriptInputViewModelProperty::import(ImportStack& importStack)
{
auto importer =
importStack.latest<ScriptedObjectImporter>(ScriptedDrawable::typeKey);
if (importer == nullptr)
{
return StatusCode::MissingObject;
}
importer->addInput(this);
auto obj = scriptedObject();
if (obj && obj->component() != nullptr)
{
// If the ScriptedObject is a Component, we need the ArtboardImporter
// to add it as a Component, otherwise, return Ok
return Super::import(importStack);
}
return StatusCode::Ok;
}
StatusCode ScriptInputViewModelProperty::onAddedClean(CoreContext* context)
{
StatusCode code = Super::onAddedClean(context);
if (code != StatusCode::Ok)
{
return code;
}
auto p = parent();
if (p != nullptr)
{
auto scriptedObj = ScriptedObject::from(p);
if (scriptedObj != nullptr)
{
scriptedObj->addProperty(this);
}
}
return StatusCode::Ok;
}