blob: a28860181073e742536045b6a401c664938db27a [file] [log] [blame]
#include "rive/animation/transition_property_viewmodel_comparator.hpp"
#include "rive/animation/transition_value_number_comparator.hpp"
#include "rive/animation/transition_value_string_comparator.hpp"
#include "rive/animation/transition_value_color_comparator.hpp"
#include "rive/animation/transition_value_boolean_comparator.hpp"
#include "rive/animation/transition_value_enum_comparator.hpp"
#include "rive/animation/transition_value_trigger_comparator.hpp"
#include "rive/animation/state_machine_instance.hpp"
#include "rive/importers/bindable_property_importer.hpp"
#include "rive/data_bind/bindable_property_number.hpp"
#include "rive/data_bind/bindable_property_string.hpp"
#include "rive/data_bind/bindable_property_color.hpp"
#include "rive/data_bind/bindable_property_enum.hpp"
#include "rive/data_bind/bindable_property_boolean.hpp"
#include "rive/data_bind/bindable_property_trigger.hpp"
#include "rive/viewmodel/viewmodel_instance_trigger.hpp"
using namespace rive;
StatusCode TransitionPropertyViewModelComparator::import(
ImportStack& importStack)
{
auto bindablePropertyImporter =
importStack.latest<BindablePropertyImporter>(
BindablePropertyBase::typeKey);
if (bindablePropertyImporter == nullptr)
{
return StatusCode::MissingObject;
}
m_bindableProperty = bindablePropertyImporter->bindableProperty();
return Super::import(importStack);
}
bool TransitionPropertyViewModelComparator::compare(
TransitionComparator* comparand,
TransitionConditionOp operation,
const StateMachineInstance* stateMachineInstance,
StateMachineLayerInstance* layerInstance)
{
switch (m_bindableProperty->coreType())
{
case BindablePropertyNumber::typeKey:
if (comparand->is<TransitionPropertyViewModelComparator>())
{
auto rightValue =
comparand->as<TransitionPropertyViewModelComparator>()
->value<BindablePropertyNumber, float>(
stateMachineInstance);
return compareNumbers(
value<BindablePropertyNumber, float>(stateMachineInstance),
rightValue,
operation);
}
else if (comparand->is<TransitionValueNumberComparator>())
{
auto rightValue =
comparand->as<TransitionValueNumberComparator>()->value();
return compareNumbers(
value<BindablePropertyNumber, float>(stateMachineInstance),
rightValue,
operation);
}
break;
case BindablePropertyString::typeKey:
if (comparand->is<TransitionPropertyViewModelComparator>())
{
auto rightValue =
comparand->as<TransitionPropertyViewModelComparator>()
->value<BindablePropertyString, std::string>(
stateMachineInstance);
return compareStrings(
value<BindablePropertyString, std::string>(
stateMachineInstance),
rightValue,
operation);
}
else if (comparand->is<TransitionValueStringComparator>())
{
auto rightValue =
comparand->as<TransitionValueStringComparator>()->value();
return compareStrings(
value<BindablePropertyString, std::string>(
stateMachineInstance),
rightValue,
operation);
}
break;
case BindablePropertyColor::typeKey:
if (comparand->is<TransitionPropertyViewModelComparator>())
{
auto rightValue =
comparand->as<TransitionPropertyViewModelComparator>()
->value<BindablePropertyColor, int>(
stateMachineInstance);
return compareColors(
value<BindablePropertyColor, int>(stateMachineInstance),
rightValue,
operation);
}
else if (comparand->is<TransitionValueColorComparator>())
{
auto rightValue =
comparand->as<TransitionValueColorComparator>()->value();
return compareColors(
value<BindablePropertyColor, int>(stateMachineInstance),
rightValue,
operation);
}
break;
case BindablePropertyBoolean::typeKey:
if (comparand->is<TransitionPropertyViewModelComparator>())
{
auto rightValue =
comparand->as<TransitionPropertyViewModelComparator>()
->value<BindablePropertyBoolean, bool>(
stateMachineInstance);
return compareBooleans(
value<BindablePropertyBoolean, bool>(stateMachineInstance),
rightValue,
operation);
}
else if (comparand->is<TransitionValueBooleanComparator>())
{
auto rightValue =
comparand->as<TransitionValueBooleanComparator>()->value();
return compareBooleans(
value<BindablePropertyBoolean, bool>(stateMachineInstance),
rightValue,
operation);
}
break;
case BindablePropertyEnum::typeKey:
if (comparand->is<TransitionPropertyViewModelComparator>())
{
auto rightValue =
comparand->as<TransitionPropertyViewModelComparator>()
->value<BindablePropertyEnum, uint16_t>(
stateMachineInstance);
return compareEnums(
value<BindablePropertyEnum, uint16_t>(stateMachineInstance),
rightValue,
operation);
}
else if (comparand->is<TransitionValueEnumComparator>())
{
auto rightValue =
comparand->as<TransitionValueEnumComparator>()->value();
return compareEnums(
value<BindablePropertyEnum, uint16_t>(stateMachineInstance),
rightValue,
operation);
}
break;
case BindablePropertyTrigger::typeKey:
if (comparand->is<TransitionPropertyViewModelComparator>())
{
auto rightValue =
comparand->as<TransitionPropertyViewModelComparator>()
->value<BindablePropertyTrigger, uint32_t>(
stateMachineInstance);
return compareTriggers(value<BindablePropertyTrigger, uint32_t>(
stateMachineInstance),
rightValue,
operation);
}
else if (comparand->is<TransitionValueTriggerComparator>())
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(
m_bindableProperty);
auto dataBind = stateMachineInstance->bindableDataBindToTarget(
bindableInstance);
if (dataBind != nullptr)
{
auto source = dataBind->source();
if (source != nullptr &&
source->is<ViewModelInstanceTrigger>())
{
if (source->as<ViewModelInstanceTrigger>()
->isUsedInLayer(layerInstance))
{
return false;
}
}
}
auto leftValue = value<BindablePropertyTrigger, uint32_t>(
stateMachineInstance);
if (leftValue != 0)
{
return true;
}
}
break;
}
return false;
}