Index: runtime/observatory/lib/src/elements/containers/virtual_collection.dart |
diff --git a/runtime/observatory/lib/src/elements/containers/virtual_collection.dart b/runtime/observatory/lib/src/elements/containers/virtual_collection.dart |
index 474753942d72635b0036580aa8f675a45418df7b..547a1fdcd3b54a3b4449aca17ed300f810608748 100644 |
--- a/runtime/observatory/lib/src/elements/containers/virtual_collection.dart |
+++ b/runtime/observatory/lib/src/elements/containers/virtual_collection.dart |
@@ -8,6 +8,7 @@ import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
import 'package:observatory/src/elements/helpers/tag.dart'; |
typedef HtmlElement VirtualCollectionCreateCallback(); |
+typedef List<HtmlElement> VirtualCollectionHeaderCallback(); |
typedef void VirtualCollectionUpdateCallback( |
HtmlElement el, dynamic item, int index); |
@@ -20,7 +21,7 @@ class VirtualCollectionElement extends HtmlElement implements Renderable { |
_r.onRendered; |
VirtualCollectionCreateCallback _create; |
- VirtualCollectionCreateCallback _createHeader; |
+ VirtualCollectionHeaderCallback _createHeader; |
VirtualCollectionUpdateCallback _update; |
double _itemHeight; |
double _headerHeight = 0.0; |
@@ -41,7 +42,7 @@ class VirtualCollectionElement extends HtmlElement implements Renderable { |
factory VirtualCollectionElement(VirtualCollectionCreateCallback create, |
VirtualCollectionUpdateCallback update, |
{Iterable items: const [], |
- VirtualCollectionCreateCallback createHeader, |
+ VirtualCollectionHeaderCallback createHeader, |
RenderingQueue queue}) { |
assert(create != null); |
assert(update != null); |
@@ -79,14 +80,16 @@ class VirtualCollectionElement extends HtmlElement implements Renderable { |
final DivElement _header = new DivElement()..classes = ['header']; |
final DivElement _scroller = new DivElement()..classes = ['scroller']; |
final DivElement _shifter = new DivElement()..classes = ['shifter']; |
+ final DivElement _container = new DivElement()..classes = ['container']; |
dynamic getItemFromElement(HtmlElement element) { |
- final el_index = _shifter.children.indexOf(element); |
+ final el_index = _container.children.indexOf(element); |
if (el_index < 0) { |
return null; |
} |
- final item_index = |
- _top + el_index - (_shifter.children.length * _inverse_preload).floor(); |
+ final item_index = _top + |
+ el_index - |
+ (_container.children.length * _inverse_preload).floor(); |
if (0 <= item_index && item_index < items.length) { |
return _items[item_index]; |
} |
@@ -119,15 +122,22 @@ class VirtualCollectionElement extends HtmlElement implements Renderable { |
children = [ |
_scroller |
..children = [ |
- _shifter..children = [_create()] |
+ _shifter |
+ ..children = [ |
+ _container..children = [_create()] |
+ ] |
], |
]; |
if (_createHeader != null) { |
- _header.children = [_createHeader()]; |
+ _header.children = [ |
+ new DivElement() |
+ ..classes = ['container'] |
+ ..children = _createHeader() |
+ ]; |
_scroller.children.insert(0, _header); |
_headerHeight = _header.children[0].getBoundingClientRect().height; |
} |
- _itemHeight = _shifter.children[0].getBoundingClientRect().height; |
+ _itemHeight = _container.children[0].getBoundingClientRect().height; |
_height = getBoundingClientRect().height; |
} |
@@ -148,11 +158,11 @@ class VirtualCollectionElement extends HtmlElement implements Renderable { |
final tail_length = (_height / _itemHeight / _preload).ceil(); |
final length = tail_length * 2 + tail_length * _preload; |
- if (_shifter.children.length < length) { |
- while (_shifter.children.length != length) { |
+ if (_container.children.length < length) { |
+ while (_container.children.length != length) { |
var e = _create(); |
e..style.display = 'hidden'; |
- _shifter.children.add(e); |
+ _container.children.add(e); |
} |
_top = null; // force update; |
} |
@@ -160,7 +170,7 @@ class VirtualCollectionElement extends HtmlElement implements Renderable { |
if ((_top == null) || ((top - _top).abs() >= tail_length)) { |
_shifter.style.top = '${_itemHeight*(top-tail_length)}px'; |
int i = top - tail_length; |
- for (final HtmlElement e in _shifter.children) { |
+ for (final HtmlElement e in _container.children) { |
if (0 <= i && i < _items.length) { |
e..style.display = null; |
_update(e, _items[i], i); |