Commit eec9833f authored by Hixie's avatar Hixie

Change OverflowBox API to allow min and max values

Previously OverflowBox was only useful to set a tight constraint on the
child. Now it can be used to set any constraint, it just overrides any
constraint from the parent that is not set to null on the
RenderOverflowBox object when giving the constraints to the child.
parent a3ecdc30
...@@ -230,20 +230,26 @@ class SizedBox extends OneChildRenderObjectWidget { ...@@ -230,20 +230,26 @@ class SizedBox extends OneChildRenderObjectWidget {
} }
class OverflowBox extends OneChildRenderObjectWidget { class OverflowBox extends OneChildRenderObjectWidget {
OverflowBox({ Key key, this.width, this.height, Widget child }) OverflowBox({ Key key, this.minWidth, this.maxWidth, this.minHeight, this.maxHeight, Widget child })
: super(key: key, child: child); : super(key: key, child: child);
final double width; final double minWidth;
final double height; final double maxWidth;
final double minHeight;
final double maxHeight;
RenderOverflowBox createRenderObject() => new RenderOverflowBox( RenderOverflowBox createRenderObject() => new RenderOverflowBox(
innerWidth: width, minWidth: minWidth,
innerHeight: height maxWidth: maxWidth,
minHeight: minHeight,
maxHeight: maxHeight
); );
void updateRenderObject(RenderOverflowBox renderObject, OverflowBox oldWidget) { void updateRenderObject(RenderOverflowBox renderObject, OverflowBox oldWidget) {
renderObject.innerWidth = width; renderObject.minWidth = minWidth;
renderObject.innerHeight = height; renderObject.maxWidth = maxWidth;
renderObject.minHeight = minHeight;
renderObject.maxHeight = maxHeight;
} }
} }
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:async'; import 'dart:async';
import 'dart:sky' as sky;
import 'package:mojo_services/keyboard/keyboard.mojom.dart'; import 'package:mojo_services/keyboard/keyboard.mojom.dart';
import 'package:sky/painting.dart'; import 'package:sky/painting.dart';
......
...@@ -90,7 +90,8 @@ class SnackBarState extends AnimatedState<SnackBar> { ...@@ -90,7 +90,8 @@ class SnackBarState extends AnimatedState<SnackBar> {
), ),
child: new ClipRect( child: new ClipRect(
child: new OverflowBox( child: new OverflowBox(
height: kSnackHeight, minHeight: kSnackHeight,
maxHeight: kSnackHeight,
child: new Material( child: new Material(
level: 2, level: 2,
color: kSnackBackground, color: kSnackBackground,
......
...@@ -150,57 +150,81 @@ class RenderConstrainedBox extends RenderProxyBox { ...@@ -150,57 +150,81 @@ class RenderConstrainedBox extends RenderProxyBox {
/// ///
/// A render overflow box proxies most functions in the render box protocol to /// A render overflow box proxies most functions in the render box protocol to
/// its child, except that when laying out its child, it passes constraints /// its child, except that when laying out its child, it passes constraints
/// based on the innerWidth and innerHeight fields instead of just passing the /// based on the minWidth, maxWidth, minHeight, and maxHeight fields instead of
/// parent's constraints in. It then sizes itself based on the parent's /// just passing the parent's constraints in. Specifically, it overrides any of
/// constraints' maxWidth and maxHeight, ignoring the child's dimensions. /// the equivalent fields on the constraints given by the parent with the
/// constraints given by these fields for each such field that is not null. It
/// then sizes itself based on the parent's constraints' maxWidth and maxHeight,
/// ignoring the child's dimensions.
/// ///
/// For example, if you wanted a box to always render 50x50, regardless of where /// For example, if you wanted a box to always render 50 pixels high, regardless
/// it was rendered, you would wrap it in a RenderOverflow with innerWidth and /// of where it was rendered, you would wrap it in a RenderOverflow with
/// innerHeight members set to 50.0. Generally speaking, to avoid confusing /// minHeight and maxHeight set to 50.0. Generally speaking, to avoid confusing
/// behaviour around hit testing, a RenderOverflowBox should usually be wrapped /// behaviour around hit testing, a RenderOverflowBox should usually be wrapped
/// in a RenderClipRect. /// in a RenderClipRect.
/// ///
/// The child is positioned at the top left of the box. To position a smaller /// The child is positioned at the top left of the box. To position a smaller
/// child inside a larger parent, use [RenderPositionedBox] and /// child inside a larger parent, use [RenderPositionedBox] and
/// [RenderConstrainedBox] rather than RenderOverflowBox. /// [RenderConstrainedBox] rather than RenderOverflowBox.
///
/// If you pass null for innerWidth or innerHeight, the constraints from the
/// parent are passed instead.
class RenderOverflowBox extends RenderProxyBox { class RenderOverflowBox extends RenderProxyBox {
RenderOverflowBox({ RenderOverflowBox({
RenderBox child, RenderBox child,
double innerWidth, double minWidth,
double innerHeight double maxWidth,
}) : _innerWidth = innerWidth, _innerHeight = innerHeight, super(child); double minHeight,
double maxHeight
/// The tight width constraint to give the child. Set this to null (the }) : _minWidth = minWidth, _maxWidth = maxWidth, _minHeight = minHeight, _maxHeight = maxHeight, super(child);
/// default) to use the constraints from the parent instead.
double get innerWidth => _innerWidth; /// The minimum width constraint to give the child. Set this to null (the
double _innerWidth; /// default) to use the constraint from the parent instead.
void set innerWidth (double value) { double get minWidth => _minWidth;
if (_innerWidth == value) double _minWidth;
void set minWidth (double value) {
if (_minWidth == value)
return;
_minWidth = value;
markNeedsLayout();
}
/// The maximum width constraint to give the child. Set this to null (the
/// default) to use the constraint from the parent instead.
double get maxWidth => _maxWidth;
double _maxWidth;
void set maxWidth (double value) {
if (_maxWidth == value)
return;
_maxWidth = value;
markNeedsLayout();
}
/// The minimum height constraint to give the child. Set this to null (the
/// default) to use the constraint from the parent instead.
double get minHeight => _minHeight;
double _minHeight;
void set minHeight (double value) {
if (_minHeight == value)
return; return;
_innerWidth = value; _minHeight = value;
markNeedsLayout(); markNeedsLayout();
} }
/// The tight height constraint to give the child. Set this to null (the /// The maximum height constraint to give the child. Set this to null (the
/// default) to use the constraints from the parent instead. /// default) to use the constraint from the parent instead.
double get innerHeight => _innerHeight; double get maxHeight => _maxHeight;
double _innerHeight; double _maxHeight;
void set innerHeight (double value) { void set maxHeight (double value) {
if (_innerHeight == value) if (_maxHeight == value)
return; return;
_innerHeight = value; _maxHeight = value;
markNeedsLayout(); markNeedsLayout();
} }
BoxConstraints childConstraints(BoxConstraints constraints) { BoxConstraints childConstraints(BoxConstraints constraints) {
return new BoxConstraints( return new BoxConstraints(
minWidth: _innerWidth ?? constraints.minWidth, minWidth: _minWidth ?? constraints.minWidth,
maxWidth: _innerWidth ?? constraints.maxWidth, maxWidth: _maxWidth ?? constraints.maxWidth,
minHeight: _innerHeight ?? constraints.minHeight, minHeight: _minHeight ?? constraints.minHeight,
maxHeight: _innerHeight ?? constraints.maxHeight maxHeight: _maxHeight ?? constraints.maxHeight
); );
} }
...@@ -233,8 +257,10 @@ class RenderOverflowBox extends RenderProxyBox { ...@@ -233,8 +257,10 @@ class RenderOverflowBox extends RenderProxyBox {
String debugDescribeSettings(String prefix) { String debugDescribeSettings(String prefix) {
return '${super.debugDescribeSettings(prefix)}' + return '${super.debugDescribeSettings(prefix)}' +
'${prefix}innerWidth: ${innerWidth ?? "use parent width constraints"}\n' + '${prefix}minWidth: ${minWidth ?? "use parent minWidth constraint"}\n' +
'${prefix}innerHeight: ${innerHeight ?? "use parent height constraints"}\n'; '${prefix}maxWidth: ${maxWidth ?? "use parent maxWidth constraint"}\n' +
'${prefix}minHeight: ${minHeight ?? "use parent minHeight constraint"}\n' +
'${prefix}maxHeight: ${maxHeight ?? "use parent maxHeight constraint"}\n';
} }
} }
......
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