blob: 178ce06c541648c7cd08ef82148f1dc1a8b220e1 [file] [log] [blame] [edit]
#include "rive/nested_artboard_layout.hpp"
#include "rive/artboard.hpp"
#include "rive/math/aabb.hpp"
#include "rive/layout/layout_data.hpp"
using namespace rive;
Core* NestedArtboardLayout::clone() const
{
NestedArtboardLayout* nestedArtboard =
static_cast<NestedArtboardLayout*>(NestedArtboardLayoutBase::clone());
nestedArtboard->file(file());
if (m_Artboard == nullptr)
{
return nestedArtboard;
}
auto ni = m_Artboard->instance();
nestedArtboard->nest(ni.release());
return nestedArtboard;
}
AABB NestedArtboardLayout::layoutBounds()
{
#ifdef WITH_RIVE_LAYOUT
if (artboardInstance() != nullptr)
{
return artboardInstance()->layoutBounds();
}
#endif
return AABB();
}
#ifdef WITH_RIVE_LAYOUT
void* NestedArtboardLayout::layoutNode(int index)
{
if (artboardInstance() == nullptr)
{
return nullptr;
}
return static_cast<void*>(&artboardInstance()->takeLayoutData()->node);
}
#endif
void NestedArtboardLayout::markHostingLayoutDirty(
ArtboardInstance* artboardInstance)
{
if (artboard() != nullptr)
{
artboard()->markLayoutDirty(this->artboardInstance());
artboard()->markLayoutStyleDirty();
}
}
void NestedArtboardLayout::markLayoutNodeDirty(
bool shouldForceUpdateLayoutBounds)
{
updateWidthOverride();
updateHeightOverride();
}
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;
}
}
void NestedArtboardLayout::updateConstraints()
{
if (m_layoutConstraints.size() > 0)
{
for (auto parentConstraint : m_layoutConstraints)
{
parentConstraint->constrainChild(this);
}
}
Super::updateConstraints();
}
StatusCode NestedArtboardLayout::onAddedClean(CoreContext* context)
{
StatusCode code = Super::onAddedClean(context);
if (code != StatusCode::Ok)
{
return code;
}
updateWidthOverride();
updateHeightOverride();
return StatusCode::Ok;
}
void NestedArtboardLayout::updateLayoutBounds(bool animate)
{
#ifdef WITH_RIVE_LAYOUT
if (artboardInstance() == nullptr)
{
return;
}
artboardInstance()->updateLayoutBounds(animate);
#endif
}
void NestedArtboardLayout::updateWidthOverride()
{
if (artboardInstance() == nullptr)
{
return;
}
m_styleOverrider.updateWidthOverride(artboardInstance());
}
void NestedArtboardLayout::updateHeightOverride()
{
if (artboardInstance() == nullptr)
{
return;
}
m_styleOverrider.updateHeightOverride(artboardInstance());
}
bool NestedArtboardLayout::isRow()
{
return parent()->is<LayoutComponent>()
? parent()->as<LayoutComponent>()->mainAxisIsRow()
: true;
}
void NestedArtboardLayout::instanceWidthChanged() { updateWidthOverride(); }
void NestedArtboardLayout::instanceHeightChanged() { updateHeightOverride(); }
void NestedArtboardLayout::instanceWidthUnitsValueChanged()
{
updateWidthOverride();
}
void NestedArtboardLayout::instanceHeightUnitsValueChanged()
{
updateHeightOverride();
}
void NestedArtboardLayout::instanceWidthScaleTypeChanged()
{
updateWidthOverride();
}
void NestedArtboardLayout::instanceHeightScaleTypeChanged()
{
updateHeightOverride();
}
bool NestedArtboardLayout::syncStyleChanges()
{
if (m_Artboard == nullptr)
{
return false;
}
return m_Artboard->syncStyleChanges();
}
void NestedArtboardLayout::updateArtboard(
ViewModelInstanceArtboard* viewModelInstanceArtboard)
{
#ifdef WITH_RIVE_LAYOUT
if (parent()->is<LayoutComponent>())
{
parent()->as<LayoutComponent>()->clearLayoutChildren();
}
#endif
NestedArtboard::updateArtboard(viewModelInstanceArtboard);
updateWidthOverride();
updateHeightOverride();
#ifdef WITH_RIVE_LAYOUT
if (parent()->is<LayoutComponent>())
{
parent()->as<LayoutComponent>()->syncLayoutChildren();
}
#endif
}