| #include "rive/solo.hpp" |
| #include "rive/constraints/constraint.hpp" |
| #include "rive/shapes/clipping_shape.hpp" |
| #include "rive/artboard.hpp" |
| |
| using namespace rive; |
| |
| void Solo::propagateCollapse(bool collapse) |
| { |
| Core* active = collapse ? nullptr : artboard()->resolve(activeComponentId()); |
| for (Component* child : children()) |
| { |
| // Some child components shouldn't be considered as part of the solo set |
| // as they are more aking to properties of the solo itself. For those |
| // components, simply pass on the collapse value of the solo itself. |
| if (child->is<Constraint>() || child->is<ClippingShape>()) |
| { |
| child->collapse(collapse); |
| continue; |
| } |
| |
| // This child is part of the solo set so only make it active if it's the |
| // currently marked solo object. |
| child->collapse(child != active); |
| } |
| } |
| |
| bool Solo::collapse(bool value) |
| { |
| // Intentionally using Component instead of Super as we don't want to call |
| // collapse on the Container logic which just propagates blindly to |
| // children. |
| if (!Component::collapse(value)) |
| { |
| return false; |
| } |
| propagateCollapse(value); |
| return true; |
| } |
| |
| void Solo::activeComponentIdChanged() { propagateCollapse(isCollapsed()); } |
| |
| StatusCode Solo::onAddedClean(CoreContext* context) |
| { |
| StatusCode code = Super::onAddedClean(context); |
| if (code != StatusCode::Ok) |
| { |
| return code; |
| } |
| |
| propagateCollapse(isCollapsed()); |
| return StatusCode::Ok; |
| } |