| Index: sky/examples/fn/lib/component.dart
|
| diff --git a/sky/examples/fn/lib/component.dart b/sky/examples/fn/lib/component.dart
|
| deleted file mode 100644
|
| index 93900235baf743fac42d7e14a7a32dc388a11d52..0000000000000000000000000000000000000000
|
| --- a/sky/examples/fn/lib/component.dart
|
| +++ /dev/null
|
| @@ -1,164 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -part of fn;
|
| -
|
| -List<Component> _dirtyComponents = new List<Component>();
|
| -bool _renderScheduled = false;
|
| -
|
| -void _renderDirtyComponents() {
|
| - Stopwatch sw = new Stopwatch()..start();
|
| -
|
| - _dirtyComponents.sort((a, b) => a._order - b._order);
|
| - for (var comp in _dirtyComponents) {
|
| - comp._renderIfDirty();
|
| - }
|
| -
|
| - _dirtyComponents.clear();
|
| - _renderScheduled = false;
|
| - sw.stop();
|
| - print("Render took ${sw.elapsedMicroseconds} microseconds");
|
| -}
|
| -
|
| -void _scheduleComponentForRender(Component c) {
|
| - _dirtyComponents.add(c);
|
| -
|
| - if (!_renderScheduled) {
|
| - _renderScheduled = true;
|
| - new Future.microtask(_renderDirtyComponents);
|
| - }
|
| -}
|
| -
|
| -abstract class Component extends Node {
|
| - bool _dirty = true; // components begin dirty because they haven't rendered.
|
| - Node _rendered = null;
|
| - bool _removed = false;
|
| - final int _order;
|
| - static int _currentOrder = 0;
|
| - bool _stateful;
|
| - static Component _currentlyRendering;
|
| -
|
| - Component({ Object key, bool stateful })
|
| - : _stateful = stateful != null ? stateful : false,
|
| - _order = _currentOrder + 1,
|
| - super(key:key);
|
| -
|
| - void willUnmount() {}
|
| -
|
| - void _remove() {
|
| - assert(_rendered != null);
|
| - assert(_root != null);
|
| - willUnmount();
|
| - _rendered._remove();
|
| - _rendered = null;
|
| - _root = null;
|
| - _removed = true;
|
| - }
|
| -
|
| - // TODO(rafaelw): It seems wrong to expose DOM at all. This is presently
|
| - // needed to get sizing info.
|
| - sky.Node getRoot() => _root;
|
| -
|
| - bool _sync(Node old, sky.Node host, sky.Node insertBefore) {
|
| - Component oldComponent = old as Component;
|
| -
|
| - if (oldComponent == null || oldComponent == this) {
|
| - _renderInternal(host, insertBefore);
|
| - return false;
|
| - }
|
| -
|
| - assert(oldComponent != null);
|
| - assert(_dirty);
|
| - assert(_rendered == null);
|
| -
|
| - if (oldComponent._stateful) {
|
| - _stateful = false; // prevent iloop from _renderInternal below.
|
| -
|
| - reflect.copyPublicFields(this, oldComponent);
|
| -
|
| - oldComponent._dirty = true;
|
| - _dirty = false;
|
| -
|
| - oldComponent._renderInternal(host, insertBefore);
|
| - return true; // Must retain old component
|
| - }
|
| -
|
| - _rendered = oldComponent._rendered;
|
| - _renderInternal(host, insertBefore);
|
| - return false;
|
| - }
|
| -
|
| - void _renderInternal(sky.Node host, sky.Node insertBefore) {
|
| - if (!_dirty) {
|
| - assert(_rendered != null);
|
| - return;
|
| - }
|
| -
|
| - var oldRendered = _rendered;
|
| - int lastOrder = _currentOrder;
|
| - _currentOrder = _order;
|
| - _currentlyRendering = this;
|
| - _rendered = render();
|
| - _currentlyRendering = null;
|
| - _currentOrder = lastOrder;
|
| -
|
| - _rendered.events.addAll(events);
|
| -
|
| - _dirty = false;
|
| -
|
| - // TODO(rafaelw): This prevents components from returning different node
|
| - // types as their root node at different times. Consider relaxing.
|
| - assert(oldRendered == null ||
|
| - _rendered.runtimeType == oldRendered.runtimeType);
|
| -
|
| - if (_rendered._sync(oldRendered, host, insertBefore)) {
|
| - _rendered = oldRendered; // retain stateful component
|
| - }
|
| - _root = _rendered._root;
|
| - assert(_rendered._root is sky.Node);
|
| - }
|
| -
|
| - void _renderIfDirty() {
|
| - assert(_rendered != null);
|
| - assert(!_removed);
|
| -
|
| - var rendered = _rendered;
|
| - while (rendered is Component) {
|
| - rendered = rendered._rendered;
|
| - }
|
| - sky.Node root = rendered._root;
|
| -
|
| - _renderInternal(root.parentNode, root.nextSibling);
|
| - }
|
| -
|
| - void setState(Function fn()) {
|
| - assert(_rendered != null); // cannot setState before mounting.
|
| - _stateful = true;
|
| - fn();
|
| - if (_currentlyRendering != this) {
|
| - _dirty = true;
|
| - _scheduleComponentForRender(this);
|
| - }
|
| - }
|
| -
|
| - Node render();
|
| -}
|
| -
|
| -abstract class App extends Component {
|
| - sky.Node _host = null;
|
| - App()
|
| - : super(stateful: true) {
|
| -
|
| - _host = sky.document.createElement('div');
|
| - sky.document.appendChild(_host);
|
| -
|
| - new Future.microtask(() {
|
| - Stopwatch sw = new Stopwatch()..start();
|
| - _sync(null, _host, null);
|
| - assert(_root is sky.Node);
|
| - sw.stop();
|
| - print("Initial render: ${sw.elapsedMicroseconds} microseconds");
|
| - });
|
| - }
|
| -}
|
|
|