blob: bbf8e633cc61417204924975000186076f4b3f33 [file]
#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;
}