From 77510575c1817d2a06015ba3f8578f2dcb125750 Mon Sep 17 00:00:00 2001 From: Hixie Date: Wed, 23 Sep 2015 11:01:20 -0700 Subject: [PATCH] Expose _descendantRenderObject as 'renderer' This allows people to use localToGlobal and company. --- sky/packages/sky/lib/src/fn3/framework.dart | 13 +++--- sky/unit/test/fn3/coordinates_test.dart | 46 +++++++++++++++++++++ sky/unit/test/fn3/widget_tester.dart | 18 ++++---- 3 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 sky/unit/test/fn3/coordinates_test.dart diff --git a/sky/packages/sky/lib/src/fn3/framework.dart b/sky/packages/sky/lib/src/fn3/framework.dart index aeea2f1e099..1494db09b35 100644 --- a/sky/packages/sky/lib/src/fn3/framework.dart +++ b/sky/packages/sky/lib/src/fn3/framework.dart @@ -425,10 +425,10 @@ abstract class Element implements BuildContext { T get widget => _widget; T _widget; - RenderObject get _descendantRenderObject { + RenderObject get renderObject { RenderObject result; void visit(Element element) { - assert(result == null); + assert(result == null); // this verifies that there's only one child if (element is RenderObjectElement) result = element.renderObject; else @@ -800,10 +800,11 @@ class InheritedElement extends StatelessComponentElement { /// Base class for instantiations of RenderObjectWidget subclasses abstract class RenderObjectElement extends Element { RenderObjectElement(T widget) - : renderObject = widget.createRenderObject(), super(widget); + : _renderObject = widget.createRenderObject(), super(widget); /// The underlying [RenderObject] for this element - final RenderObject renderObject; + RenderObject get renderObject => _renderObject; + final RenderObject _renderObject; RenderObjectElement _ancestorRenderObjectElement; RenderObjectElement _findAncestorRenderObjectElement() { @@ -938,7 +939,7 @@ class MultiChildRenderObjectElement exte void insertChildRenderObject(RenderObject child, Element slot) { final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer - RenderObject nextSibling = slot?._descendantRenderObject; + RenderObject nextSibling = slot?.renderObject; assert(renderObject is ContainerRenderObjectMixin); renderObject.add(child, before: nextSibling); assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer @@ -946,7 +947,7 @@ class MultiChildRenderObjectElement exte void moveChildRenderObject(RenderObject child, dynamic slot) { final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer - RenderObject nextSibling = slot?._descendantRenderObject; + RenderObject nextSibling = slot?.renderObject; assert(renderObject is ContainerRenderObjectMixin); renderObject.move(child, before: nextSibling); assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer diff --git a/sky/unit/test/fn3/coordinates_test.dart b/sky/unit/test/fn3/coordinates_test.dart new file mode 100644 index 00000000000..536ffebc1f1 --- /dev/null +++ b/sky/unit/test/fn3/coordinates_test.dart @@ -0,0 +1,46 @@ +import 'package:sky/src/fn3.dart'; +import 'package:test/test.dart'; + +import 'widget_tester.dart'; + +void main() { + test('Comparing coordinates', () { + WidgetTester tester = new WidgetTester(); + + Key keyA = new GlobalKey(); + Key keyB = new GlobalKey(); + Key keyC = new GlobalKey(); + + tester.pumpFrame( + new Stack([ + new Positioned( + top: 100.0, + left: 100.0, + child: new SizedBox( + key: keyA, + width: 10.0, + height: 10.0 + ) + ), + new Positioned( + left: 100.0, + top: 200.0, + child: new SizedBox( + key: keyB, + width: 20.0, + height: 10.0 + ) + ), + ]) + ); + + expect(tester.findElementByKey(keyA).renderObject.localToGlobal(const Point(0.0, 0.0)), + equals(const Point(100.0, 100.0))); + + expect(tester.findElementByKey(keyB).renderObject.localToGlobal(const Point(0.0, 0.0)), + equals(const Point(100.0, 200.0))); + + expect(tester.findElementByKey(keyB).renderObject.globalToLocal(const Point(110.0, 205.0)), + equals(const Point(10.0, 5.0))); + }); +} diff --git a/sky/unit/test/fn3/widget_tester.dart b/sky/unit/test/fn3/widget_tester.dart index c256af502eb..fd84c46410d 100644 --- a/sky/unit/test/fn3/widget_tester.dart +++ b/sky/unit/test/fn3/widget_tester.dart @@ -28,20 +28,22 @@ class WidgetTester { WidgetFlutterBinding.instance.renderViewElement.visitChildren(walk); } - Element findElement(bool predicate(Element widget)) { + Element findElement(bool predicate(Element element)) { try { - walkElements((Element widget) { - if (predicate(widget)) - throw widget; + walkElements((Element element) { + if (predicate(element)) + throw element; }); - } catch (e) { - if (e is Element) - return e; - rethrow; + } on Element catch (e) { + return e; } return null; } + Element findElementByKey(Key key) { + return findElement((Element element) => element.widget.key == key); + } + void pumpFrame(Widget widget) { runApp(widget); WidgetFlutterBinding.instance.beginFrame(0.0); // TODO(ianh): https://github.com/flutter/engine/issues/1084