Commit 68565eb3 authored by Adam Barth's avatar Adam Barth

Use localToGlobal and globalToLocal in MimicOverlay

Also, make RenderStack support negative positions with clipping so that we can
expand objects that are partially offscreen.
parent 19fa9ae2
......@@ -38,12 +38,13 @@ class RenderStack extends RenderBox with ContainerRenderObjectMixin<RenderBox, S
addAll(children);
}
bool _hasVisualOverflow = false;
void setupParentData(RenderBox child) {
if (child.parentData is! StackParentData)
child.parentData = new StackParentData();
}
double getMinIntrinsicWidth(BoxConstraints constraints) {
double width = constraints.minWidth;
RenderBox child = firstChild;
......@@ -111,6 +112,7 @@ class RenderStack extends RenderBox with ContainerRenderObjectMixin<RenderBox, S
}
void performLayout() {
_hasVisualOverflow = false;
bool hasNonPositionedChildren = false;
double width = 0.0;
......@@ -175,14 +177,18 @@ class RenderStack extends RenderBox with ContainerRenderObjectMixin<RenderBox, S
x = childData.left;
else if (childData.right != null)
x = size.width - childData.right - child.size.width;
assert(x >= 0.0 && x + child.size.width <= size.width);
if (x < 0.0 || x + child.size.width > size.width)
_hasVisualOverflow = true;
double y = 0.0;
if (childData.top != null)
y = childData.top;
else if (childData.bottom != null)
y = size.height - childData.bottom - child.size.height;
assert(y >= 0.0 && y + child.size.height <= size.height);
if (y < 0.0 || y + child.size.height > size.height)
_hasVisualOverflow = true;
childData.position = new Point(x, y);
}
......@@ -196,6 +202,13 @@ class RenderStack extends RenderBox with ContainerRenderObjectMixin<RenderBox, S
}
void paint(PaintingCanvas canvas, Offset offset) {
defaultPaint(canvas, offset);
if (_hasVisualOverflow) {
canvas.save();
canvas.clipRect(offset & size);
defaultPaint(canvas, offset);
canvas.restore();
} else {
defaultPaint(canvas, offset);
}
}
}
......@@ -120,8 +120,7 @@ class Mimicable extends StatefulComponent {
if (_didStartMimic)
return;
assert(_mimic != null);
// TODO(abarth): We'll need to convert Point.origin to global coordinates.
Point globalPosition = Point.origin;
Point globalPosition = localToGlobal(Point.origin);
_mimic._startMimic(key, globalPosition & _size);
_didStartMimic = true;
}
......
......@@ -69,7 +69,7 @@ class MimicOverlay extends AnimatedComponent {
void _handleMimicCallback(Rect globalBounds) {
setState(() {
// TODO(abarth): We need to convert global bounds into local coordinates.
_mimicBounds.begin = globalBounds;
_mimicBounds.begin = globalToLocal(globalBounds.topLeft) & globalBounds.size;
_expandPerformance.forward();
});
}
......
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