blob: 802c43616be1c1bdd90db4b86f788bf6b6542e8c [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;
ViewModelInstanceList::~ViewModelInstanceList() {}
void ViewModelInstanceList::propertyValueChanged()
{
addDirt(ComponentDirt::Bindings);
onValueChanged();
}
void ViewModelInstanceList::addItem(rcp<ViewModelInstanceListItem> item)
{
m_ListItems.push_back(item);
propertyValueChanged();
}
bool ViewModelInstanceList::addItemAt(rcp<ViewModelInstanceListItem> item,
int index)
{
if (index <= m_ListItems.size())
{
m_ListItems.insert(m_ListItems.begin() + index, item);
propertyValueChanged();
return true;
}
return false;
}
void ViewModelInstanceList::internalAddItem(rcp<ViewModelInstanceListItem> item)
{
// For ViewModelInstanceListItems that are built as a core object
// we skip the ref since core has already reffed it
m_ListItems.push_back(item);
}
void ViewModelInstanceList::removeItem(int index)
{
// TODO: @hernan decide if we want to return a boolean
if (index >= 0 && index < m_ListItems.size())
{
auto listItem = m_ListItems[index];
m_ListItems.erase(m_ListItems.begin() + index);
propertyValueChanged();
}
}
void ViewModelInstanceList::removeItem(rcp<ViewModelInstanceListItem> listItem)
{
auto noSpaceEnd =
std::remove(m_ListItems.begin(), m_ListItems.end(), listItem);
m_ListItems.erase(noSpaceEnd, m_ListItems.end());
propertyValueChanged();
}
rcp<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->internalAddItem(rcp<ViewModelInstanceListItem>(clonedValue));
}
return cloned;
}
void ViewModelInstanceList::advanced()
{
for (auto item : m_ListItems)
{
if (item->viewModelInstance() != nullptr)
{
item->viewModelInstance()->advanced();
}
}
ViewModelInstanceValue::advanced();
}