| #ifndef _RIVE_LAYOUT_DATA_HPP_ | |
| #define _RIVE_LAYOUT_DATA_HPP_ | |
| #ifdef WITH_RIVE_LAYOUT | |
| #include "rive/layout/layout_style_applier.hpp" | |
| #include "rive/lazy_vector.hpp" | |
| #include "yoga/YGNode.h" | |
| #include "yoga/YGStyle.h" | |
| #include "yoga/Yoga.h" | |
| #endif | |
| #ifdef WITH_RIVE_TOOLS | |
| #include "rive/refcnt.hpp" | |
| #include <unordered_set> | |
| #endif | |
| namespace rive | |
| { | |
| class LayoutData | |
| #ifdef WITH_RIVE_TOOLS | |
| : public RefCnt<LayoutData> | |
| #endif | |
| { | |
| public: | |
| #ifdef WITH_RIVE_LAYOUT | |
| #ifdef WITH_RIVE_TOOLS | |
| std::unordered_set<LayoutData*> children; | |
| #ifdef DEBUG | |
| LayoutData() { count++; } | |
| #endif | |
| ~LayoutData() | |
| { | |
| #ifdef DEBUG | |
| count--; | |
| #endif | |
| clearChildren(); | |
| } | |
| void clearChildren() | |
| { | |
| for (auto child : children) | |
| { | |
| child->unref(); | |
| } | |
| children.clear(); | |
| } | |
| #ifdef DEBUG | |
| static uint32_t count; | |
| #endif | |
| #endif | |
| YGNode node; | |
| /// The Yoga style lives inside the node itself; this is the single source | |
| /// of truth appliers write into. Go through here rather than reaching for | |
| /// node.getStyle() so callers don't depend on YGNode's accessor shape. | |
| YGStyle& style() { return node.getStyle(); } | |
| const YGStyle& style() const { return node.getStyle(); } | |
| /// Objects contributing to this item's style. Lazy, so an item with none | |
| /// pays one null pointer. Unsorted — apply order comes from the phase | |
| /// methods, not from list order, which follows file order. | |
| LazyVector<LayoutStyleApplier*> appliers; | |
| /// No matching remove: runtime objects live for the artboard's lifetime. | |
| void addApplier(LayoutStyleApplier* applier) | |
| { | |
| appliers.pushUnique(applier); | |
| } | |
| /// Runs every applier phase by phase, so apply order can't depend on child | |
| /// order. | |
| void applyLayoutStyles(YGStyle& style, const LayoutSyncContext& context) | |
| { | |
| if (appliers.empty()) | |
| { | |
| return; | |
| } | |
| for (auto* applier : appliers) | |
| { | |
| applier->applyBaseStyle(style, context); | |
| } | |
| for (auto* applier : appliers) | |
| { | |
| applier->applyContainerStyle(style, context); | |
| } | |
| for (auto* applier : appliers) | |
| { | |
| applier->applyItemStyle(style, context); | |
| } | |
| for (auto* applier : appliers) | |
| { | |
| applier->applyPlacementStyle(style, context); | |
| } | |
| } | |
| #endif | |
| }; | |
| #ifdef WITH_RIVE_TOOLS | |
| typedef rcp<LayoutData> LayoutDataRef; | |
| #else | |
| typedef LayoutData* LayoutDataRef; | |
| #endif | |
| } // namespace rive | |
| #endif |