blob: 324581f3f37bf7980ec7330cb0794e3ed5276758 [file] [log] [blame]
#include "rive/viewmodel/runtime/viewmodel_runtime.hpp"
#include "rive/viewmodel/viewmodel.hpp"
#include "rive/viewmodel/viewmodel_property_asset_image.hpp"
#include "rive/viewmodel/viewmodel_property_string.hpp"
#include "rive/viewmodel/viewmodel_property_number.hpp"
#include "rive/viewmodel/viewmodel_property_boolean.hpp"
#include "rive/viewmodel/viewmodel_property_color.hpp"
#include "rive/viewmodel/viewmodel_property_list.hpp"
#include "rive/viewmodel/viewmodel_property_enum.hpp"
#include "rive/viewmodel/viewmodel_property_enum_custom.hpp"
#include "rive/viewmodel/viewmodel_property_enum_system.hpp"
#include "rive/viewmodel/viewmodel_property_trigger.hpp"
#include "rive/viewmodel/viewmodel_property_symbol_list_index.hpp"
#include "rive/viewmodel/viewmodel_property_viewmodel.hpp"
#include "rive/viewmodel/viewmodel_property_artboard.hpp"
#include "rive/file.hpp"
#include "rive/refcnt.hpp"
// Default namespace for Rive Cpp code
using namespace rive;
ViewModelRuntime::ViewModelRuntime(ViewModel* viewModel, const File* file) :
m_viewModel(viewModel), m_file(file)
{}
size_t ViewModelRuntime::instanceCount() const
{
return m_viewModel->instanceCount();
}
size_t ViewModelRuntime::propertyCount() const
{
return m_viewModel->properties().size();
}
const std::string& ViewModelRuntime::name() const
{
return m_viewModel->name();
}
std::vector<PropertyData> ViewModelRuntime::buildPropertiesData(
std::vector<rive::ViewModelProperty*>& properties)
{
std::vector<PropertyData> props;
for (auto property : properties)
{
DataType type = DataType::none;
switch (property->coreType())
{
case ViewModelPropertyString::typeKey:
type = DataType::string;
break;
case ViewModelPropertyNumber::typeKey:
type = DataType::number;
break;
case ViewModelPropertyBoolean::typeKey:
type = DataType::boolean;
break;
case ViewModelPropertyColor::typeKey:
type = DataType::color;
break;
case ViewModelPropertyList::typeKey:
type = DataType::list;
break;
case ViewModelPropertyEnum::typeKey:
case ViewModelPropertyEnumCustomBase::typeKey:
case ViewModelPropertyEnumSystemBase::typeKey:
type = DataType::enumType;
break;
case ViewModelPropertyTrigger::typeKey:
type = DataType::trigger;
break;
case ViewModelPropertyViewModelBase::typeKey:
type = DataType::viewModel;
break;
case ViewModelPropertySymbolListIndex::typeKey:
type = DataType::symbolListIndex;
break;
case ViewModelPropertyAssetImage::typeKey:
type = DataType::assetImage;
break;
case ViewModelPropertyArtboard::typeKey:
type = DataType::artboard;
break;
default:
break;
}
props.push_back({type, property->name()});
}
return props;
}
std::vector<PropertyData> ViewModelRuntime::properties()
{
auto props = m_viewModel->properties();
return buildPropertiesData(props);
}
std::vector<std::string> ViewModelRuntime::instanceNames() const
{
auto instances = m_viewModel->instances();
std::vector<std::string> names;
for (auto instance : instances)
{
names.push_back(instance->name());
}
return names;
}
ViewModelInstanceRuntime* ViewModelRuntime::createInstanceFromIndex(
const size_t index) const
{
auto viewModelInstance = m_viewModel->instance(index);
if (viewModelInstance != nullptr)
{
auto copy = rcp<ViewModelInstance>(
viewModelInstance->clone()->as<ViewModelInstance>());
m_file->completeViewModelInstance(copy);
return createRuntimeInstance(copy);
}
else
{
fprintf(
stderr,
"Could not find View Model Instance. Index %zu is out of range.\n",
index);
}
return nullptr;
}
ViewModelInstanceRuntime* ViewModelRuntime::createInstanceFromName(
const std::string& name) const
{
auto viewModelInstance = m_viewModel->instance(name);
if (viewModelInstance != nullptr)
{
auto copy = rcp<ViewModelInstance>(
viewModelInstance->clone()->as<ViewModelInstance>());
m_file->completeViewModelInstance(copy);
return createRuntimeInstance(copy);
}
else
{
fprintf(stderr,
"Could not find View Model Instance named %s. Was it marked to "
"export "
"with the file?\n",
name.c_str());
}
return nullptr;
}
ViewModelInstanceRuntime* ViewModelRuntime::createDefaultInstance() const
{
auto viewModelInstance =
m_file->createDefaultViewModelInstance(m_viewModel);
if (viewModelInstance != nullptr)
{
return createRuntimeInstance(viewModelInstance);
}
fprintf(stderr,
"Default instance not found. Creating empty instance instead.\n");
return createInstance();
}
ViewModelInstanceRuntime* ViewModelRuntime::createInstance() const
{
auto instance = m_file->createViewModelInstance(m_viewModel);
return createRuntimeInstance(instance);
}
ViewModelInstanceRuntime* ViewModelRuntime::createRuntimeInstance(
rcp<ViewModelInstance> instance) const
{
if (instance != nullptr)
{
auto viewModelInstanceRuntime = rcp<ViewModelInstanceRuntime>(
new ViewModelInstanceRuntime(instance));
m_viewModelInstanceRuntimes.push_back(viewModelInstanceRuntime);
return viewModelInstanceRuntime.get();
}
return nullptr;
}