| #ifndef _RIVE_LAYOUT_NODE_PROVIDER_HPP_ | |
| #define _RIVE_LAYOUT_NODE_PROVIDER_HPP_ | |
| #include "rive/layout/layout_enums.hpp" | |
| #include "rive/math/aabb.hpp" | |
| #include <assert.h> | |
| #include <vector> | |
| namespace rive | |
| { | |
| class Component; | |
| class KeyFrameInterpolator; | |
| class LayoutConstraint; | |
| class TransformComponent; | |
| class LayoutStyleApplier; | |
| class LayoutNodeProvider | |
| { | |
| protected: | |
| // Lazily allocated: null (8 bytes, no heap) until this provider actually | |
| // gains a layout constraint — which most instances never do. | |
| std::vector<LayoutConstraint*>* m_layoutConstraints = nullptr; | |
| // Read access; returns a shared empty list when none are allocated. | |
| const std::vector<LayoutConstraint*>& layoutConstraints() const | |
| { | |
| static const std::vector<LayoutConstraint*> empty; | |
| return m_layoutConstraints != nullptr ? *m_layoutConstraints : empty; | |
| } | |
| public: | |
| virtual ~LayoutNodeProvider() { delete m_layoutConstraints; } | |
| #ifdef WITH_RIVE_LAYOUT | |
| virtual void* layoutNode(int index) = 0; | |
| #endif | |
| static LayoutNodeProvider* from(Component* component); | |
| virtual TransformComponent* transformComponent() = 0; | |
| void addLayoutConstraint(LayoutConstraint* constraint); | |
| virtual AABB layoutBounds() = 0; | |
| virtual AABB layoutBoundsForNode(int index) { return layoutBounds(); } | |
| virtual bool syncStyleChanges() { return false; }; | |
| virtual void updateLayoutBounds(bool animate = true) {}; | |
| virtual void markLayoutNodeDirty(bool shouldForceUpdateLayoutBounds = false) | |
| {} | |
| #ifdef WITH_RIVE_LAYOUT | |
| /// Registers an object that contributes to this provider's yoga style. | |
| /// Lets an applier attach without caring whether its owner is a | |
| /// LayoutComponent or a LayoutParticipant, and without the provider having | |
| /// to publish its LayoutData. Runtime objects are never removed, so there | |
| /// is no unregister — the editor handles that in Dart. | |
| virtual void addLayoutStyleApplier(LayoutStyleApplier* applier) {} | |
| #endif | |
| virtual size_t numLayoutNodes() = 0; | |
| #ifdef WITH_RIVE_LAYOUT | |
| virtual bool cascadeLayoutStyle( | |
| LayoutStyleInterpolation inheritedInterpolation, | |
| KeyFrameInterpolator* inheritedInterpolator, | |
| float inheritedInterpolationTime, | |
| LayoutDirection direction) | |
| { | |
| return false; | |
| } | |
| #endif | |
| }; | |
| } // namespace rive | |
| #endif |