| #include "rive/component_dirt.hpp" |
| #include "rive/layout_component.hpp" |
| #include "rive/scripted/scripted_layout.hpp" |
| |
| using namespace rive; |
| |
| #ifdef WITH_RIVE_SCRIPTING |
| |
| void ScriptedLayout::didHydrateScriptInputs() |
| { |
| ScriptedDrawable::didHydrateScriptInputs(); |
| if (parent() != nullptr && parent()->is<LayoutComponent>()) |
| { |
| parent()->as<LayoutComponent>()->markLayoutNodeDirty(true); |
| } |
| } |
| |
| void ScriptedLayout::callScriptedResize(Vec2D size) |
| { |
| if (!resizes() || m_vm == nullptr || !m_vm->valid()) |
| { |
| return; |
| } |
| m_vm->callLayoutResize(this, m_self, size); |
| } |
| |
| Vec2D ScriptedLayout::measureLayout(float width, |
| LayoutMeasureMode widthMode, |
| float height, |
| LayoutMeasureMode heightMode) |
| { |
| if (!measures() || m_vm == nullptr || !m_vm->valid()) |
| { |
| return Vec2D(0, 0); |
| } |
| Vec2D measured(std::numeric_limits<float>::max(), |
| std::numeric_limits<float>::max()); |
| if (!m_vm->callLayoutMeasure(this, m_self, &measured)) |
| { |
| // Assumed for legacy files but not implemented; report no measurement |
| // (same as !measures()). Errors keep the unbounded default so the |
| // clamp below still applies. |
| return Vec2D(0, 0); |
| } |
| return Vec2D(std::min((widthMode == LayoutMeasureMode::undefined |
| ? std::numeric_limits<float>::max() |
| : width), |
| measured.x), |
| std::min((heightMode == LayoutMeasureMode::undefined |
| ? std::numeric_limits<float>::max() |
| : height), |
| measured.y)); |
| } |
| |
| void ScriptedLayout::controlSize(Vec2D size, |
| LayoutScaleType widthScaleType, |
| LayoutScaleType heightScaleType, |
| LayoutDirection direction) |
| { |
| m_size = size; |
| m_sizeKnown = true; |
| callScriptedResize(size); |
| } |
| #else |
| Vec2D ScriptedLayout::measureLayout(float width, |
| LayoutMeasureMode widthMode, |
| float height, |
| LayoutMeasureMode heightMode) |
| { |
| return Vec2D((widthMode == LayoutMeasureMode::undefined |
| ? std::numeric_limits<float>::max() |
| : width), |
| (heightMode == LayoutMeasureMode::undefined |
| ? std::numeric_limits<float>::max() |
| : height)); |
| } |
| |
| void ScriptedLayout::controlSize(Vec2D size, |
| LayoutScaleType widthScaleType, |
| LayoutScaleType heightScaleType, |
| LayoutDirection direction) |
| { |
| m_size = size; |
| m_sizeKnown = true; |
| } |
| #endif |
| |
| void ScriptedLayout::addProperty(CustomProperty* prop) |
| { |
| auto scriptInput = ScriptInput::from(prop); |
| if (scriptInput != nullptr) |
| { |
| scriptInput->scriptedObject(this); |
| } |
| CustomPropertyContainer::addProperty(prop); |
| } |
| |
| Core* ScriptedLayout::clone() const |
| { |
| ScriptedLayout* twin = ScriptedLayoutBase::clone()->as<ScriptedLayout>(); |
| if (m_fileAsset != nullptr) |
| { |
| twin->setAsset(m_fileAsset); |
| } |
| return twin; |
| } |