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

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: Added missing space 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..a9237c848e4f2c97f98fc1aa15b367c163dcf831
--- /dev/null
+++ b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
@@ -0,0 +1,135 @@
+// 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 CreateElementCallback(toggle({bool forward}));
Cutch 2016/08/01 23:05:54 s/forward/autoExpandChilNodesWithOnlyOneChild
cbernaschina 2016/08/01 23:17:34 Done.
+typedef void UpdateElementCallback(HtmlElement el, dynamic item, int depth);
+typedef Iterable<dynamic> GetChildrenCallback(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;
+
+ GetChildrenCallback _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(CreateElementCallback create,
+ UpdateElementCallback update, GetChildrenCallback 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 forward: false}) {
+ var item = e._collection.getItemFromElement(element);
+ if (e.isExpanded(item)) {
+ e.collapse(item, forward: forward);
+ } else {
+ e.expand(item, forward: forward);
+ }
+ });
+ }, (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 forward: false}) {
+ if (_expanded.add(item)) _r.dirty();
+ if (forward) {
+ var children = _children(item);
+ while (children.length == 1) {
+ _expanded.add(children.first);
+ children = _children(children.first);
+ }
+ }
+ }
+
+ void collapse(item, {bool forward: false}) {
+ if (_expanded.remove(item)) _r.dirty();
+ if (forward) {
+ 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