Add dartdoc to RenderBlock and RenderFlex
diff --git a/packages/flutter/lib/src/rendering/block.dart b/packages/flutter/lib/src/rendering/block.dart
index 4c4ad2b..91e49a9 100644
--- a/packages/flutter/lib/src/rendering/block.dart
+++ b/packages/flutter/lib/src/rendering/block.dart
@@ -8,19 +8,32 @@
import 'package:sky/src/rendering/object.dart';
import 'package:vector_math/vector_math.dart';
+/// Parent data for use with [RenderBlockBase]
class BlockParentData extends BoxParentData with ContainerParentDataMixin<RenderBox> { }
-enum BlockDirection { horizontal, vertical }
+/// The direction in which the block should lay out
+enum BlockDirection {
+ /// Children are arranged horizontally, from left to right
+ horizontal,
+ /// Children are arranged vertically, from top to bottom
+ vertical
+}
typedef double _ChildSizingFunction(RenderBox child, BoxConstraints constraints);
typedef double _Constrainer(double value);
+/// Implements the block layout algorithm
+///
+/// In block layout, children are arranged linearly along the main axis (either
+/// horizontally or vertically). In the cross axis, children are stretched to
+/// match the block's cross-axis extent. In the main axis, children are given
+/// unlimited space and the block expands its main axis to contain all its
+/// children. Because blocks expand in the main axis, blocks must be given
+/// unlimited space in the main axis, typically by being contained in a
+/// viewport with a scrolling direction that matches the block's main axis.
abstract class RenderBlockBase extends RenderBox with ContainerRenderObjectMixin<RenderBox, BlockParentData>,
RenderBoxContainerDefaultsMixin<RenderBox, BlockParentData> {
- // lays out RenderBox children in a vertical stack
- // uses the maximum width provided by the parent
-
RenderBlockBase({
List<RenderBox> children,
BlockDirection direction: BlockDirection.vertical,
@@ -35,8 +48,9 @@
child.parentData = new BlockParentData();
}
- BlockDirection _direction;
+ /// The direction to use as the main axis
BlockDirection get direction => _direction;
+ BlockDirection _direction;
void set direction (BlockDirection value) {
if (_direction != value) {
_direction = value;
@@ -44,8 +58,9 @@
}
}
- double _itemExtent;
+ /// If non-null, forces children to be exactly this large in the main axis
double get itemExtent => _itemExtent;
+ double _itemExtent;
void set itemExtent(double value) {
if (value != _itemExtent) {
_itemExtent = value;
@@ -53,8 +68,9 @@
}
}
- double _minExtent;
+ /// Forces the block to be at least this large in the main-axis
double get minExtent => _minExtent;
+ double _minExtent;
void set minExtent(double value) {
if (value != _minExtent) {
_minExtent = value;
@@ -62,6 +78,7 @@
}
}
+ /// Whether the main axis is vertical
bool get isVertical => _direction == BlockDirection.vertical;
BoxConstraints _getInnerConstraints(BoxConstraints constraints) {
@@ -102,6 +119,7 @@
String debugDescribeSettings(String prefix) => '${super.debugDescribeSettings(prefix)}${prefix}direction: ${direction}\n';
}
+/// A block layout with a concrete set of children
class RenderBlock extends RenderBlockBase {
RenderBlock({
@@ -194,21 +212,21 @@
}
+/// A block layout whose children depend on its layout
+///
+/// This class invokes a callbacks for layout and intrinsic dimensions. The main
+/// [callback] (constructor argument and property) is expected to modify the
+/// element's child list. The regular block layout algorithm is then applied to
+/// the children. The intrinsic dimension callbacks are called to determine
+/// intrinsic dimensions; if no value can be returned, they should not be set
+/// or, if set, should return null.
class RenderBlockViewport extends RenderBlockBase {
- // This class invokes a callbacks for layout and intrinsic
- // dimensions. The main callback (constructor argument and property
- // called "callback") is expected to modify the element's child
- // list. The regular block layout algorithm is then applied to the
- // children. The intrinsic dimension callbacks are called to
- // determine intrinsic dimensions; if no value can be returned, they
- // should not be set or, if set, should return null.
-
RenderBlockViewport({
LayoutCallback callback,
- DimensionCallback totalExtentCallback,
- DimensionCallback maxCrossAxisDimensionCallback,
- DimensionCallback minCrossAxisDimensionCallback,
+ ExtentCallback totalExtentCallback,
+ ExtentCallback maxCrossAxisDimensionCallback,
+ ExtentCallback minCrossAxisDimensionCallback,
BlockDirection direction: BlockDirection.vertical,
double itemExtent,
double minExtent: 0.0,
@@ -216,16 +234,19 @@
List<RenderBox> children
}) : _callback = callback,
_totalExtentCallback = totalExtentCallback,
- _maxCrossAxisDimensionCallback = maxCrossAxisDimensionCallback,
- _minCrossAxisDimensionCallback = minCrossAxisDimensionCallback,
+ _maxCrossAxisExtentCallback = maxCrossAxisDimensionCallback,
+ _minCrossAxisExtentCallback = minCrossAxisDimensionCallback,
_startOffset = startOffset,
super(children: children, direction: direction, itemExtent: itemExtent, minExtent: minExtent);
bool _inCallback = false;
- // Called during layout. Mutate the child list appropriately.
- LayoutCallback _callback;
+ /// Called during [layout] to determine the blocks children
+ ///
+ /// Typically the callback will mutate the child list appropriately, for
+ /// example so the child list contains only visible children.
LayoutCallback get callback => _callback;
+ LayoutCallback _callback;
void set callback(LayoutCallback value) {
assert(!_inCallback);
if (value == _callback)
@@ -234,11 +255,10 @@
markNeedsLayout();
}
- // Return the sum of the extent of all the children that could be included by the callback in one go.
- // The extent is the dimension in the direction given by the 'direction' property.
- DimensionCallback _totalExtentCallback;
- DimensionCallback get totalExtentCallback => _totalExtentCallback;
- void set totalExtentCallback(DimensionCallback value) {
+ /// Returns the total main-axis extent of all the children that could be included by [callback] in one go
+ ExtentCallback get totalExtentCallback => _totalExtentCallback;
+ ExtentCallback _totalExtentCallback;
+ void set totalExtentCallback(ExtentCallback value) {
assert(!_inCallback);
if (value == _totalExtentCallback)
return;
@@ -246,35 +266,33 @@
markNeedsLayout();
}
- // Return the minimum dimension across all the children that could
- // be included in one go, in the direction orthogonal to that given
- // by the 'direction' property.
- DimensionCallback _minCrossAxisDimensionCallback;
- DimensionCallback get minCrossAxisDimensionCallback => _minCrossAxisDimensionCallback;
- void set minCrossAxisDimensionCallback(DimensionCallback value) {
+ /// Returns the minimum cross-axis extent across all the children that could be included by [callback] in one go
+ ExtentCallback get minCrossAxisExtentCallback => _minCrossAxisExtentCallback;
+ ExtentCallback _minCrossAxisExtentCallback;
+ void set minCrossAxisExtentCallback(ExtentCallback value) {
assert(!_inCallback);
- if (value == _minCrossAxisDimensionCallback)
+ if (value == _minCrossAxisExtentCallback)
return;
- _minCrossAxisDimensionCallback = value;
+ _minCrossAxisExtentCallback = value;
markNeedsLayout();
}
- // Return the maximum dimension across all the children that could
- // be included in one go, in the direction orthogonal to that given
- // by the 'direction' property.
- DimensionCallback _maxCrossAxisDimensionCallback;
- DimensionCallback get maxCrossAxisDimensionCallback => _maxCrossAxisDimensionCallback;
- void set maxCrossAxisDimensionCallback(DimensionCallback value) {
+ /// Returns the maximum cross-axis extent across all the children that could be included by [callback] in one go
+ ExtentCallback get maxCrossAxisExtentCallback => _maxCrossAxisExtentCallback;
+ ExtentCallback _maxCrossAxisExtentCallback;
+ void set maxCrossAxisExtentCallback(ExtentCallback value) {
assert(!_inCallback);
- if (value == _maxCrossAxisDimensionCallback)
+ if (value == _maxCrossAxisExtentCallback)
return;
- _maxCrossAxisDimensionCallback = value;
+ _maxCrossAxisExtentCallback = value;
markNeedsLayout();
}
- // you can set this from within the callback if necessary
- double _startOffset;
+ /// The offset at which to paint the first child
+ ///
+ /// Note: you can modify this property from within [callback], if necessary.
double get startOffset => _startOffset;
+ double _startOffset;
void set startOffset(double value) {
if (value != _startOffset) {
_startOffset = value;
@@ -282,7 +300,7 @@
}
}
- double _getIntrinsicDimension(BoxConstraints constraints, DimensionCallback intrinsicCallback, _Constrainer constrainer) {
+ double _getIntrinsicDimension(BoxConstraints constraints, ExtentCallback intrinsicCallback, _Constrainer constrainer) {
assert(!_inCallback);
double result;
if (intrinsicCallback == null) {
@@ -307,25 +325,25 @@
double getMinIntrinsicWidth(BoxConstraints constraints) {
if (isVertical)
- return _getIntrinsicDimension(constraints, minCrossAxisDimensionCallback, constraints.constrainWidth);
+ return _getIntrinsicDimension(constraints, minCrossAxisExtentCallback, constraints.constrainWidth);
return constraints.constrainWidth(minExtent);
}
double getMaxIntrinsicWidth(BoxConstraints constraints) {
if (isVertical)
- return _getIntrinsicDimension(constraints, maxCrossAxisDimensionCallback, constraints.constrainWidth);
+ return _getIntrinsicDimension(constraints, maxCrossAxisExtentCallback, constraints.constrainWidth);
return _getIntrinsicDimension(constraints, totalExtentCallback, new BoxConstraints(minWidth: minExtent).enforce(constraints).constrainWidth);
}
double getMinIntrinsicHeight(BoxConstraints constraints) {
if (!isVertical)
- return _getIntrinsicDimension(constraints, minCrossAxisDimensionCallback, constraints.constrainHeight);
+ return _getIntrinsicDimension(constraints, minCrossAxisExtentCallback, constraints.constrainHeight);
return constraints.constrainHeight(0.0);
}
double getMaxIntrinsicHeight(BoxConstraints constraints) {
if (!isVertical)
- return _getIntrinsicDimension(constraints, maxCrossAxisDimensionCallback, constraints.constrainHeight);
+ return _getIntrinsicDimension(constraints, maxCrossAxisExtentCallback, constraints.constrainHeight);
return _getIntrinsicDimension(constraints, totalExtentCallback, new BoxConstraints(minHeight: minExtent).enforce(constraints).constrainHeight);
}
diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart
index ca7d6f8..ed82ff8 100644
--- a/packages/flutter/lib/src/rendering/box.dart
+++ b/packages/flutter/lib/src/rendering/box.dart
@@ -12,9 +12,6 @@
export 'package:sky/painting.dart' show TextBaseline;
-// GENERIC BOX RENDERING
-// Anything that has a concept of x, y, width, height is going to derive from this
-
// This class should only be used in debug builds
class _DebugSize extends Size {
_DebugSize(Size source, this._owner, this._canBeUsedByParent): super.copy(source);
diff --git a/packages/flutter/lib/src/rendering/flex.dart b/packages/flutter/lib/src/rendering/flex.dart
index 0c84c4c..db106ee 100644
--- a/packages/flutter/lib/src/rendering/flex.dart
+++ b/packages/flutter/lib/src/rendering/flex.dart
@@ -9,7 +9,14 @@
export 'package:sky/src/rendering/object.dart' show EventDisposition;
+/// Parent data for use with [RenderFlex]
class FlexParentData extends BoxParentData with ContainerParentDataMixin<RenderBox> {
+ /// The flex factor to use for this child
+ ///
+ /// If null, the child is inflexible and determines its own size. If non-null,
+ /// the child is flexible and its extent in the main axis is determined by
+ /// dividing the free space (after placing the inflexible children)
+ /// according to the flex factors of the flexible children.
int flex;
void merge(FlexParentData other) {
@@ -21,29 +28,61 @@
String toString() => '${super.toString()}; flex=$flex';
}
-enum FlexDirection { horizontal, vertical }
+/// The direction in which the box should flex
+enum FlexDirection {
+ /// Children are arranged horizontally, from left to right
+ horizontal,
+ /// Children are arranged vertically, from top to bottom
+ vertical
+}
+/// How the children should be placed along the main axis in a flex layout
enum FlexJustifyContent {
+ /// Place the children as close to the start of the main axis as possible
start,
+ /// Place the children as close to the end of the main axis as possible
end,
+ /// Place the children as close to the middle of the main axis as possible
center,
+ /// Place the free space evenly between the children
spaceBetween,
+ /// Place the free space evenly between the children as well as before and after the first and last child
spaceAround,
}
+/// How the children should be placed along the cross axis in a flex layout
enum FlexAlignItems {
+ /// Place the children as close to the start of the cross axis as possible
start,
+ /// Place the children as close to the end of the cross axis as possible
end,
+ /// Place the children as close to the middle of the cross axis as possible
center,
+ /// Require the children to fill the cross axis
stretch,
+ /// Place the children along the cross axis such that their baselines match
baseline,
}
typedef double _ChildSizingFunction(RenderBox child, BoxConstraints constraints);
+/// Implements the flex layout algorithm
+///
+/// In flex layout, children are arranged linearly along the main axis (either
+/// horizontally or vertically). First, inflexible children (those with a null
+/// flex factor) are allocated space along the main axis. If the flex is given
+/// unlimited space in the main axis, the flex sizes its main axis to the total
+/// size of the inflexible children along the main axis and forbids flexible
+/// children. Otherwise, the flex expands to the maximum max-axis size and the
+/// remaining space along is divided among the flexible children according to
+/// their flex factors. Any remaining free space (i.e., if there aren't any
+/// flexible children) is allocated according to the [justifyContent] property.
+///
+/// In the cross axis, children determine their own size. The flex then sizes
+/// its cross axis to fix the largest of its children. The children are then
+/// positioned along the cross axis according to the [alignItems] property.
class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, FlexParentData>,
RenderBoxContainerDefaultsMixin<RenderBox, FlexParentData> {
- // lays out RenderBox children using flexible layout
RenderFlex({
List<RenderBox> children,
@@ -58,8 +97,9 @@
addAll(children);
}
- FlexDirection _direction;
+ /// The direction to use as the main axis
FlexDirection get direction => _direction;
+ FlexDirection _direction;
void set direction (FlexDirection value) {
if (_direction != value) {
_direction = value;
@@ -67,8 +107,9 @@
}
}
- FlexJustifyContent _justifyContent;
+ /// How the children should be placed along the main axis
FlexJustifyContent get justifyContent => _justifyContent;
+ FlexJustifyContent _justifyContent;
void set justifyContent (FlexJustifyContent value) {
if (_justifyContent != value) {
_justifyContent = value;
@@ -76,8 +117,9 @@
}
}
- FlexAlignItems _alignItems;
+ /// How the children should be placed along the cross axis
FlexAlignItems get alignItems => _alignItems;
+ FlexAlignItems _alignItems;
void set alignItems (FlexAlignItems value) {
if (_alignItems != value) {
_alignItems = value;
@@ -85,8 +127,9 @@
}
}
- TextBaseline _textBaseline;
+ /// If using aligning items according to their baseline, which baseline to use
TextBaseline get textBaseline => _textBaseline;
+ TextBaseline _textBaseline;
void set textBaseline (TextBaseline value) {
if (_textBaseline != value) {
_textBaseline = value;
@@ -94,7 +137,7 @@
}
}
- // Set during layout if overflow occurred on the main axis
+ /// Set during layout if overflow occurred on the main axis
double _overflow;
void setupParentData(RenderBox child) {
diff --git a/packages/flutter/lib/src/rendering/image.dart b/packages/flutter/lib/src/rendering/image.dart
index 48819e9..9b96467 100644
--- a/packages/flutter/lib/src/rendering/image.dart
+++ b/packages/flutter/lib/src/rendering/image.dart
@@ -8,6 +8,10 @@
import 'package:sky/src/rendering/object.dart';
import 'package:sky/src/rendering/box.dart';
+/// An image in the render tree
+///
+/// The render image attempts to find a size for itself that fits in the given
+/// constraints and preserves the image's intrinisc aspect ratio.
class RenderImage extends RenderBox {
RenderImage({
sky.Image image,
@@ -24,6 +28,7 @@
_repeat = repeat;
sky.Image _image;
+ /// The image to display
sky.Image get image => _image;
void set image (sky.Image value) {
if (value == _image)
@@ -35,6 +40,7 @@
}
double _width;
+ /// If non-null, requires the image to have this width
double get width => _width;
void set width (double value) {
if (value == _width)
@@ -44,6 +50,7 @@
}
double _height;
+ /// If non-null, requires the image to have this height
double get height => _height;
void set height (double value) {
if (value == _height)
@@ -53,6 +60,7 @@
}
sky.ColorFilter _colorFilter;
+ /// If non-null, apply this color filter to the image before painint.
sky.ColorFilter get colorFilter => _colorFilter;
void set colorFilter (sky.ColorFilter value) {
if (value == _colorFilter)
@@ -62,6 +70,7 @@
}
ImageFit _fit;
+ /// How to inscribe the image into the place allocated during layout
ImageFit get fit => _fit;
void set fit (ImageFit value) {
if (value == _fit)
@@ -71,6 +80,7 @@
}
ImageRepeat _repeat;
+ /// Not yet implemented
ImageRepeat get repeat => _repeat;
void set repeat (ImageRepeat value) {
if (value == _repeat)
@@ -79,6 +89,13 @@
markNeedsPaint();
}
+ /// Find a size for the render image within the given constraints
+ ///
+ /// - The dimensions of the RenderImage must fit within the constraints.
+ /// - The aspect ratio of the RenderImage matches the instrinsic aspect
+ /// ratio of the image.
+ /// - The RenderImage's dimension are maximal subject to being smaller than
+ /// the intrinsic size of the image.
Size _sizeForConstraints(BoxConstraints constraints) {
// Folds the given |width| and |height| into |cosntraints| so they can all
// be treated uniformly.
@@ -90,16 +107,6 @@
if (constraints.isTight || _image == null)
return constraints.smallest;
- // This algorithm attempts to find a size for the RenderImage that fits in
- // the given constraints and preserves the image's intrinisc aspect ratio.
- // Its goals as follow:
- //
- // - The dimensions of the RenderImage fit within the constraints.
- // - The aspect ratio of the RenderImage matches the instrinsic aspect
- // ratio of the image.
- // - The RenderImage's dimension are maximal subject to being smaller than
- // the intrinsic size of the image.
-
double width = _image.width.toDouble();
double height = _image.height.toDouble();
assert(width > 0.0);
diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart
index 5d85ad6..6fd8197 100644
--- a/packages/flutter/lib/src/rendering/object.dart
+++ b/packages/flutter/lib/src/rendering/object.dart
@@ -366,7 +366,7 @@
typedef void RenderObjectVisitor(RenderObject child);
typedef void LayoutCallback(Constraints constraints);
-typedef double DimensionCallback(Constraints constraints);
+typedef double ExtentCallback(Constraints constraints);
/// An object in the render tree
///
diff --git a/packages/flutter/lib/src/widgets/homogeneous_viewport.dart b/packages/flutter/lib/src/widgets/homogeneous_viewport.dart
index c6c95e8..6695da2 100644
--- a/packages/flutter/lib/src/widgets/homogeneous_viewport.dart
+++ b/packages/flutter/lib/src/widgets/homogeneous_viewport.dart
@@ -43,16 +43,16 @@
RenderBlockViewport result = new RenderBlockViewport();
result.callback = layout;
result.totalExtentCallback = getTotalExtent;
- result.minCrossAxisDimensionCallback = getMinCrossAxisDimension;
- result.maxCrossAxisDimensionCallback = getMaxCrossAxisDimension;
+ result.minCrossAxisExtentCallback = getMinCrossAxisExtent;
+ result.maxCrossAxisExtentCallback = getMaxCrossAxisExtent;
return result;
}
void remove() {
renderObject.callback = null;
renderObject.totalExtentCallback = null;
- renderObject.minCrossAxisDimensionCallback = null;
- renderObject.maxCrossAxisDimensionCallback = null;
+ renderObject.minCrossAxisExtentCallback = null;
+ renderObject.maxCrossAxisExtentCallback = null;
super.remove();
_children.clear();
_layoutDirty = true;
@@ -172,11 +172,11 @@
return itemCount != null ? itemCount * itemExtent : double.INFINITY;
}
- double getMinCrossAxisDimension(BoxConstraints constraints) {
+ double getMinCrossAxisExtent(BoxConstraints constraints) {
return 0.0;
}
- double getMaxCrossAxisDimension(BoxConstraints constraints) {
+ double getMaxCrossAxisExtent(BoxConstraints constraints) {
if (direction == ScrollDirection.vertical)
return constraints.maxWidth;
return constraints.maxHeight;
diff --git a/packages/flutter/lib/src/widgets/mixed_viewport.dart b/packages/flutter/lib/src/widgets/mixed_viewport.dart
index 2eab122..f855b6f 100644
--- a/packages/flutter/lib/src/widgets/mixed_viewport.dart
+++ b/packages/flutter/lib/src/widgets/mixed_viewport.dart
@@ -98,17 +98,17 @@
// create it, because the render object is empty so it will not matter
RenderBlockViewport result = new RenderBlockViewport();
result.callback = layout;
- result.totalExtentCallback = _noIntrinsicDimensions;
- result.maxCrossAxisDimensionCallback = _noIntrinsicDimensions;
- result.minCrossAxisDimensionCallback = _noIntrinsicDimensions;
+ result.totalExtentCallback = _noIntrinsicExtent;
+ result.maxCrossAxisExtentCallback = _noIntrinsicExtent;
+ result.minCrossAxisExtentCallback = _noIntrinsicExtent;
return result;
}
void remove() {
renderObject.callback = null;
renderObject.totalExtentCallback = null;
- renderObject.maxCrossAxisDimensionCallback = null;
- renderObject.minCrossAxisDimensionCallback = null;
+ renderObject.maxCrossAxisExtentCallback = null;
+ renderObject.minCrossAxisExtentCallback = null;
super.remove();
_childrenByKey.clear();
layoutState._dirty = true;
@@ -140,7 +140,7 @@
assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer
}
- double _noIntrinsicDimensions(BoxConstraints constraints) {
+ double _noIntrinsicExtent(BoxConstraints constraints) {
assert(() {
'MixedViewport does not support returning intrinsic dimensions. ' +
'Calculating the intrinsic dimensions would require walking the entire child list, ' +
@@ -330,7 +330,7 @@
'all the children. You probably want to put the MixedViewport inside a Container with a fixed width.' is String);
}
final double endOffset = startOffset + extent;
-
+
BoxConstraints innerConstraints;
if (direction == ScrollDirection.vertical) {
innerConstraints = new BoxConstraints.tightFor(width: constraints.constrainWidth());