blob: 031b9f3670750d26a8a43701381ba6779b89dc73 [file] [log] [blame]
#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;
}