OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import 'dart:mirrors'; | 7 import 'dart:mirrors'; |
8 import 'dart:sky' as sky; | 8 import 'dart:sky' as sky; |
9 | 9 |
10 import '../app/view.dart'; | 10 import '../app/view.dart'; |
11 import '../rendering/box.dart'; | 11 import '../rendering/box.dart'; |
12 import '../rendering/object.dart'; | 12 import '../rendering/object.dart'; |
13 | 13 |
14 export '../rendering/box.dart' show BoxConstraints, BoxDecoration, Border, Borde rSide, EdgeDims; | 14 export '../rendering/box.dart' show BoxConstraints, BoxDecoration, Border, Borde rSide, EdgeDims; |
15 export '../rendering/flex.dart' show FlexDirection; | 15 export '../rendering/flex.dart' show FlexDirection; |
16 export '../rendering/object.dart' show Point, Size, Rect, Color, Paint, Path; | 16 export '../rendering/object.dart' show Point, Size, Rect, Color, Paint, Path; |
17 | 17 |
18 final bool _shouldLogRenderDuration = false; | 18 final bool _shouldLogRenderDuration = false; |
19 | 19 |
20 // All Effen nodes derive from Widget. All nodes have a _parent, a _key and | 20 // All Effen nodes derive from Widget. All nodes have a _parent, a _key and |
21 // can be sync'd. | 21 // can be sync'd. |
22 abstract class Widget { | 22 abstract class Widget { |
23 | 23 |
24 Widget({ String key }) { | 24 Widget({ String key }) { |
25 _key = key != null ? key : runtimeType.toString(); | 25 _key = key != null ? key : runtimeType.toString(); |
26 assert(this is AbstractWidgetRoot || _inRenderDirtyComponents); // you shoul d not build the UI tree ahead of time, build it only during build() | 26 assert(this is AbstractWidgetRoot || this is App || _inRenderDirtyComponents ); // you should not build the UI tree ahead of time, build it only during build () |
27 } | 27 } |
28 | 28 |
29 String _key; | 29 String _key; |
30 String get key => _key; | 30 String get key => _key; |
31 | 31 |
32 Widget _parent; | 32 Widget _parent; |
33 Widget get parent => _parent; | 33 Widget get parent => _parent; |
34 | 34 |
35 bool _mounted = false; | 35 bool _mounted = false; |
36 bool _wasMounted = false; | 36 bool _wasMounted = false; |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
467 RenderObject createNode(); | 467 RenderObject createNode(); |
468 | 468 |
469 void insert(RenderObjectWrapper child, dynamic slot); | 469 void insert(RenderObjectWrapper child, dynamic slot); |
470 | 470 |
471 static final Map<RenderObject, RenderObjectWrapper> _nodeMap = | 471 static final Map<RenderObject, RenderObjectWrapper> _nodeMap = |
472 new HashMap<RenderObject, RenderObjectWrapper>(); | 472 new HashMap<RenderObject, RenderObjectWrapper>(); |
473 | 473 |
474 static RenderObjectWrapper _getMounted(RenderObject node) => _nodeMap[node]; | 474 static RenderObjectWrapper _getMounted(RenderObject node) => _nodeMap[node]; |
475 | 475 |
476 void _sync(Widget old, dynamic slot) { | 476 void _sync(Widget old, dynamic slot) { |
477 assert(parent != null); | 477 assert(parent != null || this is RenderViewWrapper); |
Hixie
2015/06/17 19:21:25
This should never be called for RenderViewWrapper.
| |
478 if (old == null) { | 478 if (old == null) { |
479 _root = createNode(); | 479 _root = createNode(); |
480 var ancestor = findAncestor(RenderObjectWrapper); | 480 var ancestor = findAncestor(RenderObjectWrapper); |
481 if (ancestor is RenderObjectWrapper) | 481 if (ancestor is RenderObjectWrapper) |
482 ancestor.insert(this, slot); | 482 ancestor.insert(this, slot); |
483 } else { | 483 } else { |
484 _root = old.root; | 484 _root = old.root; |
485 } | 485 } |
486 assert(_root == root); // in case a subclass reintroduces it | 486 assert(_root == root); // in case a subclass reintroduces it |
487 assert(root != null); | 487 assert(root != null); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
760 while (target != null && target.root == targetRoot) { | 760 while (target != null && target.root == targetRoot) { |
761 if (target is Listener) | 761 if (target is Listener) |
762 target._handleEvent(event); | 762 target._handleEvent(event); |
763 target = target._parent; | 763 target = target._parent; |
764 } | 764 } |
765 } | 765 } |
766 } | 766 } |
767 | 767 |
768 } | 768 } |
769 | 769 |
770 abstract class App extends Component { | |
771 } | |
772 | |
770 abstract class AbstractWidgetRoot extends Component { | 773 abstract class AbstractWidgetRoot extends Component { |
771 | 774 |
772 AbstractWidgetRoot({ RenderView renderViewOverride }) : super(stateful: true) { | 775 AbstractWidgetRoot() : super(stateful: true) { |
773 WidgetAppView.initWidgetAppView(renderViewOverride: renderViewOverride); | |
774 _mounted = true; | 776 _mounted = true; |
775 _scheduleComponentForRender(this); | 777 _scheduleComponentForRender(this); |
776 } | 778 } |
777 | 779 |
778 void syncFields(AbstractWidgetRoot source) { | 780 void syncFields(AbstractWidgetRoot source) { |
779 assert(false); | 781 assert(false); |
780 // if we get here, it implies that we have a parent | 782 // if we get here, it implies that we have a parent |
781 } | 783 } |
782 | 784 |
783 void _buildIfDirty() { | 785 void _buildIfDirty() { |
784 assert(_dirty); | 786 assert(_dirty); |
785 assert(_mounted); | 787 assert(_mounted); |
786 assert(parent == null); | 788 assert(parent == null); |
787 _sync(null, null); | 789 _sync(null, null); |
788 } | 790 } |
789 | 791 |
790 } | 792 } |
791 | 793 |
792 abstract class App extends AbstractWidgetRoot { | 794 class RenderViewWrapper extends OneChildRenderObjectWrapper { |
795 RenderViewWrapper({ String key, Widget child }) : super(key: key, child: child ); | |
796 RenderView get root => super.root; | |
797 RenderView createNode() => WidgetAppView._appView.renderView; | |
798 } | |
793 | 799 |
794 App({ RenderView renderViewOverride }) : super(renderViewOverride: renderViewO verride); | 800 class AppContainer extends AbstractWidgetRoot { |
801 AppContainer(this.app); | |
802 final App app; | |
803 Widget build() => new RenderViewWrapper(child: app); | |
804 } | |
795 | 805 |
796 void _buildIfDirty() { | 806 void runApp(App app, { RenderView renderViewOverride }) { |
797 super._buildIfDirty(); | 807 WidgetAppView.initWidgetAppView(renderViewOverride: renderViewOverride); |
798 | 808 new AppContainer(app); |
799 if (root.parent == null) { | |
800 // we haven't attached it yet | |
801 WidgetAppView._appView.root = root; | |
802 } | |
803 assert(root.parent is RenderView); | |
804 } | |
805 | |
806 } | 809 } |
807 | 810 |
808 typedef Widget Builder(); | 811 typedef Widget Builder(); |
809 | 812 |
810 class RenderBoxToWidgetAdapter extends AbstractWidgetRoot { | 813 class RenderBoxToWidgetAdapter extends AbstractWidgetRoot { |
811 | 814 |
812 RenderBoxToWidgetAdapter( | 815 RenderBoxToWidgetAdapter( |
813 RenderObjectWithChildMixin<RenderBox> container, | 816 RenderObjectWithChildMixin<RenderBox> container, |
814 this.builder | 817 this.builder |
815 ) : _container = container, super() { | 818 ) : _container = container, super() { |
(...skipping 24 matching lines...) Expand all Loading... | |
840 if (root.parent == null) { | 843 if (root.parent == null) { |
841 // we haven't attached it yet | 844 // we haven't attached it yet |
842 assert(_container.child == null); | 845 assert(_container.child == null); |
843 _container.child = root; | 846 _container.child = root; |
844 } | 847 } |
845 assert(root.parent == _container); | 848 assert(root.parent == _container); |
846 } | 849 } |
847 | 850 |
848 Widget build() => builder(); | 851 Widget build() => builder(); |
849 } | 852 } |
OLD | NEW |