| #include "rive/parent_traversal.hpp" |
| #include "rive/artboard.hpp" |
| #include "rive/artboard_host.hpp" |
| #include "rive/component.hpp" |
| #include "rive/container_component.hpp" |
| |
| using namespace rive; |
| |
| ParentTraversal::ParentTraversal(Component* start) : |
| m_current(start != nullptr ? start->parent() : nullptr), |
| m_currentArtboard(start != nullptr ? start->artboard() : nullptr) |
| {} |
| |
| ContainerComponent* ParentTraversal::next() |
| { |
| // Reset boundary crossing state |
| m_didCrossBoundary = false; |
| m_crossingHost = nullptr; |
| m_sourceArtboard = nullptr; |
| |
| if (m_current == nullptr) |
| { |
| return nullptr; |
| } |
| |
| ContainerComponent* result = m_current; |
| |
| // Advance to next parent |
| if (m_current->parent() != nullptr) |
| { |
| m_current = m_current->parent(); |
| } |
| else if (m_currentArtboard != nullptr && |
| m_currentArtboard->host() != nullptr) |
| { |
| // No direct parent - try crossing artboard boundary |
| auto* host = m_currentArtboard->host(); |
| auto* hostComponent = host->hostComponent(); |
| |
| if (hostComponent != nullptr && hostComponent->parent() != nullptr) |
| { |
| // Record boundary crossing info before updating state |
| m_didCrossBoundary = true; |
| m_crossingHost = host; |
| m_sourceArtboard = m_currentArtboard; |
| |
| m_current = hostComponent->parent(); |
| m_currentArtboard = host->parentArtboard(); |
| } |
| else |
| { |
| m_current = nullptr; |
| } |
| } |
| else |
| { |
| m_current = nullptr; |
| } |
| |
| return result; |
| } |