Commit 53884a37 authored by Adam Barth's avatar Adam Barth

Generalize _cleanRelayoutSubtreeRootChildren into visitChildren

This generalization will let us implement other alogorithims that need to walk
the RenderObject tree.
parent 0c05c97e
......@@ -90,6 +90,7 @@ abstract class Constraints {
bool get isTight;
}
typedef void RenderObjectVisitor(RenderObject child);
typedef void LayoutCallback(Constraints constraints);
abstract class RenderObject extends AbstractNode implements HitTestTarget {
......@@ -125,6 +126,9 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
markNeedsLayout();
}
// Override in subclasses with children and call the visitor for each child.
void visitChildren(RenderObjectVisitor visitor) { }
static bool _debugDoingLayout = false;
static bool get debugDoingLayout => _debugDoingLayout;
bool _debugDoingThisResize = false;
......@@ -193,10 +197,11 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
if (_relayoutSubtreeRoot != this) {
_relayoutSubtreeRoot = null;
_needsLayout = true;
_cleanRelayoutSubtreeRootChildren();
visitChildren((RenderObject child) {
child._cleanRelayoutSubtreeRoot();
});
}
}
void _cleanRelayoutSubtreeRootChildren() { } // workaround for lack of inter-class mixins in Dart
void scheduleInitialLayout() {
assert(attached);
assert(parent == null);
......@@ -541,9 +546,9 @@ abstract class RenderObjectWithChildMixin<ChildType extends RenderObject> implem
if (_child != null)
_child.detach();
}
void _cleanRelayoutSubtreeRootChildren() {
void visitChildren(RenderObjectVisitor visitor) {
if (_child != null)
_child._cleanRelayoutSubtreeRoot();
visitor(_child);
}
String debugDescribeChildren(String prefix) {
if (child != null)
......@@ -734,10 +739,10 @@ abstract class ContainerRenderObjectMixin<ChildType extends RenderObject, Parent
child = child.parentData.nextSibling;
}
}
void _cleanRelayoutSubtreeRootChildren() {
void visitChildren(RenderObjectVisitor visitor) {
ChildType child = _firstChild;
while (child != null) {
child._cleanRelayoutSubtreeRoot();
visitor(child);
assert(child.parentData is ParentDataType);
child = child.parentData.nextSibling;
}
......
......@@ -70,6 +70,14 @@ class RenderScaffold extends RenderBox {
}
}
void visitChildren(RenderObjectVisitor visitor) {
for (ScaffoldSlots slot in ScaffoldSlots.values) {
RenderBox box = _slots[slot];
if (box != null)
visitor(box);
}
}
ScaffoldSlots remove(RenderBox child) {
assert(child != null);
for (ScaffoldSlots slot in ScaffoldSlots.values) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment