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

Unified Diff: sky/sdk/lib/framework/fn2.dart

Issue 1178703002: Abstract out the AppView logic in fn so that it can also be used in non-pure-fn apps. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 6 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
« no previous file with comments | « sky/sdk/lib/framework/app.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/framework/fn2.dart
diff --git a/sky/sdk/lib/framework/fn2.dart b/sky/sdk/lib/framework/fn2.dart
index 41c3e1a35e0df977ff8c673b8994219810ec73e5..095e5ae6a6a7f8f59bb6adfc7141b72892047db4 100644
--- a/sky/sdk/lib/framework/fn2.dart
+++ b/sky/sdk/lib/framework/fn2.dart
@@ -767,6 +767,13 @@ class Paragraph extends RenderObjectWrapper {
}
+class Text extends Component {
+ Text(this.data) : super(key: '*text*');
+ final String data;
+ bool get interchangeable => true;
+ UINode build() => new Paragraph(text: data);
+}
+
class Flex extends MultiChildRenderObjectWrapper {
Flex(List<UINode> children, {
@@ -1059,10 +1066,20 @@ class Container extends Component {
}
-class _AppView extends AppView {
- _AppView() : super(null);
+class UINodeAppView extends AppView {
+
+ UINodeAppView() {
+ assert(_appView == null);
+ }
+
+ static UINodeAppView _appView;
+ static void initUINodeAppView() {
+ if (_appView == null)
+ _appView = new UINodeAppView();
+ }
void dispatchEvent(sky.Event event, HitTestResult result) {
+ assert(_appView == this);
super.dispatchEvent(event, result);
UINode target = RenderObjectWrapper._getMounted(result.path.first.target);
@@ -1074,33 +1091,89 @@ class _AppView extends AppView {
target = target._parent;
}
}
+
}
-abstract class App extends Component {
+abstract class AbstractUINodeRoot extends Component {
- App() : super(stateful: true) {
- _appView = new _AppView();
- _scheduleComponentForRender(this);
+ AbstractUINodeRoot() : super(stateful: true) {
+ UINodeAppView.initUINodeAppView();
_mounted = true;
+ _scheduleComponentForRender(this);
}
- AppView _appView;
- AppView get appView => _appView;
+ void syncFields(AbstractUINodeRoot source) {
+ assert(false);
+ // if we get here, it implies that we have a parent
+ }
void _buildIfDirty() {
assert(_dirty);
assert(_mounted);
+ assert(parent == null);
_sync(null, null);
- if (root.parent == null)
- _appView.root = root;
+ }
+
+}
+
+abstract class App extends AbstractUINodeRoot {
+
+ App();
+
+ AppView get appView => UINodeAppView._appView;
+
+ void _buildIfDirty() {
+ super._buildIfDirty();
+
+ if (root.parent == null) {
+ // we haven't attached it yet
+ UINodeAppView._appView.root = root;
+ }
assert(root.parent is RenderView);
}
}
-class Text extends Component {
- Text(this.data) : super(key: '*text*');
- final String data;
- bool get interchangeable => true;
- UINode build() => new Paragraph(text: data);
+typedef UINode Builder();
+
+class RenderNodeToUINodeAdapter extends AbstractUINodeRoot {
+
+ RenderNodeToUINodeAdapter(
+ RenderObjectWithChildMixin<RenderBox> container,
+ this.builder
+ ) : _container = container {
+ assert(builder != null);
+ }
+
+ RenderObjectWithChildMixin<RenderBox> _container;
+ RenderObjectWithChildMixin<RenderBox> get container => _container;
+ void set container(RenderObjectWithChildMixin<RenderBox> value) {
+ if (_container != value) {
+ assert(value.child == null);
+ if (root != null) {
+ assert(_container.child == root);
+ _container.child = null;
+ }
+ _container = value;
+ if (root != null) {
+ _container.child = root;
+ assert(_container.child == root);
+ }
+ }
+ }
+
+ final Builder builder;
+
+ void _buildIfDirty() {
+ super._buildIfDirty();
+ if (root.parent == null) {
+ // we haven't attached it yet
+ assert(_container.child == null);
+ _container.child = root;
+ }
+ assert(root.parent == _container);
+ }
+
+ UINode build() => builder();
+
}
« no previous file with comments | « sky/sdk/lib/framework/app.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698