blob: 029613d909a735624c4bf4719d3ab64ffe9cf295 [file]
#include <sstream>
#include <iomanip>
#include <array>
#include "rive/viewmodel/viewmodel.hpp"
#include "rive/viewmodel/viewmodel_property.hpp"
#include "rive/backboard.hpp"
#include "rive/importers/backboard_importer.hpp"
using namespace rive;
ViewModel::~ViewModel()
{
for (auto& property : m_Properties)
{
delete property;
}
}
void ViewModel::addProperty(ViewModelProperty* property)
{
m_Properties.push_back(property);
}
ViewModelProperty* ViewModel::property(size_t index)
{
if (index < m_Properties.size())
{
return m_Properties[index];
}
return nullptr;
}
ViewModelProperty* ViewModel::property(const std::string& propName)
{
for (auto property : m_Properties)
{
if (property->name() == propName)
{
return property;
}
}
return nullptr;
}
ViewModelProperty* ViewModel::property(const SymbolType symbolType)
{
for (auto property : m_Properties)
{
if (property->symbolTypeValue() == static_cast<int>(symbolType))
{
return property;
}
}
return nullptr;
}
void ViewModel::addInstance(ViewModelInstance* value)
{
m_Instances.push_back(value);
value->viewModel(this);
}
ViewModelInstance* ViewModel::defaultInstance()
{
if (m_Instances.size() > 0)
{
return m_Instances[0];
}
return nullptr;
}
ViewModelInstance* ViewModel::instance(size_t index)
{
if (index < m_Instances.size())
{
return m_Instances[index];
}
return nullptr;
}
ViewModelInstance* ViewModel::instance(const std::string& name)
{
for (auto instance : m_Instances)
{
if (instance->name() == name)
{
return instance;
}
}
return nullptr;
}
size_t ViewModel::instanceCount() const { return m_Instances.size(); }
rcp<ViewModelInstance> ViewModel::createInstance()
{
if (m_file)
{
return m_file->createViewModelInstance(this);
}
return nullptr;
}
rcp<ViewModelInstance> ViewModel::createFromInstance(
const std::string& instanceName)
{
if (m_file)
{
return m_file->createViewModelInstance(this->name(), instanceName);
}
return nullptr;
}
#ifdef WITH_RIVE_EDITOR
void ViewModel::editorPrepareForDestruction()
{
// Definitions can be externally retained after the arena retires.
// Their instance lookup table must not expose freed arena entries.
m_Instances.erase(
std::remove_if(
m_Instances.begin(),
m_Instances.end(),
[](auto* instance) { return instance->editorArena() != nullptr; }),
m_Instances.end());
m_Properties.erase(
std::remove_if(
m_Properties.begin(),
m_Properties.end(),
[](auto* c) { return c->editorArena() != nullptr; }),
m_Properties.end());
}
#endif