blob: b2656b521aa62f2bf25aab40784934f83aeb0a2f [file] [log] [blame]
#include <sstream>
#include <iomanip>
#include <array>
#include "rive/viewmodel/viewmodel_instance.hpp"
#include "rive/viewmodel/viewmodel.hpp"
#include "rive/viewmodel/viewmodel_instance_value.hpp"
#include "rive/viewmodel/viewmodel_instance_viewmodel.hpp"
#include "rive/importers/viewmodel_importer.hpp"
#include "rive/core_context.hpp"
using namespace rive;
void ViewModelInstance::addValue(ViewModelInstanceValue* value)
{
m_PropertyValues.push_back(value);
}
ViewModelInstanceValue* ViewModelInstance::propertyValue(const uint32_t id)
{
for (auto value : m_PropertyValues)
{
if (value->viewModelPropertyId() == id)
{
return value;
}
}
return nullptr;
}
ViewModelInstanceValue* ViewModelInstance::propertyValue(const std::string& name)
{
auto viewModelProperty = viewModel()->property(name);
if (viewModelProperty != nullptr)
{
for (auto value : m_PropertyValues)
{
if (value->viewModelProperty() == viewModelProperty)
{
return value;
}
}
}
return nullptr;
}
void ViewModelInstance::viewModel(ViewModel* value) { m_ViewModel = value; }
ViewModel* ViewModelInstance::viewModel() const { return m_ViewModel; }
void ViewModelInstance::onComponentDirty(Component* component) {}
void ViewModelInstance::setAsRoot() { setRoot(this); }
void ViewModelInstance::setRoot(ViewModelInstance* value)
{
for (auto propertyValue : m_PropertyValues)
{
propertyValue->setRoot(value);
}
}
std::vector<ViewModelInstanceValue*> ViewModelInstance::propertyValues()
{
return m_PropertyValues;
}
Core* ViewModelInstance::clone() const
{
auto cloned = new ViewModelInstance();
cloned->copy(*this);
for (auto propertyValue : m_PropertyValues)
{
auto clonedValue = propertyValue->clone()->as<ViewModelInstanceValue>();
cloned->addValue(clonedValue);
}
cloned->viewModel(viewModel());
return cloned;
}
StatusCode ViewModelInstance::import(ImportStack& importStack)
{
auto viewModelImporter = importStack.latest<ViewModelImporter>(ViewModel::typeKey);
if (viewModelImporter == nullptr)
{
return StatusCode::MissingObject;
}
viewModelImporter->addInstance(this);
return StatusCode::Ok;
}
ViewModelInstanceValue* ViewModelInstance::propertyFromPath(std::vector<uint32_t>* path,
size_t index)
{
if (index < path->size())
{
auto propertyId = (*path)[index];
auto property = propertyValue(propertyId);
if (property != nullptr)
{
if (index == path->size() - 1)
{
return property;
}
if (property->is<ViewModelInstanceViewModel>())
{
auto propertyViewModel = property->as<ViewModelInstanceViewModel>();
auto viewModelInstance = propertyViewModel->referenceViewModelInstance();
return viewModelInstance->propertyFromPath(path, index + 1);
}
}
}
return nullptr;
}