Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(505)

Unified Diff: runtime/observatory/lib/src/elements/containers/virtual_tree.dart

Issue 2203433002: Added new implementations for virtual containers (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Removed unnecessary hides Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/observatory/lib/src/elements/containers/virtual_tree.dart
diff --git a/runtime/observatory/lib/src/elements/containers/virtual_tree.dart b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
new file mode 100644
index 0000000000000000000000000000000000000000..8c106f4f2b10e8a37aacd559be0322caa9f3236c
--- /dev/null
+++ b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:html';
+import 'package:observatory/src/elements/containers/virtual_collection.dart';
+import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
+import 'package:observatory/src/elements/helpers/tag.dart';
+
+typedef HtmlElement VirtualTreeCreateCallback(
+ toggle({bool toggleSingleChildNodes, bool toggleWholeTree}));
Cutch 2016/08/01 23:45:11 prefix both of these with "auto"
cbernaschina 2016/08/01 23:50:41 Done.
+typedef void VirtualTreeUpdateCallback(HtmlElement el, dynamic item, int depth);
+typedef Iterable<dynamic> VritualTreeGetChildrenCallback(dynamic value);
+
+class VirtualTreeElement extends HtmlElement implements Renderable {
+ static const tag =
+ const Tag<VirtualTreeElement>('virtual-tree', dependencies: const [
+ VirtualCollectionElement.tag
+ ]);
+
+ RenderingScheduler<VirtualTreeElement> _r;
+
+ Stream<RenderedEvent<VirtualTreeElement>> get onRendered => _r.onRendered;
+
+ VritualTreeGetChildrenCallback _children;
+ List _items;
+ List _depths;
+ final Set _expanded = new Set();
+
+ List get items => _items;
+
+ set items(Iterable value) {
+ _items = new List.unmodifiable(value);
+ _expanded.clear();
+ _r.dirty();
+ }
+
+ factory VirtualTreeElement(VirtualTreeCreateCallback create,
+ VirtualTreeUpdateCallback update, VritualTreeGetChildrenCallback children,
+ {Iterable items: const [], RenderingQueue queue}) {
+ assert(create != null);
+ assert(update != null);
+ assert(children != null);
+ assert(items != null);
+ VirtualTreeElement e = document.createElement(tag.name);
+ e._r = new RenderingScheduler(e, queue: queue);
+ e._children = children;
+ e._collection = new VirtualCollectionElement(() {
+ var element;
+ return element = create(({bool toggleSingleChildNodes: false,
+ bool toggleWholeTree: false}) {
+ var item = e._collection.getItemFromElement(element);
+ if (e.isExpanded(item)) {
+ e.collapse(item, collapseSingleChildNodes: toggleSingleChildNodes,
+ collapseWholeTree: toggleWholeTree);
+ } else {
+ e.expand(item, expandSingleChildNodes: toggleSingleChildNodes,
+ expandWholeTree: toggleWholeTree);
+ }
+ });
+ }, (HtmlElement el, dynamic item, int index) {
+ update(el, item, e._depths[index]);
+ }, queue: queue);
+ e._items = new List.unmodifiable(items);
+ return e;
+ }
+
+ VirtualTreeElement.created() : super.created();
+
+ bool isExpanded(item) {
+ return _expanded.contains(item);
+ }
+
+ void expand(item, {bool expandSingleChildNodes : false,
+ bool expandWholeTree: false}) {
+ if (_expanded.add(item)) _r.dirty();
+ if (expandWholeTree) {
+ for (final child in _children(item)) {
+ expand(child, expandWholeTree: true);
+ }
+ } else if (expandSingleChildNodes) {
+ var children = _children(item);
+ while (children.length == 1) {
+ _expanded.add(children.first);
+ children = _children(children.first);
+ }
+ }
+ }
+
+ void collapse(item, {bool collapseSingleChildNodes : false,
+ bool collapseWholeTree: false}) {
+ if (_expanded.remove(item)) _r.dirty();
+ if (collapseWholeTree) {
+ for (final child in _children(item)) {
+ collapse(child, collapseWholeTree: true);
+ }
+ } else if (collapseSingleChildNodes) {
+ var children = _children(item);
+ while (children.length == 1) {
+ _expanded.remove(children.first);
+ children = _children(children.first);
+ }
+ }
+ }
+
+ @override
+ attached() {
+ super.attached();
+ _r.enable();
+ }
+
+ @override
+ detached() {
+ super.detached(); _r.disable(notify: true);
+ children = const [];
+ }
+
+ VirtualCollectionElement _collection;
+
+ void render() {
+ if (children.length == 0) {
+ children = [_collection];
+ }
+ Iterable _toList(item) {
+ if (isExpanded(item)) {
+ Iterable children = _children(item);
+ if (children.isNotEmpty) {
+ return [item]..addAll(children.expand(_toList));
+ }
+ }
+ return [item];
+ }
+ _collection.items = _items.expand(_toList);
+ var depth = 0;
+ Iterable _toDepth(item) {
+ if (isExpanded(item)) {
+ Iterable children = _children(item);
+ if (children.isNotEmpty) {
+ depth++;
+ return children.expand(_toDepth).toList()
+ ..insert(0, --depth);
+ }
+ }
+ return [depth];
+ }
+ _depths = _items.expand(_toDepth).toList();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698