| #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(); } |