Index: sky/sdk/lib/framework/rendering/render_box.dart |
diff --git a/sky/sdk/lib/framework/rendering/render_box.dart b/sky/sdk/lib/framework/rendering/render_box.dart |
deleted file mode 100644 |
index dc081e1a159a7a21d7e1af6fa23f2e51bc3839a0..0000000000000000000000000000000000000000 |
--- a/sky/sdk/lib/framework/rendering/render_box.dart |
+++ /dev/null |
@@ -1,371 +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. |
- |
-import 'render_node.dart'; |
-import 'dart:sky' as sky; |
- |
-// GENERIC BOX RENDERING |
-// Anything that has a concept of x, y, width, height is going to derive from this |
- |
-class EdgeDims { |
- // used for e.g. padding |
- const EdgeDims(this.top, this.right, this.bottom, this.left); |
- final double top; |
- final double right; |
- final double bottom; |
- final double left; |
- operator ==(EdgeDims other) => (top == other.top) || |
- (right == other.right) || |
- (bottom == other.bottom) || |
- (left == other.left); |
-} |
- |
-class BoxConstraints { |
- const BoxConstraints({ |
- this.minWidth: 0.0, |
- this.maxWidth: double.INFINITY, |
- this.minHeight: 0.0, |
- this.maxHeight: double.INFINITY}); |
- |
- BoxConstraints.tight(sky.Size size) |
- : minWidth = size.width, |
- maxWidth = size.width, |
- minHeight = size.height, |
- maxHeight = size.height; |
- |
- BoxConstraints deflate(EdgeDims edges) { |
- assert(edges != null); |
- return new BoxConstraints( |
- minWidth: minWidth, |
- maxWidth: maxWidth - (edges.left + edges.right), |
- minHeight: minHeight, |
- maxHeight: maxHeight - (edges.top + edges.bottom) |
- ); |
- } |
- |
- final double minWidth; |
- final double maxWidth; |
- final double minHeight; |
- final double maxHeight; |
- |
- double constrainWidth(double width) { |
- return clamp(min: minWidth, max: maxWidth, value: width); |
- } |
- |
- double constrainHeight(double height) { |
- return clamp(min: minHeight, max: maxHeight, value: height); |
- } |
- |
- sky.Size constrain(sky.Size size) { |
- return new sky.Size(constrainWidth(size.width), constrainHeight(size.height)); |
- } |
- |
- bool get isInfinite => maxWidth >= double.INFINITY || maxHeight >= double.INFINITY; |
-} |
- |
-class BoxParentData extends ParentData { |
- sky.Point position = new sky.Point(0.0, 0.0); |
-} |
- |
-abstract class RenderBox extends RenderNode { |
- |
- void setParentData(RenderNode child) { |
- if (child.parentData is! BoxParentData) |
- child.parentData = new BoxParentData(); |
- } |
- |
- // override this to report what dimensions you would have if you |
- // were laid out with the given constraints this can walk the tree |
- // if it must, but it should be as cheap as possible; just get the |
- // dimensions and nothing else (e.g. don't calculate hypothetical |
- // child positions if they're not needed to determine dimensions) |
- sky.Size getIntrinsicDimensions(BoxConstraints constraints) { |
- return constraints.constrain(new sky.Size(0.0, 0.0)); |
- } |
- |
- BoxConstraints get constraints => super.constraints as BoxConstraints; |
- void performResize() { |
- // default behaviour for subclasses that have sizedByParent = true |
- size = constraints.constrain(new sky.Size(0.0, 0.0)); |
- assert(size.height < double.INFINITY); |
- assert(size.width < double.INFINITY); |
- } |
- void performLayout() { |
- // descendants have to either override performLayout() to set both |
- // width and height and lay out children, or, set sizedByParent to |
- // true so that performResize()'s logic above does its thing. |
- assert(sizedByParent); |
- } |
- |
- bool hitTest(HitTestResult result, { sky.Point position }) { |
- hitTestChildren(result, position: position); |
- result.add(this); |
- return true; |
- } |
- void hitTestChildren(HitTestResult result, { sky.Point position }) { } |
- |
- sky.Size size = new sky.Size(0.0, 0.0); |
-} |
- |
-abstract class RenderProxyBox extends RenderBox with RenderNodeWithChildMixin<RenderBox> { |
- RenderProxyBox(RenderBox child) { |
- this.child = child; |
- } |
- |
- sky.Size getIntrinsicDimensions(BoxConstraints constraints) { |
- if (child != null) |
- return child.getIntrinsicDimensions(constraints); |
- return super.getIntrinsicDimensions(constraints); |
- } |
- |
- void performLayout() { |
- if (child != null) { |
- child.layout(constraints, parentUsesSize: true); |
- size = child.size; |
- } else { |
- performResize(); |
- } |
- } |
- |
- void hitTestChildren(HitTestResult result, { sky.Point position }) { |
- if (child != null) |
- child.hitTest(result, position: position); |
- else |
- super.hitTestChildren(result, position: position); |
- } |
- |
- void paint(RenderNodeDisplayList canvas) { |
- if (child != null) |
- child.paint(canvas); |
- } |
-} |
- |
-class RenderSizedBox extends RenderProxyBox { |
- final sky.Size desiredSize; |
- |
- RenderSizedBox({ |
- RenderBox child, |
- this.desiredSize: const sky.Size.infinite() |
- }) : super(child); |
- |
- sky.Size getIntrinsicDimensions(BoxConstraints constraints) { |
- return constraints.constrain(desiredSize); |
- } |
- |
- void performLayout() { |
- size = constraints.constrain(desiredSize); |
- child.layout(new BoxConstraints.tight(size)); |
- } |
-} |
- |
-class RenderPadding extends RenderBox with RenderNodeWithChildMixin<RenderBox> { |
- |
- RenderPadding(EdgeDims padding, RenderBox child) { |
- assert(padding != null); |
- this.padding = padding; |
- this.child = child; |
- } |
- |
- EdgeDims _padding; |
- EdgeDims get padding => _padding; |
- void set padding (EdgeDims value) { |
- assert(value != null); |
- if (_padding != value) { |
- _padding = value; |
- markNeedsLayout(); |
- } |
- } |
- |
- sky.Size getIntrinsicDimensions(BoxConstraints constraints) { |
- assert(padding != null); |
- constraints = constraints.deflate(padding); |
- if (child == null) |
- return super.getIntrinsicDimensions(constraints); |
- return child.getIntrinsicDimensions(constraints); |
- } |
- |
- void performLayout() { |
- assert(padding != null); |
- BoxConstraints innerConstraints = constraints.deflate(padding); |
- if (child == null) { |
- size = innerConstraints.constrain( |
- new sky.Size(padding.left + padding.right, padding.top + padding.bottom)); |
- return; |
- } |
- child.layout(innerConstraints, parentUsesSize: true); |
- assert(child.parentData is BoxParentData); |
- child.parentData.position = new sky.Point(padding.left, padding.top); |
- size = constraints.constrain(new sky.Size(padding.left + child.size.width + padding.right, |
- padding.top + child.size.height + padding.bottom)); |
- } |
- |
- void paint(RenderNodeDisplayList canvas) { |
- if (child != null) |
- canvas.paintChild(child, child.parentData.position); |
- } |
- |
- void hitTestChildren(HitTestResult result, { sky.Point position }) { |
- if (child != null) { |
- assert(child.parentData is BoxParentData); |
- sky.Rect childBounds = new sky.Rect.fromPointAndSize(child.parentData.position, child.size); |
- if (childBounds.contains(position)) { |
- child.hitTest(result, position: new sky.Point(position.x - child.parentData.position.x, |
- position.y - child.parentData.position.y)); |
- } |
- } |
- } |
- |
-} |
- |
-// This must be immutable, because we won't notice when it changes |
-class BoxDecoration { |
- // TODO(mpcomplete): go through and change the users of this class to pass |
- // a Color object. |
- BoxDecoration({ |
- backgroundColor |
- }) : backgroundColor = new sky.Color(backgroundColor); |
- |
- final sky.Color backgroundColor; |
-} |
- |
-class RenderDecoratedBox extends RenderProxyBox { |
- |
- RenderDecoratedBox({ |
- BoxDecoration decoration, |
- RenderBox child |
- }) : _decoration = decoration, super(child); |
- |
- BoxDecoration _decoration; |
- BoxDecoration get decoration => _decoration; |
- void set decoration (BoxDecoration value) { |
- if (value == _decoration) |
- return; |
- _decoration = value; |
- markNeedsPaint(); |
- } |
- |
- void paint(RenderNodeDisplayList canvas) { |
- assert(size.width != null); |
- assert(size.height != null); |
- |
- if (_decoration == null) |
- return; |
- |
- if (_decoration.backgroundColor != null) { |
- sky.Paint paint = new sky.Paint()..color = _decoration.backgroundColor; |
- canvas.drawRect(new sky.Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint); |
- } |
- super.paint(canvas); |
- } |
- |
-} |
- |
- |
-// RENDER VIEW LAYOUT MANAGER |
- |
-class ViewConstraints { |
- |
- const ViewConstraints({ |
- this.width: 0.0, this.height: 0.0, this.orientation: null |
- }); |
- |
- final double width; |
- final double height; |
- final int orientation; |
- |
-} |
- |
-class RenderView extends RenderNode with RenderNodeWithChildMixin<RenderBox> { |
- |
- RenderView({ |
- RenderBox child, |
- this.timeForRotation: const Duration(microseconds: 83333) |
- }) { |
- this.child = child; |
- } |
- |
- sky.Size _size = new sky.Size(0.0, 0.0); |
- double get width => _size.width; |
- double get height => _size.height; |
- |
- int _orientation; // 0..3 |
- int get orientation => _orientation; |
- Duration timeForRotation; |
- |
- ViewConstraints get constraints => super.constraints as ViewConstraints; |
- bool get sizedByParent => true; |
- void performResize() { |
- if (constraints.orientation != _orientation) { |
- if (_orientation != null && child != null) |
- child.rotate(oldAngle: _orientation, newAngle: constraints.orientation, time: timeForRotation); |
- _orientation = constraints.orientation; |
- } |
- _size = new sky.Size(constraints.width, constraints.height); |
- assert(_size.height < double.INFINITY); |
- assert(_size.width < double.INFINITY); |
- } |
- void performLayout() { |
- if (child != null) { |
- child.layout(new BoxConstraints.tight(_size)); |
- assert(child.size.width == width); |
- assert(child.size.height == height); |
- } |
- } |
- |
- void rotate({ int oldAngle, int newAngle, Duration time }) { |
- assert(false); // nobody tells the screen to rotate, the whole rotate() dance is started from our performResize() |
- } |
- |
- bool hitTest(HitTestResult result, { sky.Point position }) { |
- if (child != null) { |
- sky.Rect childBounds = new sky.Rect.fromSize(child.size); |
- if (childBounds.contains(position)) |
- child.hitTest(result, position: position); |
- } |
- result.add(this); |
- return true; |
- } |
- |
- void paint(RenderNodeDisplayList canvas) { |
- if (child != null) |
- canvas.paintChild(child, new sky.Point(0.0, 0.0)); |
- } |
- |
- void paintFrame() { |
- RenderNode.debugDoingPaint = true; |
- var canvas = new RenderNodeDisplayList(sky.view.width, sky.view.height); |
- paint(canvas); |
- sky.view.picture = canvas.endRecording(); |
- RenderNode.debugDoingPaint = false; |
- } |
- |
-} |
- |
-// DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS |
-abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, ParentDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRenderNodeMixin<ChildType, ParentDataType> { |
- |
- void defaultHitTestChildren(HitTestResult result, { sky.Point position }) { |
- // the x, y parameters have the top left of the node's box as the origin |
- ChildType child = lastChild; |
- while (child != null) { |
- assert(child.parentData is ParentDataType); |
- sky.Rect childBounds = new sky.Rect.fromPointAndSize(child.parentData.position, child.size); |
- if (childBounds.contains(position)) { |
- if (child.hitTest(result, position: new sky.Point(position.x - child.parentData.position.x, |
- position.y - child.parentData.position.y))) |
- break; |
- } |
- child = child.parentData.previousSibling; |
- } |
- } |
- |
- void defaultPaint(RenderNodeDisplayList canvas) { |
- RenderBox child = firstChild; |
- while (child != null) { |
- assert(child.parentData is ParentDataType); |
- canvas.paintChild(child, child.parentData.position); |
- child = child.parentData.nextSibling; |
- } |
- } |
-} |