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