Commit 8ec26f02 authored by Adam Barth's avatar Adam Barth

Complete dartdocs for rendering.dart (#4316)

All of the public APIs in rendering.dart now have dartdocs.
parent 1ff7109b
...@@ -118,6 +118,9 @@ class PictureLayer extends Layer { ...@@ -118,6 +118,9 @@ class PictureLayer extends Layer {
/// (mojo-only) A layer that represents content from another process. /// (mojo-only) A layer that represents content from another process.
class ChildSceneLayer extends Layer { class ChildSceneLayer extends Layer {
/// Creates a layer that displays content rendered by another process.
///
/// All of the arguments must not be null.
ChildSceneLayer({ ChildSceneLayer({
this.offset, this.offset,
this.devicePixelRatio, this.devicePixelRatio,
...@@ -126,10 +129,19 @@ class ChildSceneLayer extends Layer { ...@@ -126,10 +129,19 @@ class ChildSceneLayer extends Layer {
this.sceneToken this.sceneToken
}); });
/// Offset from parent in the parent's coordinate system.
Offset offset; Offset offset;
/// The number of physical pixels the child should produce for each logical pixel.
double devicePixelRatio; double devicePixelRatio;
/// The horizontal extent of the child, in physical pixels.
int physicalWidth; int physicalWidth;
/// The vertical extent of the child, in physical pixels.
int physicalHeight; int physicalHeight;
/// The composited scene that will contain the content rendered by the child.
mojom.SceneToken sceneToken; mojom.SceneToken sceneToken;
@override @override
......
...@@ -1988,6 +1988,9 @@ class RenderMetaData extends RenderProxyBoxWithHitTestBehavior { ...@@ -1988,6 +1988,9 @@ class RenderMetaData extends RenderProxyBoxWithHitTestBehavior {
/// Listens for the specified gestures from the semantics server (e.g. /// Listens for the specified gestures from the semantics server (e.g.
/// an accessibility tool). /// an accessibility tool).
class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticActionHandler { class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticActionHandler {
/// Creates a render object that listens for specific semantic gestures.
///
/// The [scrollFactor] argument must not be null.
RenderSemanticsGestureHandler({ RenderSemanticsGestureHandler({
RenderBox child, RenderBox child,
GestureTapCallback onTap, GestureTapCallback onTap,
...@@ -2001,6 +2004,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc ...@@ -2001,6 +2004,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
_onVerticalDragUpdate = onVerticalDragUpdate, _onVerticalDragUpdate = onVerticalDragUpdate,
super(child); super(child);
/// Called when the user taps on the render object.
GestureTapCallback get onTap => _onTap; GestureTapCallback get onTap => _onTap;
GestureTapCallback _onTap; GestureTapCallback _onTap;
set onTap(GestureTapCallback value) { set onTap(GestureTapCallback value) {
...@@ -2013,6 +2017,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc ...@@ -2013,6 +2017,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics); markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
} }
/// Called when the user presses on the render object for a long period of time.
GestureLongPressCallback get onLongPress => _onLongPress; GestureLongPressCallback get onLongPress => _onLongPress;
GestureLongPressCallback _onLongPress; GestureLongPressCallback _onLongPress;
set onLongPress(GestureLongPressCallback value) { set onLongPress(GestureLongPressCallback value) {
...@@ -2025,6 +2030,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc ...@@ -2025,6 +2030,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics); markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
} }
/// Called when the user scrolls to the left or to the right.
GestureDragUpdateCallback get onHorizontalDragUpdate => _onHorizontalDragUpdate; GestureDragUpdateCallback get onHorizontalDragUpdate => _onHorizontalDragUpdate;
GestureDragUpdateCallback _onHorizontalDragUpdate; GestureDragUpdateCallback _onHorizontalDragUpdate;
set onHorizontalDragUpdate(GestureDragUpdateCallback value) { set onHorizontalDragUpdate(GestureDragUpdateCallback value) {
...@@ -2037,6 +2043,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc ...@@ -2037,6 +2043,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics); markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
} }
/// Called when the user scrolls up or down.
GestureDragUpdateCallback get onVerticalDragUpdate => _onVerticalDragUpdate; GestureDragUpdateCallback get onVerticalDragUpdate => _onVerticalDragUpdate;
GestureDragUpdateCallback _onVerticalDragUpdate; GestureDragUpdateCallback _onVerticalDragUpdate;
set onVerticalDragUpdate(GestureDragUpdateCallback value) { set onVerticalDragUpdate(GestureDragUpdateCallback value) {
...@@ -2113,8 +2120,11 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc ...@@ -2113,8 +2120,11 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
} }
} }
/// Add annotations to the SemanticsNode for this subtree. /// Add annotations to the [SemanticsNode] for this subtree.
class RenderSemanticAnnotations extends RenderProxyBox { class RenderSemanticAnnotations extends RenderProxyBox {
/// Creates a render object that attaches a semantic annotation.
///
/// The [container] argument must not be null.
RenderSemanticAnnotations({ RenderSemanticAnnotations({
RenderBox child, RenderBox child,
bool container: false, bool container: false,
...@@ -2197,6 +2207,7 @@ class RenderSemanticAnnotations extends RenderProxyBox { ...@@ -2197,6 +2207,7 @@ class RenderSemanticAnnotations extends RenderProxyBox {
/// form part of a single conceptual widget, e.g. a checkbox, a label, /// form part of a single conceptual widget, e.g. a checkbox, a label,
/// and the gesture detector that goes with them. /// and the gesture detector that goes with them.
class RenderMergeSemantics extends RenderProxyBox { class RenderMergeSemantics extends RenderProxyBox {
/// Creates a render object that merges the semantics from its descendants.
RenderMergeSemantics({ RenderBox child }) : super(child); RenderMergeSemantics({ RenderBox child }) : super(child);
@override @override
...@@ -2210,6 +2221,7 @@ class RenderMergeSemantics extends RenderProxyBox { ...@@ -2210,6 +2221,7 @@ class RenderMergeSemantics extends RenderProxyBox {
/// Useful e.g. for hiding text that is redundant with other text next /// Useful e.g. for hiding text that is redundant with other text next
/// to it (e.g. text included only for the visual effect). /// to it (e.g. text included only for the visual effect).
class RenderExcludeSemantics extends RenderProxyBox { class RenderExcludeSemantics extends RenderProxyBox {
/// Creates a render object that ignores the semantics of its subtree.
RenderExcludeSemantics({ RenderBox child }) : super(child); RenderExcludeSemantics({ RenderBox child }) : super(child);
@override @override
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'dart:ui' show lerpDouble, hashValues; import 'dart:ui' show lerpDouble, hashValues;
import 'package:meta/meta.dart';
import 'box.dart'; import 'box.dart';
import 'object.dart'; import 'object.dart';
...@@ -197,10 +199,50 @@ class StackParentData extends ContainerBoxParentDataMixin<RenderBox> { ...@@ -197,10 +199,50 @@ class StackParentData extends ContainerBoxParentDataMixin<RenderBox> {
} }
} }
abstract class RenderStackBase extends RenderBox /// Implements the stack layout algorithm
///
/// In a stack layout, the children are positioned on top of each other in the
/// order in which they appear in the child list. First, the non-positioned
/// children (those with null values for top, right, bottom, and left) are
/// laid out and initially placed in the upper-left corner of the stack. The
/// stack is then sized to enclose all of the non-positioned children. If there
/// are no non-positioned children, the stack becomes as large as possible.
///
/// The final location of non-positioned children is determined by the alignment
/// parameter. The left of each non-positioned child becomes the
/// difference between the child's width and the stack's width scaled by
/// alignment.x. The top of each non-positioned child is computed
/// similarly and scaled by alignment.y. So if the alignment x and y properties
/// are 0.0 (the default) then the non-positioned children remain in the
/// upper-left corner. If the alignment x and y properties are 0.5 then the
/// non-positioned children are centered within the stack.
///
/// Next, the positioned children are laid out. If a child has top and bottom
/// values that are both non-null, the child is given a fixed height determined
/// by subtracting the sum of the top and bottom values from the height of the stack.
/// Similarly, if the child has right and left values that are both non-null,
/// the child is given a fixed width derived from the stack's width.
/// Otherwise, the child is given unbounded constraints in the non-fixed dimensions.
///
/// Once the child is laid out, the stack positions the child
/// according to the top, right, bottom, and left properties of their
/// [StackParentData]. For example, if the bottom value is 10.0, the
/// bottom edge of the child will be inset 10.0 pixels from the bottom
/// edge of the stack. If the child extends beyond the bounds of the
/// stack, the stack will clip the child's painting to the bounds of
/// the stack.
///
/// See also:
///
/// * [RenderFlow]
class RenderStack extends RenderBox
with ContainerRenderObjectMixin<RenderBox, StackParentData>, with ContainerRenderObjectMixin<RenderBox, StackParentData>,
RenderBoxContainerDefaultsMixin<RenderBox, StackParentData> { RenderBoxContainerDefaultsMixin<RenderBox, StackParentData> {
RenderStackBase({ /// Creates a stack render object.
///
/// By default, the non-positioned children of the stack are aligned by their
/// top left corners.
RenderStack({
List<RenderBox> children, List<RenderBox> children,
FractionalOffset alignment: FractionalOffset.topLeft FractionalOffset alignment: FractionalOffset.topLeft
}) : _alignment = alignment { }) : _alignment = alignment {
...@@ -215,6 +257,12 @@ abstract class RenderStackBase extends RenderBox ...@@ -215,6 +257,12 @@ abstract class RenderStackBase extends RenderBox
child.parentData = new StackParentData(); child.parentData = new StackParentData();
} }
/// How to align the non-positioned children in the stack.
///
/// The non-positioned children are placed relative to each other such that
/// the points determined by [alignment] are co-located. For example, if the
/// [alignment] is [FractionalOffset.topLeft], then the top left corner of
/// each non-positioned child will be located at the same global coordinate.
FractionalOffset get alignment => _alignment; FractionalOffset get alignment => _alignment;
FractionalOffset _alignment; FractionalOffset _alignment;
set alignment (FractionalOffset value) { set alignment (FractionalOffset value) {
...@@ -350,7 +398,14 @@ abstract class RenderStackBase extends RenderBox ...@@ -350,7 +398,14 @@ abstract class RenderStackBase extends RenderBox
return defaultHitTestChildren(result, position: position); return defaultHitTestChildren(result, position: position);
} }
void paintStack(PaintingContext context, Offset offset); /// Override in subclasses to customize how the stack paints.
///
/// By default, the stack uses [defaultPaint]. This function is called by
/// [paint] after potentially applying a clip to contain visual overflow.
@protected
void paintStack(PaintingContext context, Offset offset) {
defaultPaint(context, offset);
}
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
...@@ -365,63 +420,15 @@ abstract class RenderStackBase extends RenderBox ...@@ -365,63 +420,15 @@ abstract class RenderStackBase extends RenderBox
Rect describeApproximatePaintClip(RenderObject child) => _hasVisualOverflow ? Point.origin & size : null; Rect describeApproximatePaintClip(RenderObject child) => _hasVisualOverflow ? Point.origin & size : null;
} }
/// Implements the stack layout algorithm
///
/// In a stack layout, the children are positioned on top of each other in the
/// order in which they appear in the child list. First, the non-positioned
/// children (those with null values for top, right, bottom, and left) are
/// laid out and initially placed in the upper-left corner of the stack. The
/// stack is then sized to enclose all of the non-positioned children. If there
/// are no non-positioned children, the stack becomes as large as possible.
///
/// The final location of non-positioned children is determined by the alignment
/// parameter. The left of each non-positioned child becomes the
/// difference between the child's width and the stack's width scaled by
/// alignment.x. The top of each non-positioned child is computed
/// similarly and scaled by alignment.y. So if the alignment x and y properties
/// are 0.0 (the default) then the non-positioned children remain in the
/// upper-left corner. If the alignment x and y properties are 0.5 then the
/// non-positioned children are centered within the stack.
///
/// Next, the positioned children are laid out. If a child has top and bottom
/// values that are both non-null, the child is given a fixed height determined
/// by subtracting the sum of the top and bottom values from the height of the stack.
/// Similarly, if the child has right and left values that are both non-null,
/// the child is given a fixed width derived from the stack's width.
/// Otherwise, the child is given unbounded constraints in the non-fixed dimensions.
///
/// Once the child is laid out, the stack positions the child
/// according to the top, right, bottom, and left properties of their
/// [StackParentData]. For example, if the bottom value is 10.0, the
/// bottom edge of the child will be inset 10.0 pixels from the bottom
/// edge of the stack. If the child extends beyond the bounds of the
/// stack, the stack will clip the child's painting to the bounds of
/// the stack.
///
/// See also:
///
/// * [RenderFlow]
class RenderStack extends RenderStackBase {
RenderStack({
List<RenderBox> children,
FractionalOffset alignment: FractionalOffset.topLeft
}) : super(
children: children,
alignment: alignment
);
@override
void paintStack(PaintingContext context, Offset offset) {
defaultPaint(context, offset);
}
}
/// Implements the same layout algorithm as RenderStack but only paints the child /// Implements the same layout algorithm as RenderStack but only paints the child
/// specified by index. /// specified by index.
/// ///
/// Although only one child is displayed, the cost of the layout algorithm is /// Although only one child is displayed, the cost of the layout algorithm is
/// still O(N), like an ordinary stack. /// still O(N), like an ordinary stack.
class RenderIndexedStack extends RenderStackBase { class RenderIndexedStack extends RenderStack {
/// Creates a stack render object that paints a single child.
///
/// The [index] argument must not be null.
RenderIndexedStack({ RenderIndexedStack({
List<RenderBox> children, List<RenderBox> children,
FractionalOffset alignment: FractionalOffset.topLeft, FractionalOffset alignment: FractionalOffset.topLeft,
...@@ -433,6 +440,7 @@ class RenderIndexedStack extends RenderStackBase { ...@@ -433,6 +440,7 @@ class RenderIndexedStack extends RenderStackBase {
assert(index != null); assert(index != null);
} }
/// The index of the child to show.
int get index => _index; int get index => _index;
int _index; int _index;
set index (int value) { set index (int value) {
......
...@@ -76,6 +76,9 @@ abstract class TableColumnWidth { ...@@ -76,6 +76,9 @@ abstract class TableColumnWidth {
/// column will participate in the distribution of remaining space /// column will participate in the distribution of remaining space
/// once all the non-flexible columns have been sized. /// once all the non-flexible columns have been sized.
class IntrinsicColumnWidth extends TableColumnWidth { class IntrinsicColumnWidth extends TableColumnWidth {
/// Creates a column width based on intrinsic sizing.
///
/// This sizing algorithm is very expensive.
const IntrinsicColumnWidth({ double flex }) : _flex = flex; const IntrinsicColumnWidth({ double flex }) : _flex = flex;
@override @override
...@@ -104,7 +107,12 @@ class IntrinsicColumnWidth extends TableColumnWidth { ...@@ -104,7 +107,12 @@ class IntrinsicColumnWidth extends TableColumnWidth {
/// ///
/// This is the cheapest way to size a column. /// This is the cheapest way to size a column.
class FixedColumnWidth extends TableColumnWidth { class FixedColumnWidth extends TableColumnWidth {
/// Creates a column width based on a fixed number of logical pixels.
///
/// The [value] argument must not be null.
const FixedColumnWidth(this.value); const FixedColumnWidth(this.value);
/// The width the column should occupy in logical pixels.
final double value; final double value;
@override @override
...@@ -125,7 +133,14 @@ class FixedColumnWidth extends TableColumnWidth { ...@@ -125,7 +133,14 @@ class FixedColumnWidth extends TableColumnWidth {
/// ///
/// This is a cheap way to size a column. /// This is a cheap way to size a column.
class FractionColumnWidth extends TableColumnWidth { class FractionColumnWidth extends TableColumnWidth {
/// Creates a column width based on a fraction of the table's constraints'
/// maxWidth.
///
/// The [value] argument must not be null.
const FractionColumnWidth(this.value); const FractionColumnWidth(this.value);
/// The fraction of the table's constraints' maxWidth that this column should
/// occupy.
final double value; final double value;
@override @override
...@@ -154,7 +169,14 @@ class FractionColumnWidth extends TableColumnWidth { ...@@ -154,7 +169,14 @@ class FractionColumnWidth extends TableColumnWidth {
/// ///
/// This is a cheap way to size a column. /// This is a cheap way to size a column.
class FlexColumnWidth extends TableColumnWidth { class FlexColumnWidth extends TableColumnWidth {
/// Creates a column width based on a fraction of the remaining space once all
/// the other columns have been laid out.
///
/// The [value] argument must not be null.
const FlexColumnWidth([this.value = 1.0]); const FlexColumnWidth([this.value = 1.0]);
/// The reaction of the of the remaining space once all the other columns have
/// been laid out that this column should occupy.
final double value; final double value;
@override @override
...@@ -187,8 +209,13 @@ class FlexColumnWidth extends TableColumnWidth { ...@@ -187,8 +209,13 @@ class FlexColumnWidth extends TableColumnWidth {
/// Both specifications are evaluated, so if either specification is /// Both specifications are evaluated, so if either specification is
/// expensive, so is this. /// expensive, so is this.
class MaxColumnWidth extends TableColumnWidth { class MaxColumnWidth extends TableColumnWidth {
/// Creates a column width that is the maximum of two other column widths.
const MaxColumnWidth(this.a, this.b); const MaxColumnWidth(this.a, this.b);
/// A lower bound for the width of this column.
final TableColumnWidth a; final TableColumnWidth a;
/// Another lower bound for the width of this column.
final TableColumnWidth b; final TableColumnWidth b;
@override @override
...@@ -233,8 +260,13 @@ class MaxColumnWidth extends TableColumnWidth { ...@@ -233,8 +260,13 @@ class MaxColumnWidth extends TableColumnWidth {
/// Both specifications are evaluated, so if either specification is /// Both specifications are evaluated, so if either specification is
/// expensive, so is this. /// expensive, so is this.
class MinColumnWidth extends TableColumnWidth { class MinColumnWidth extends TableColumnWidth {
const MinColumnWidth(this.a, this.b); // at most as big as a or b /// Creates a column width that is the minimum of two other column widths.
const MinColumnWidth(this.a, this.b);
/// An upper bound for the width of this column.
final TableColumnWidth a; final TableColumnWidth a;
/// Another upper bound for the width of this column.
final TableColumnWidth b; final TableColumnWidth b;
@override @override
...@@ -273,6 +305,9 @@ class MinColumnWidth extends TableColumnWidth { ...@@ -273,6 +305,9 @@ class MinColumnWidth extends TableColumnWidth {
/// This is like [Border], with the addition of two sides: the inner /// This is like [Border], with the addition of two sides: the inner
/// horizontal borders and the inner vertical borders. /// horizontal borders and the inner vertical borders.
class TableBorder extends Border { class TableBorder extends Border {
/// Creates a border for a table.
///
/// All the sides of the border default to [BorderSide.none].
const TableBorder({ const TableBorder({
BorderSide top: BorderSide.none, BorderSide top: BorderSide.none,
BorderSide right: BorderSide.none, BorderSide right: BorderSide.none,
...@@ -287,6 +322,7 @@ class TableBorder extends Border { ...@@ -287,6 +322,7 @@ class TableBorder extends Border {
left: left left: left
); );
/// A uniform border with all sides the same color and width.
factory TableBorder.all({ factory TableBorder.all({
Color color: const Color(0xFF000000), Color color: const Color(0xFF000000),
double width: 1.0 double width: 1.0
...@@ -295,6 +331,8 @@ class TableBorder extends Border { ...@@ -295,6 +331,8 @@ class TableBorder extends Border {
return new TableBorder(top: side, right: side, bottom: side, left: side, horizontalInside: side, verticalInside: side); return new TableBorder(top: side, right: side, bottom: side, left: side, horizontalInside: side, verticalInside: side);
} }
/// Creates a border for a table where all the interior sides use the same
/// styling and all the exterior sides use the same styling.
factory TableBorder.symmetric({ factory TableBorder.symmetric({
BorderSide inside: BorderSide.none, BorderSide inside: BorderSide.none,
BorderSide outside: BorderSide.none BorderSide outside: BorderSide.none
...@@ -309,10 +347,37 @@ class TableBorder extends Border { ...@@ -309,10 +347,37 @@ class TableBorder extends Border {
); );
} }
/// The horizontal interior sides of this border.
final BorderSide horizontalInside; final BorderSide horizontalInside;
/// The vertical interior sides of this border.
final BorderSide verticalInside; final BorderSide verticalInside;
@override
bool get isUniform {
assert(horizontalInside != null);
assert(verticalInside != null);
if (!super.isUniform)
return false;
final Color topColor = top.color;
if (horizontalInside.color != topColor ||
verticalInside.color != topColor)
return false;
final double topWidth = top.width;
if (horizontalInside.width != topWidth ||
verticalInside.width != topWidth)
return false;
final BorderStyle topStyle = top.style;
if (horizontalInside.style != topStyle ||
verticalInside.style != topStyle)
return false;
return true;
}
@override @override
TableBorder scale(double t) { TableBorder scale(double t) {
return new TableBorder( return new TableBorder(
...@@ -325,6 +390,7 @@ class TableBorder extends Border { ...@@ -325,6 +390,7 @@ class TableBorder extends Border {
); );
} }
/// Linearly interpolate between two table borders.
static TableBorder lerp(TableBorder a, TableBorder b, double t) { static TableBorder lerp(TableBorder a, TableBorder b, double t) {
if (a == null && b == null) if (a == null && b == null)
return null; return null;
...@@ -376,6 +442,9 @@ enum TableCellVerticalAlignment { ...@@ -376,6 +442,9 @@ enum TableCellVerticalAlignment {
/// baseline. Cells with no baseline are top-aligned instead. The baseline /// baseline. Cells with no baseline are top-aligned instead. The baseline
/// used is specified by [RenderTable.baseline]. It is not valid to use the /// used is specified by [RenderTable.baseline]. It is not valid to use the
/// baseline value if [RenderTable.baseline] is not specified. /// baseline value if [RenderTable.baseline] is not specified.
///
/// This vertial alignment is relatively expensive because it causes the table
/// to compute the baseline for each cell in the row.
baseline, baseline,
/// Cells with this alignment are sized to be as tall as the row, then made to fit the row. /// Cells with this alignment are sized to be as tall as the row, then made to fit the row.
...@@ -385,6 +454,17 @@ enum TableCellVerticalAlignment { ...@@ -385,6 +454,17 @@ enum TableCellVerticalAlignment {
/// A table where the columns and rows are sized to fit the contents of the cells. /// A table where the columns and rows are sized to fit the contents of the cells.
class RenderTable extends RenderBox { class RenderTable extends RenderBox {
/// Creates a table render object.
///
/// * `columns` must either be null or non-negative. If `columns` is null,
/// the number of columns will be inferred from length of the first sublist
/// of `children`.
/// * `rows` must either be null or non-negative. If `rows` is null, the
/// number of rows will be inferred from the `children`. If `rows` is not
/// null, then `children` must be null.
/// * `children` must either be null or contain lists of all the same length.
/// if `children` is not null, then `rows` must be null.
/// * [defaultColumnWidth] must not be null.
RenderTable({ RenderTable({
int columns, int columns,
int rows, int rows,
...@@ -420,6 +500,13 @@ class RenderTable extends RenderBox { ...@@ -420,6 +500,13 @@ class RenderTable extends RenderBox {
// _children.length must be rows * columns // _children.length must be rows * columns
List<RenderBox> _children = const <RenderBox>[]; List<RenderBox> _children = const <RenderBox>[];
/// The number of vertical alignment lines in this table.
///
/// Changing the number of columns will remove any children that no longer fit
/// in the table.
///
/// Changing the number of columns is an expensive operation because the table
/// needs to rearranage its internal representation.
int get columns => _columns; int get columns => _columns;
int _columns; int _columns;
set columns(int value) { set columns(int value) {
...@@ -448,6 +535,10 @@ class RenderTable extends RenderBox { ...@@ -448,6 +535,10 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// The number of horizontal alignment lines in this table.
///
/// Changing the number of rows will remove any children that no longer fit
/// in the table.
int get rows => _rows; int get rows => _rows;
int _rows; int _rows;
set rows(int value) { set rows(int value) {
...@@ -466,6 +557,15 @@ class RenderTable extends RenderBox { ...@@ -466,6 +557,15 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// How the horizontal extents of the columns of this table should be determined.
///
/// If the [Map] has a null entry for a given column, the table uses the
/// [defaultColumnWidth] instead.
///
/// The layout performance of the table depends critically on which column
/// sizing algorithms are used here. In particular, [IntrinsicColumnWidth] is
/// quite expensive because it needs to measure each cell in the column to
/// determine the intrinsic size of the column.
Map<int, TableColumnWidth> get columnWidths => new Map<int, TableColumnWidth>.unmodifiable(_columnWidths); Map<int, TableColumnWidth> get columnWidths => new Map<int, TableColumnWidth>.unmodifiable(_columnWidths);
Map<int, TableColumnWidth> _columnWidths; Map<int, TableColumnWidth> _columnWidths;
set columnWidths(Map<int, TableColumnWidth> value) { set columnWidths(Map<int, TableColumnWidth> value) {
...@@ -476,6 +576,7 @@ class RenderTable extends RenderBox { ...@@ -476,6 +576,7 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// Determines how the width of column with the given index is determined.
void setColumnWidth(int column, TableColumnWidth value) { void setColumnWidth(int column, TableColumnWidth value) {
if (_columnWidths[column] == value) if (_columnWidths[column] == value)
return; return;
...@@ -483,6 +584,10 @@ class RenderTable extends RenderBox { ...@@ -483,6 +584,10 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// How to determine with widths of columns that don't have an explicit sizing algorithm.
///
/// Specifically, the [defaultColumnWidth] is used for column `i` if
/// `columnWidths[i]` is null.
TableColumnWidth get defaultColumnWidth => _defaultColumnWidth; TableColumnWidth get defaultColumnWidth => _defaultColumnWidth;
TableColumnWidth _defaultColumnWidth; TableColumnWidth _defaultColumnWidth;
set defaultColumnWidth(TableColumnWidth value) { set defaultColumnWidth(TableColumnWidth value) {
...@@ -493,6 +598,7 @@ class RenderTable extends RenderBox { ...@@ -493,6 +598,7 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// The style to use when painting the boundary and interior divisions of the table.
TableBorder get border => _border; TableBorder get border => _border;
TableBorder _border; TableBorder _border;
set border(TableBorder value) { set border(TableBorder value) {
...@@ -502,6 +608,11 @@ class RenderTable extends RenderBox { ...@@ -502,6 +608,11 @@ class RenderTable extends RenderBox {
markNeedsPaint(); markNeedsPaint();
} }
/// The decorations to use for each row of the table.
///
/// Row decorations fill the horizontal and vertical extent of each row in
/// the table, unlike decorations for individual cells, which might not fill
/// either.
List<Decoration> get rowDecorations => new List<Decoration>.unmodifiable(_rowDecorations ?? const <Decoration>[]); List<Decoration> get rowDecorations => new List<Decoration>.unmodifiable(_rowDecorations ?? const <Decoration>[]);
List<Decoration> _rowDecorations; List<Decoration> _rowDecorations;
List<BoxPainter> _rowDecorationPainters; List<BoxPainter> _rowDecorationPainters;
...@@ -534,6 +645,7 @@ class RenderTable extends RenderBox { ...@@ -534,6 +645,7 @@ class RenderTable extends RenderBox {
} }
} }
/// How cells that do not explicitly specify a vertical alignment are aligned vertically.
TableCellVerticalAlignment get defaultVerticalAlignment => _defaultVerticalAlignment; TableCellVerticalAlignment get defaultVerticalAlignment => _defaultVerticalAlignment;
TableCellVerticalAlignment _defaultVerticalAlignment; TableCellVerticalAlignment _defaultVerticalAlignment;
set defaultVerticalAlignment (TableCellVerticalAlignment value) { set defaultVerticalAlignment (TableCellVerticalAlignment value) {
...@@ -543,6 +655,7 @@ class RenderTable extends RenderBox { ...@@ -543,6 +655,7 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// The text baseline to use when aligning rows using [TableCellVerticalAlignment.baseline].
TextBaseline get textBaseline => _textBaseline; TextBaseline get textBaseline => _textBaseline;
TextBaseline _textBaseline; TextBaseline _textBaseline;
set textBaseline (TextBaseline value) { set textBaseline (TextBaseline value) {
...@@ -558,6 +671,14 @@ class RenderTable extends RenderBox { ...@@ -558,6 +671,14 @@ class RenderTable extends RenderBox {
child.parentData = new TableCellParentData(); child.parentData = new TableCellParentData();
} }
/// Replaces the children of this table with the given cells.
///
/// The cells are divided into the specified number of columns before
/// replacing the existing children.
///
/// If the new cells contain any existing children of the table, those
/// children are simply moved to their new location in the table rather than
/// removed from the table and re-added.
void setFlatChildren(int columns, List<RenderBox> cells) { void setFlatChildren(int columns, List<RenderBox> cells) {
if (cells == _children && columns == _columns) if (cells == _children && columns == _columns)
return; return;
...@@ -617,6 +738,7 @@ class RenderTable extends RenderBox { ...@@ -617,6 +738,7 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// Replaces the children of this table with the given cells.
void setChildren(List<List<RenderBox>> cells) { void setChildren(List<List<RenderBox>> cells) {
// TODO(ianh): Make this smarter, like setFlatChildren // TODO(ianh): Make this smarter, like setFlatChildren
if (cells == null) { if (cells == null) {
...@@ -635,6 +757,9 @@ class RenderTable extends RenderBox { ...@@ -635,6 +757,9 @@ class RenderTable extends RenderBox {
assert(_children.length == rows * columns); assert(_children.length == rows * columns);
} }
/// Adds a row to the end of the table.
///
/// The newly added children must not already have parents.
void addRow(List<RenderBox> cells) { void addRow(List<RenderBox> cells) {
assert(cells.length == columns); assert(cells.length == columns);
assert(_children.length == rows * columns); assert(_children.length == rows * columns);
...@@ -647,6 +772,11 @@ class RenderTable extends RenderBox { ...@@ -647,6 +772,11 @@ class RenderTable extends RenderBox {
markNeedsLayout(); markNeedsLayout();
} }
/// Replaces the child at the given position with the given child.
///
/// If the given child is already located at the given position, this function
/// does not modify the table. Otherwise, the given child must not already
/// have a parent.
void setChild(int x, int y, RenderBox value) { void setChild(int x, int y, RenderBox value) {
assert(x != null); assert(x != null);
assert(y != null); assert(y != null);
......
...@@ -83,6 +83,12 @@ class ViewportDimensions { ...@@ -83,6 +83,12 @@ class ViewportDimensions {
/// have a child model. See [RenderViewport] for a viewport with a single child /// have a child model. See [RenderViewport] for a viewport with a single child
/// and [RenderVirtualViewport] for a viewport with multiple children. /// and [RenderVirtualViewport] for a viewport with multiple children.
class RenderViewportBase extends RenderBox { class RenderViewportBase extends RenderBox {
/// Initializes fields for subclasses.
///
/// The [paintOffset] and [mainAxis] arguments must not be null.
///
/// This constructor uses positional arguments rather than named arguments to
/// work around limitations of mixins.
RenderViewportBase( RenderViewportBase(
Offset paintOffset, Offset paintOffset,
Axis mainAxis, Axis mainAxis,
...@@ -149,6 +155,7 @@ class RenderViewportBase extends RenderBox { ...@@ -149,6 +155,7 @@ class RenderViewportBase extends RenderBox {
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
} }
/// The interior and exterior extent of the viewport.
ViewportDimensions get dimensions => _dimensions; ViewportDimensions get dimensions => _dimensions;
ViewportDimensions _dimensions = ViewportDimensions.zero; ViewportDimensions _dimensions = ViewportDimensions.zero;
set dimensions(ViewportDimensions value) { set dimensions(ViewportDimensions value) {
...@@ -181,16 +188,23 @@ class RenderViewportBase extends RenderBox { ...@@ -181,16 +188,23 @@ class RenderViewportBase extends RenderBox {
} }
} }
/// Signature for notifications about [RenderViewport] dimensions changing.
typedef Offset ViewportDimensionsChangeCallback(ViewportDimensions dimensions); typedef Offset ViewportDimensionsChangeCallback(ViewportDimensions dimensions);
/// A render object that's bigger on the inside. /// A render object that's bigger on the inside.
/// ///
/// The child of a viewport can layout to a larger size than the viewport /// The child of a viewport can layout to a larger size than the viewport
/// itself. If that happens, only a portion of the child will be visible through /// itself. If that happens, only a portion of the child will be visible through
/// the viewport. The portion of the child that is visible is controlled by the /// the viewport. The portion of the child that is visible can be controlled
/// paint offset. /// with the [paintOffset].
///
/// See also:
///
/// * [RenderVirtualViewport] (which works with more than one child)
class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin<RenderBox> { class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin<RenderBox> {
/// Creates a render object that's bigger on the inside.
///
/// The [paintOffset] and [mainAxis] arguments must not be null.
RenderViewport({ RenderViewport({
RenderBox child, RenderBox child,
Offset paintOffset: Offset.zero, Offset paintOffset: Offset.zero,
...@@ -203,6 +217,9 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< ...@@ -203,6 +217,9 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin<
/// Called during [layout] to report the dimensions of the viewport /// Called during [layout] to report the dimensions of the viewport
/// and its child. /// and its child.
///
/// The return value of this function is used as the new [paintOffset] and
/// must not be null.
ViewportDimensionsChangeCallback onPaintOffsetUpdateNeeded; ViewportDimensionsChangeCallback onPaintOffsetUpdateNeeded;
BoxConstraints _getInnerConstraints(BoxConstraints constraints) { BoxConstraints _getInnerConstraints(BoxConstraints constraints) {
...@@ -315,9 +332,24 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< ...@@ -315,9 +332,24 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin<
} }
} }
/// A render object that shows a subset of its children.
///
/// The children of a viewport can layout to a larger size than the viewport
/// itself. If that happens, only a subset of the children will be visible
/// through the viewport. The subset of children that are visible can be
/// controlled with the [paintOffset].
///
/// See also:
///
/// * [RenderList] (which arranges its children linearly)
/// * [RenderGrid] (which arranges its children into tiles)
/// * [RenderViewport] (which is easier to use with a single child)
abstract class RenderVirtualViewport<T extends ContainerBoxParentDataMixin<RenderBox>> abstract class RenderVirtualViewport<T extends ContainerBoxParentDataMixin<RenderBox>>
extends RenderViewportBase with ContainerRenderObjectMixin<RenderBox, T>, extends RenderViewportBase with ContainerRenderObjectMixin<RenderBox, T>,
RenderBoxContainerDefaultsMixin<RenderBox, T> { RenderBoxContainerDefaultsMixin<RenderBox, T> {
/// Initializes fields for subclasses.
///
/// The [paintOffset] and [mainAxis] arguments must not be null.
RenderVirtualViewport({ RenderVirtualViewport({
int virtualChildCount, int virtualChildCount,
LayoutCallback callback, LayoutCallback callback,
...@@ -328,6 +360,9 @@ abstract class RenderVirtualViewport<T extends ContainerBoxParentDataMixin<Rende ...@@ -328,6 +360,9 @@ abstract class RenderVirtualViewport<T extends ContainerBoxParentDataMixin<Rende
_callback = callback, _callback = callback,
super(paintOffset, mainAxis, anchor); super(paintOffset, mainAxis, anchor);
/// The overall number of children this viewport could potentially display.
///
/// If null, the viewport might display an unbounded number of children.
int get virtualChildCount => _virtualChildCount; int get virtualChildCount => _virtualChildCount;
int _virtualChildCount; int _virtualChildCount;
set virtualChildCount(int value) { set virtualChildCount(int value) {
......
...@@ -343,19 +343,24 @@ abstract class SchedulerBinding extends BindingBase { ...@@ -343,19 +343,24 @@ abstract class SchedulerBinding extends BindingBase {
bool get isProducingFrame => _isProducingFrame; bool get isProducingFrame => _isProducingFrame;
bool _isProducingFrame = false; bool _isProducingFrame = false;
/// If necessary, schedules a new frame by calling /// Schedules a new frame using [scheduleFrame] if this object is not
/// [ui.window.scheduleFrame]. /// currently producing a frame.
/// ///
/// After this is called, the engine will (eventually) call /// After this is called, the framework ensures that the end of the
/// [handleBeginFrame]. (This call might be delayed, e.g. if the /// [handleBeginFrame] function will (eventually) be reached.
/// device's screen is turned off it will typically be delayed until
/// the screen is on and the application is visible.)
void ensureVisualUpdate() { void ensureVisualUpdate() {
if (_isProducingFrame) if (_isProducingFrame)
return; return;
scheduleFrame(); scheduleFrame();
} }
/// If necessary, schedules a new frame by calling
/// [ui.window.scheduleFrame].
///
/// After this is called, the engine will (eventually) call
/// [handleBeginFrame]. (This call might be delayed, e.g. if the
/// device's screen is turned off it will typically be delayed until
/// the screen is on and the application is visible.)
void scheduleFrame() { void scheduleFrame() {
if (_hasScheduledFrame) if (_hasScheduledFrame)
return; return;
......
...@@ -1415,14 +1415,6 @@ class BlockBody extends MultiChildRenderObjectWidget { ...@@ -1415,14 +1415,6 @@ class BlockBody extends MultiChildRenderObjectWidget {
} }
} }
/// A base class for widgets that accept [Positioned] children.
abstract class StackRenderObjectWidgetBase extends MultiChildRenderObjectWidget {
StackRenderObjectWidgetBase({
List<Widget> children: _emptyWidgetList,
Key key
}) : super(key: key, children: children);
}
/// Uses the stack layout algorithm for its children. /// Uses the stack layout algorithm for its children.
/// ///
/// This class is useful if you want to overlap several children in a /// This class is useful if you want to overlap several children in a
...@@ -1446,7 +1438,11 @@ abstract class StackRenderObjectWidgetBase extends MultiChildRenderObjectWidget ...@@ -1446,7 +1438,11 @@ abstract class StackRenderObjectWidgetBase extends MultiChildRenderObjectWidget
/// the child according to a [FractionalOffset] value) /// the child according to a [FractionalOffset] value)
/// * [CustomSingleChildLayout] /// * [CustomSingleChildLayout]
/// * [CustomMultiChildLayout] /// * [CustomMultiChildLayout]
class Stack extends StackRenderObjectWidgetBase { class Stack extends MultiChildRenderObjectWidget {
/// Creates a stack widget.
///
/// By default, the non-positioned children of the stack are aligned by their
/// top left corners.
Stack({ Stack({
Key key, Key key,
List<Widget> children: _emptyWidgetList, List<Widget> children: _emptyWidgetList,
...@@ -1454,6 +1450,11 @@ class Stack extends StackRenderObjectWidgetBase { ...@@ -1454,6 +1450,11 @@ class Stack extends StackRenderObjectWidgetBase {
}) : super(key: key, children: children); }) : super(key: key, children: children);
/// How to align the non-positioned children in the stack. /// How to align the non-positioned children in the stack.
///
/// The non-positioned children are placed relative to each other such that
/// the points determined by [alignment] are co-located. For example, if the
/// [alignment] is [FractionalOffset.topLeft], then the top left corner of
/// each non-positioned child will be located at the same global coordinate.
final FractionalOffset alignment; final FractionalOffset alignment;
@override @override
...@@ -1466,22 +1467,22 @@ class Stack extends StackRenderObjectWidgetBase { ...@@ -1466,22 +1467,22 @@ class Stack extends StackRenderObjectWidgetBase {
} }
/// A [Stack] that shows a single child from a list of children. /// A [Stack] that shows a single child from a list of children.
class IndexedStack extends StackRenderObjectWidgetBase { class IndexedStack extends Stack {
/// Creates a stack widget that paints a single child.
///
/// The [index] argument must not be null.
IndexedStack({ IndexedStack({
Key key, Key key,
List<Widget> children: _emptyWidgetList, List<Widget> children: _emptyWidgetList,
this.alignment: FractionalOffset.topLeft, FractionalOffset alignment: FractionalOffset.topLeft,
this.index: 0 this.index: 0
}) : super(key: key, children: children) { }) : super(key: key, alignment: alignment, children: children) {
assert(index != null); assert(index != null);
} }
/// The index of the child to show. /// The index of the child to show.
final int index; final int index;
/// How to align the non-positioned children in the stack.
final FractionalOffset alignment;
@override @override
RenderIndexedStack createRenderObject(BuildContext context) => new RenderIndexedStack(index: index, alignment: alignment); RenderIndexedStack createRenderObject(BuildContext context) => new RenderIndexedStack(index: index, alignment: alignment);
...@@ -1498,7 +1499,7 @@ class IndexedStack extends StackRenderObjectWidgetBase { ...@@ -1498,7 +1499,7 @@ class IndexedStack extends StackRenderObjectWidgetBase {
/// This widget must be a descendant of a [Stack], and the path from this widget /// This widget must be a descendant of a [Stack], and the path from this widget
/// to its enclosing [Stack] must contain only [StatelessWidget]s or /// to its enclosing [Stack] must contain only [StatelessWidget]s or
/// [StatefulWidget]s (not other kinds of widgets, like [RenderObjectWidget]s). /// [StatefulWidget]s (not other kinds of widgets, like [RenderObjectWidget]s).
class Positioned extends ParentDataWidget<StackRenderObjectWidgetBase> { class Positioned extends ParentDataWidget<Stack> {
/// Creates a Positioned object with the given values. /// Creates a Positioned object with the given values.
/// ///
/// Only two out of the three horizontal values ([left], [right], /// Only two out of the three horizontal values ([left], [right],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment