| #include "rive/layout/grid_item_placement.hpp" | |
| #include "rive/container_component.hpp" | |
| #include "rive/layout/grid_track.hpp" | |
| #include "rive/layout/layout_node_provider.hpp" | |
| using namespace rive; | |
| GridItemPlacement* GridItemPlacement::from(const ContainerComponent* owner) | |
| { | |
| if (owner == nullptr) | |
| { | |
| return nullptr; | |
| } | |
| for (auto* child : owner->children()) | |
| { | |
| if (child->is<GridItemPlacement>()) | |
| { | |
| return child->as<GridItemPlacement>(); | |
| } | |
| } | |
| return nullptr; | |
| } | |
| StatusCode GridItemPlacement::onAddedClean(CoreContext* context) | |
| { | |
| StatusCode code = Super::onAddedClean(context); | |
| if (code != StatusCode::Ok) | |
| { | |
| return code; | |
| } | |
| #ifdef WITH_RIVE_LAYOUT | |
| // from() already resolves both shapes: a LayoutComponent provides for | |
| // itself, while Text/Image/Shape provide via their LayoutParticipant child. | |
| // onAddedClean runs after every object has resolved its parent, so the | |
| // sibling provider is findable now. | |
| if (auto* provider = LayoutNodeProvider::from(parent())) | |
| { | |
| provider->addLayoutStyleApplier(this); | |
| } | |
| #endif | |
| return StatusCode::Ok; | |
| } | |
| void GridItemPlacement::buildDependencies() | |
| { | |
| Super::buildDependencies(); | |
| if (parent() != nullptr) | |
| { | |
| parent()->addDependent(this); | |
| } | |
| } | |
| #ifdef WITH_RIVE_LAYOUT | |
| void GridItemPlacement::applyPlacementStyle(YGStyle& style, | |
| const LayoutSyncContext& context) | |
| { | |
| // A stack collapses every child into its single cell, so explicit placement | |
| // has nothing to say. Note this is a no-op rather than an absent applier: | |
| // reparenting between a grid and a stack must not create or destroy the | |
| // object, or the authored placement would be lost on the round trip. | |
| if (context.parentIsStack || !context.parentIsGrid) | |
| { | |
| return; | |
| } | |
| GridTrack::syncItemLines(style, | |
| gridColumn(), | |
| gridRow(), | |
| gridColumnSpan(), | |
| gridRowSpan()); | |
| } | |
| #endif | |
| void GridItemPlacement::markOwnerDirty() | |
| { | |
| if (auto* provider = LayoutNodeProvider::from(parent())) | |
| { | |
| provider->markLayoutNodeDirty(); | |
| } | |
| } | |
| void GridItemPlacement::gridColumnChanged() { markOwnerDirty(); } | |
| void GridItemPlacement::gridRowChanged() { markOwnerDirty(); } | |
| void GridItemPlacement::gridColumnSpanChanged() { markOwnerDirty(); } | |
| void GridItemPlacement::gridRowSpanChanged() { markOwnerDirty(); } |