blob: 501ffd67aec6f920c406427a2b02d82b57da1271 [file] [log] [blame]
#include "rive/nested_artboard_layout.hpp"
#include "rive/artboard.hpp"
using namespace rive;
Core* NestedArtboardLayout::clone() const
{
NestedArtboardLayout* nestedArtboard =
static_cast<NestedArtboardLayout*>(NestedArtboardLayoutBase::clone());
if (m_Artboard == nullptr)
{
return nestedArtboard;
}
auto ni = m_Artboard->instance();
nestedArtboard->nest(ni.release());
return nestedArtboard;
}
float NestedArtboardLayout::actualInstanceWidth()
{
return instanceWidth() == -1.0f ? artboardInstance()->originalWidth() : instanceWidth();
}
float NestedArtboardLayout::actualInstanceHeight()
{
return instanceHeight() == -1.0f ? artboardInstance()->originalHeight() : instanceHeight();
}
#ifdef WITH_RIVE_LAYOUT
void* NestedArtboardLayout::layoutNode()
{
if (artboardInstance() == nullptr)
{
return nullptr;
}
return artboardInstance()->takeLayoutNode();
}
#endif
void NestedArtboardLayout::markNestedLayoutDirty()
{
if (artboardInstance() != nullptr)
{
artboardInstance()->markLayoutNodeDirty();
}
}
void NestedArtboardLayout::update(ComponentDirt value)
{
Super::update(value);
auto artboard = artboardInstance();
if (hasDirt(value, ComponentDirt::WorldTransform) && artboard != nullptr)
{
auto layoutPosition = Vec2D(artboard->layoutX(), artboard->layoutY());
if (parent()->is<Artboard>())
{
auto parentArtboard = parent()->as<Artboard>();
auto correctedArtboardSpace =
Mat2D::fromTranslation(parentArtboard->origin() + layoutPosition);
m_WorldTransform = correctedArtboardSpace * m_WorldTransform;
}
else
{
m_WorldTransform = Mat2D::fromTranslation(layoutPosition) * m_WorldTransform;
}
auto back = Mat2D::fromTranslation(-artboard->origin());
m_WorldTransform = back * m_WorldTransform;
}
}
StatusCode NestedArtboardLayout::onAddedClean(CoreContext* context)
{
StatusCode code = Super::onAddedClean(context);
if (code != StatusCode::Ok)
{
return code;
}
updateWidthOverride();
updateHeightOverride();
return StatusCode::Ok;
}
void NestedArtboardLayout::updateWidthOverride()
{
if (artboardInstance() == nullptr)
{
return;
}
auto isRow =
parent()->is<LayoutComponent>() ? parent()->as<LayoutComponent>()->mainAxisIsRow() : true;
if (instanceWidthScaleType() == 0) // LayoutScaleType::fixed
{
// If we're set to fixed, pass the unit value (points|percent)
artboardInstance()->widthOverride(actualInstanceWidth(), instanceWidthUnitsValue(), isRow);
}
else if (instanceWidthScaleType() == 1) // LayoutScaleType::fill
{
// If we're set to fill, pass auto
artboardInstance()->widthOverride(actualInstanceWidth(), 3, isRow);
}
}
void NestedArtboardLayout::updateHeightOverride()
{
if (artboardInstance() == nullptr)
{
return;
}
auto isRow =
parent()->is<LayoutComponent>() ? parent()->as<LayoutComponent>()->mainAxisIsRow() : true;
if (instanceHeightScaleType() == 0) // LayoutScaleType::fixed
{
// If we're set to fixed, pass the unit value (points|percent)
artboardInstance()->heightOverride(actualInstanceHeight(),
instanceHeightUnitsValue(),
isRow);
}
else if (instanceHeightScaleType() == 1) // LayoutScaleType::fill
{
// If we're set to fill, pass auto
artboardInstance()->heightOverride(actualInstanceHeight(), 3, isRow);
}
}
void NestedArtboardLayout::instanceWidthChanged() { updateWidthOverride(); }
void NestedArtboardLayout::instanceHeightChanged() { updateHeightOverride(); }
void NestedArtboardLayout::instanceWidthUnitsValueChanged() { updateWidthOverride(); }
void NestedArtboardLayout::instanceHeightUnitsValueChanged() { updateHeightOverride(); }
void NestedArtboardLayout::instanceWidthScaleTypeChanged() { updateWidthOverride(); }
void NestedArtboardLayout::instanceHeightScaleTypeChanged() { updateHeightOverride(); }