| #include "rive/constraints/targeted_constraint.hpp" | |
| #include "rive/transform_component.hpp" | |
| #include "rive/core_context.hpp" | |
| using namespace rive; | |
| bool TargetedConstraint::validate(CoreContext* context) | |
| { | |
| if (!Super::validate(context)) | |
| { | |
| return false; | |
| } | |
| auto coreObject = context->resolve(targetId()); | |
| // If core object is not null and is not a TransformComponent it should | |
| // always be invalid | |
| if (coreObject != nullptr && !coreObject->is<TransformComponent>()) | |
| { | |
| return false; | |
| } | |
| return !requiresTarget() || coreObject != nullptr; | |
| } | |
| StatusCode TargetedConstraint::onAddedDirty(CoreContext* context) | |
| { | |
| StatusCode code = Super::onAddedDirty(context); | |
| if (code != StatusCode::Ok) | |
| { | |
| return code; | |
| } | |
| auto coreObject = context->resolve(targetId()); | |
| if (requiresTarget() && coreObject == nullptr) | |
| { | |
| return StatusCode::MissingObject; | |
| } | |
| #ifdef WITH_RIVE_EDITOR | |
| setTargetForEditor(static_cast<TransformComponent*>(coreObject)); | |
| #else | |
| m_Target = static_cast<TransformComponent*>(coreObject); | |
| #endif | |
| return StatusCode::Ok; | |
| } | |
| void TargetedConstraint::buildDependencies() | |
| { | |
| // Targeted constraints must have their constrained component (parent) | |
| // update after the target. | |
| if (auto* t = target()) | |
| { | |
| t->addDependent(parent()); | |
| } | |
| } |