Chromium Code Reviews| Index: sky/sdk/lib/widgets/block_viewport.dart |
| diff --git a/sky/sdk/lib/widgets/block_viewport.dart b/sky/sdk/lib/widgets/block_viewport.dart |
| index 8aa0f0c3756dd5379739ca19977e2cf0cc7417af..c46a04bb0bc36e7ba321fe37008a44a6e149698e 100644 |
| --- a/sky/sdk/lib/widgets/block_viewport.dart |
| +++ b/sky/sdk/lib/widgets/block_viewport.dart |
| @@ -2,6 +2,8 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +import 'dart:collection'; |
| + |
| import '../rendering/block.dart'; |
| import '../rendering/box.dart'; |
| import '../rendering/object.dart'; |
| @@ -10,6 +12,12 @@ import 'widget.dart'; |
| // return null if index is greater than index of last entry |
| typedef Widget IndexedBuilder(int index); |
| +typedef void LayoutChangedCallback( |
| + int firstVisibleWidgetIndex, |
| + int visibleWidgetCount, |
| + UnmodifiableListView<double> widgetOffsets, |
| + bool lastWidgetReached); |
|
Hixie
2015/07/10 22:51:38
paren on its own line
hansmuller
2015/07/10 23:42:05
Done.
|
| + |
| class _Key { |
| const _Key(this.type, this.key); |
| factory _Key.fromWidget(Widget widget) => new _Key(widget.runtimeType, widget.key); |
| @@ -20,12 +28,13 @@ class _Key { |
| } |
| class BlockViewport extends RenderObjectWrapper { |
| - BlockViewport({ this.builder, this.startOffset, this.token, String key }) |
| + BlockViewport({ this.builder, this.startOffset, this.token, this.onLayoutChanged, String key }) |
| : super(key: key); |
| IndexedBuilder builder; |
| double startOffset; |
| Object token; |
| + LayoutChangedCallback onLayoutChanged; |
| RenderBlockViewport get root => super.root; |
| RenderBlockViewport createNode() => new RenderBlockViewport(); |
| @@ -83,6 +92,7 @@ class BlockViewport extends RenderObjectWrapper { |
| List<double> _offsets = <double>[0.0]; |
| int _currentStartIndex = 0; |
| int _currentChildCount = 0; |
| + bool _lastWidgetReached = false; |
|
Hixie
2015/07/10 22:51:37
lastWidgetReached would store a Widget. If you wan
hansmuller
2015/07/10 23:42:05
I've changed all the fooWidget names I added to fo
|
| int _findIndexForOffsetBeforeOrAt(double offset) { |
| int left = 0; |
| @@ -113,6 +123,7 @@ class BlockViewport extends RenderObjectWrapper { |
| builder = newNode.builder; |
| token = newNode.token; |
| _offsets = <double>[0.0]; |
| + _lastWidgetReached = false; |
| } |
| return true; |
| } |
| @@ -249,8 +260,10 @@ class BlockViewport extends RenderObjectWrapper { |
| while (_offsets[index] < endOffset) { |
| if (!builtChildren.containsKey(index)) { |
| Widget widget = _getWidget(index, innerConstraints); |
| - if (widget == null) |
| - break; // reached the end of the list |
| + if (widget == null) { |
| + _lastWidgetReached = true; |
| + break; |
| + } |
| newChildren[new _Key.fromWidget(widget)] = widget; |
| builtChildren[index] = widget; |
| } |
| @@ -287,6 +300,14 @@ class BlockViewport extends RenderObjectWrapper { |
| _childrenByKey = newChildren; |
| _currentStartIndex = startIndex; |
| _currentChildCount = _childrenByKey.length; |
| + |
| + if (onLayoutChanged != null) { |
| + onLayoutChanged( |
| + _currentStartIndex, |
|
Hixie
2015/07/10 22:51:38
this should be indented with two spaces.
hansmuller
2015/07/10 23:42:05
Done.
|
| + _currentChildCount, |
| + new UnmodifiableListView<double>(_offsets), |
| + _lastWidgetReached); |
|
Hixie
2015/07/10 22:51:37
closing paren should be on its own line.
hansmuller
2015/07/10 23:42:05
Done.
|
| + } |
| } |
| } |