blob: f0fda57cd11ab5b4864c1fa6ceaae78815b15de8 [file] [log] [blame] [edit]
#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/viewmodel/viewmodel_property_viewmodel.hpp"
#include "rive/core_context.hpp"
#include "rive/refcnt.hpp"
using namespace rive;
ViewModelInstance::~ViewModelInstance()
{
for (auto& value : m_PropertyValues)
{
value->unref();
}
m_PropertyValues.clear();
if (m_ViewModel != nullptr)
{
m_ViewModel->unref();
}
}
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;
}
bool ViewModelInstance::replaceViewModelByName(const std::string& name,
rcp<ViewModelInstance> value)
{
auto viewModelProperty = viewModel()->property(name);
if (viewModelProperty != nullptr)
{
for (auto propertyValue : m_PropertyValues)
{
if (propertyValue->viewModelProperty() == viewModelProperty)
{
if (value->viewModelId() ==
viewModelProperty->as<ViewModelPropertyViewModel>()
->viewModelReferenceId())
{
propertyValue->as<ViewModelInstanceViewModel>()
->referenceViewModelInstance(value);
return true;
}
break;
}
}
}
return false;
}
ViewModelInstanceValue* ViewModelInstance::propertyValue(
const SymbolType symbolType)
{
auto viewModelProperty = viewModel()->property(symbolType);
if (viewModelProperty != nullptr)
{
for (auto value : m_PropertyValues)
{
if (value->viewModelProperty() == viewModelProperty)
{
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)
{
if (m_ViewModel != nullptr)
{
m_ViewModel->unref();
}
value->ref();
m_ViewModel = value;
}
ViewModel* ViewModelInstance::viewModel() const { return m_ViewModel; }
void ViewModelInstance::onComponentDirty(Component* component) {}
void ViewModelInstance::setAsRoot(rcp<ViewModelInstance> instance)
{
setRoot(instance);
}
void ViewModelInstance::setRoot(rcp<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;
}
void ViewModelInstance::advanced()
{
for (auto value : m_PropertyValues)
{
value->advanced();
}
}
ViewModelInstanceValue* ViewModelInstance::symbol(int coreType)
{
for (auto& value : m_PropertyValues)
{
if (value->coreType() == coreType)
{
return value;
}
}
return nullptr;
}