| |
| #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; |
| } |