diff --git a/loader/include/Geode/cocos/base_nodes/Layout.hpp b/loader/include/Geode/cocos/base_nodes/Layout.hpp index c1dcd908..c78cb76a 100644 --- a/loader/include/Geode/cocos/base_nodes/Layout.hpp +++ b/loader/include/Geode/cocos/base_nodes/Layout.hpp @@ -23,7 +23,9 @@ class CCNode; */ class GEODE_DLL Layout : public CCObject { protected: - static CCArray* getNodesToPosition(CCNode* forNode); + CCArray* getNodesToPosition(CCNode* forNode); + + bool m_ignoreInvisibleChildren = false; public: /** @@ -35,6 +37,9 @@ public: */ virtual void apply(CCNode* on) = 0; + void ignoreInvisibleChildren(bool ignore); + bool isIgnoreInvisibleChildren() const; + virtual ~Layout() = default; }; diff --git a/loader/src/cocos2d-ext/Layout.cpp b/loader/src/cocos2d-ext/Layout.cpp index d64fd437..efa61493 100644 --- a/loader/src/cocos2d-ext/Layout.cpp +++ b/loader/src/cocos2d-ext/Layout.cpp @@ -51,10 +51,21 @@ bool CCNode::hasAncestor(CCNode* ancestor) { } CCArray* Layout::getNodesToPosition(CCNode* on) { - if (!on->getChildren()) { - return CCArray::create(); + auto arr = CCArray::create(); + for (auto child : CCArrayExt<CCNode>(on->getChildren())) { + if (!m_ignoreInvisibleChildren || child->isVisible()) { + arr->addObject(child); + } } - return on->getChildren()->shallowCopy(); + return arr; +} + +void Layout::ignoreInvisibleChildren(bool ignore) { + m_ignoreInvisibleChildren = ignore; +} + +bool Layout::isIgnoreInvisibleChildren() const { + return m_ignoreInvisibleChildren; } static AxisLayoutOptions const* axisOpts(CCNode* node) {