blob: a8b3f307991db2730b524f86fd49bad9811297c6 [file] [log] [blame]
#include "rive/data_bind/data_context.hpp"
#include "rive/viewmodel/viewmodel_instance_viewmodel.hpp"
using namespace rive;
DataContext::DataContext(ViewModelInstance* viewModelInstance) :
m_ViewModelInstance(viewModelInstance)
{}
DataContext::DataContext() : m_ViewModelInstances({}) {}
DataContext::~DataContext() {}
void DataContext::addViewModelInstance(ViewModelInstance* value)
{
m_ViewModelInstances.push_back(value);
}
void DataContext::viewModelInstance(ViewModelInstance* value) { m_ViewModelInstance = value; }
ViewModelInstanceValue* DataContext::getViewModelProperty(const std::vector<uint32_t> path) const
{
std::vector<uint32_t>::const_iterator it;
if (path.size() == 0)
{
return nullptr;
}
// TODO: @hernan review. We should probably remove the std::vector and only keep the instance
for (auto viewModel : m_ViewModelInstances)
{
if (viewModel->viewModelId() == path[0])
{
ViewModelInstance* instance = viewModel;
for (it = path.begin() + 1; it != path.end() - 1; it++)
{
instance = instance->propertyValue(*it)
->as<ViewModelInstanceViewModel>()
->referenceViewModelInstance();
}
ViewModelInstanceValue* value = instance->propertyValue(*it++);
return value;
}
}
if (m_ViewModelInstance != nullptr && m_ViewModelInstance->viewModelId() == path[0])
{
ViewModelInstance* instance = m_ViewModelInstance;
for (it = path.begin() + 1; it != path.end() - 1; it++)
{
instance = instance->propertyValue(*it)
->as<ViewModelInstanceViewModel>()
->referenceViewModelInstance();
}
ViewModelInstanceValue* value = instance->propertyValue(*it++);
return value;
}
if (m_Parent != nullptr)
{
return m_Parent->getViewModelProperty(path);
}
return nullptr;
}
ViewModelInstance* DataContext::getViewModelInstance(const std::vector<uint32_t> path) const
{
std::vector<uint32_t>::const_iterator it;
if (path.size() == 0)
{
return nullptr;
}
if (m_ViewModelInstance != nullptr && m_ViewModelInstance->viewModelId() == path[0])
{
ViewModelInstance* instance = m_ViewModelInstance;
for (it = path.begin() + 1; it != path.end(); it++)
{
instance = instance->propertyValue(*it)
->as<ViewModelInstanceViewModel>()
->referenceViewModelInstance();
if (instance == nullptr)
{
return instance;
}
}
return instance;
}
if (m_Parent != nullptr)
{
return m_Parent->getViewModelInstance(path);
}
return nullptr;
}