blob: 0ac9f5a1a45e780522568f95667feaa8887bf310 [file] [log] [blame]
#include <sstream>
#include <iomanip>
#include <array>
#include "rive/viewmodel/viewmodel_instance_list.hpp"
#include "rive/viewmodel/viewmodel_instance_list_item.hpp"
#include "rive/component_dirt.hpp"
using namespace rive;
void ViewModelInstanceList::propertyValueChanged() { addDirt(ComponentDirt::Components); }
void ViewModelInstanceList::addItem(ViewModelInstanceListItem* item)
{
m_ListItems.push_back(item);
propertyValueChanged();
}
void ViewModelInstanceList::insertItem(int index, ViewModelInstanceListItem* item)
{
// TODO: @hernan decide if we want to return a boolean
if (index < m_ListItems.size())
{
m_ListItems.insert(m_ListItems.begin() + index, item);
propertyValueChanged();
}
}
void ViewModelInstanceList::removeItem(int index)
{
// TODO: @hernan decide if we want to return a boolean
if (index < m_ListItems.size())
{
m_ListItems.erase(m_ListItems.begin() + index);
propertyValueChanged();
}
}
void ViewModelInstanceList::removeItem(ViewModelInstanceListItem* listItem)
{
auto noSpaceEnd = std::remove(m_ListItems.begin(), m_ListItems.end(), listItem);
m_ListItems.erase(noSpaceEnd, m_ListItems.end());
propertyValueChanged();
}
ViewModelInstanceListItem* ViewModelInstanceList::item(uint32_t index)
{
if (index < m_ListItems.size())
{
return m_ListItems[index];
}
return nullptr;
}
void ViewModelInstanceList::swap(uint32_t index1, uint32_t index2)
{
if (index1 < m_ListItems.size() && index2 < m_ListItems.size())
{
std::iter_swap(m_ListItems.begin() + index1, m_ListItems.begin() + index2);
propertyValueChanged();
}
}
Core* ViewModelInstanceList::clone() const
{
auto cloned = new ViewModelInstanceList();
cloned->copy(*this);
for (auto property : m_ListItems)
{
auto clonedValue = property->clone()->as<ViewModelInstanceListItem>();
cloned->addItem(clonedValue);
}
return cloned;
}