Commit 6f226615 authored by Hans Muller's avatar Hans Muller

Extended height toolbar

parent 98c0282f
...@@ -38,7 +38,7 @@ class CardCollectionState extends State<CardCollection> { ...@@ -38,7 +38,7 @@ class CardCollectionState extends State<CardCollection> {
List<CardModel> _cardModels; List<CardModel> _cardModels;
DismissDirection _dismissDirection = DismissDirection.horizontal; DismissDirection _dismissDirection = DismissDirection.horizontal;
TextStyle _textStyle = new TextStyle(textAlign: TextAlign.center); TextStyle _textStyle = new TextStyle(textAlign: TextAlign.center);
bool _editable = true; bool _editable = false;
bool _snapToCenter = false; bool _snapToCenter = false;
bool _fixedSizeCards = false; bool _fixedSizeCards = false;
bool _sunshine = false; bool _sunshine = false;
...@@ -271,7 +271,14 @@ class CardCollectionState extends State<CardCollection> { ...@@ -271,7 +271,14 @@ class CardCollectionState extends State<CardCollection> {
center: new Text('Swipe Away'), center: new Text('Swipe Away'),
right: <Widget>[ right: <Widget>[
new Text(_dismissDirectionText(_dismissDirection)) new Text(_dismissDirectionText(_dismissDirection))
] ],
bottom: new Padding(
padding: const EdgeDims.only(left: 32.0),
child: new Align(
alignment: const FractionalOffset(0.0, 0.5),
child: new Text("Remaining items ${_cardModels.length}")
)
)
); );
} }
......
...@@ -14,6 +14,7 @@ const double kStatusBarHeight = 50.0; ...@@ -14,6 +14,7 @@ const double kStatusBarHeight = 50.0;
// Mobile Portrait: 56dp // Mobile Portrait: 56dp
// Tablet/Desktop: 64dp // Tablet/Desktop: 64dp
const double kToolBarHeight = 56.0; const double kToolBarHeight = 56.0;
const double kExtendedToolBarHeight = 128.0;
const double kSnackBarHeight = 52.0; const double kSnackBarHeight = 52.0;
// https://www.google.com/design/spec/layout/metrics-keylines.html#metrics-keylines-keylines-spacing // https://www.google.com/design/spec/layout/metrics-keylines.html#metrics-keylines-keylines-spacing
......
...@@ -4,92 +4,87 @@ ...@@ -4,92 +4,87 @@
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'constants.dart'; import 'constants.dart';
import 'material.dart'; import 'material.dart';
const int _kToolBarIndex = 1;
const int _kBodyIndex = 0;
// This layout has the same effect as putting the toolbar and body in a column
// and making the body flexible. What's different is that in this case the
// toolbar appears -after- the body in the stacking order, so the toolbar's
// shadow is drawn on top of the body.
class _ToolBarAndBodyLayout extends MultiChildLayoutDelegate {
void performLayout(Size size, BoxConstraints constraints, int childCount) {
assert(childCount == 2);
final BoxConstraints toolBarConstraints = constraints.loosen().tightenWidth(size.width);
final Size toolBarSize = layoutChild(_kToolBarIndex, toolBarConstraints);
final double topPadding = ui.window.padding.top;
final double bodyHeight = size.height - toolBarSize.height - topPadding;
final BoxConstraints bodyConstraints = toolBarConstraints.tightenHeight(bodyHeight);
layoutChild(_kBodyIndex, bodyConstraints);
positionChild(_kToolBarIndex, new Point(0.0, topPadding));
positionChild(_kBodyIndex, new Point(0.0, topPadding + toolBarSize.height));
}
}
class Scaffold extends StatelessComponent { class Scaffold extends StatelessComponent {
final _ToolBarAndBodyLayout _toolBarAndBodyLayout = new _ToolBarAndBodyLayout();
Scaffold({ Scaffold({
Key key, Key key,
this.body, this.body,
this.statusBar,
this.toolBar, this.toolBar,
this.snackBar, this.snackBar,
this.floatingActionButton this.floatingActionButton
}) : super(key: key); }) : super(key: key);
final Widget body; final Widget body;
final Widget statusBar;
final Widget toolBar; final Widget toolBar;
final Widget snackBar; final Widget snackBar;
final Widget floatingActionButton; final Widget floatingActionButton;
Widget build(BuildContext context) { Widget build(BuildContext context) {
double toolBarHeight = 0.0; final Widget materialBody = body != null ? new Material(child: body) : null;
if (toolBar != null) Widget toolBarAndBody;
toolBarHeight = kToolBarHeight + ui.window.padding.top; if (toolBar != null && materialBody != null)
toolBarAndBody = new CustomMultiChildLayout(<Widget>[materialBody, toolBar],
double statusBarHeight = 0.0; delegate: _toolBarAndBodyLayout
if (statusBar != null) );
statusBarHeight = kStatusBarHeight; else
toolBarAndBody = toolBar ?? materialBody;
List<Widget> children = <Widget>[];
final List<Widget> bottomColumnChildren = <Widget>[];
if (body != null) {
children.add(new Positioned( if (floatingActionButton != null)
top: toolBarHeight, right: 0.0, bottom: statusBarHeight, left: 0.0, bottomColumnChildren.add(new Padding(
child: new Material( // TODO(eseidel): These change based on device size!
child: body padding: const EdgeDims.only(right: 16.0, bottom: 16.0),
) child: floatingActionButton
)); ));
}
if (statusBar != null) {
children.add(new Positioned(
right: 0.0, bottom: 0.0, left: 0.0,
child: new SizedBox(
height: statusBarHeight,
child: statusBar
)
));
}
if (toolBar != null) { // TODO(jackson): On tablet/desktop, minWidth = 288, maxWidth = 568
children.add(new Positioned( if (snackBar != null) {
top: 0.0, right: 0.0, left: 0.0, bottomColumnChildren.add(new ConstrainedBox(
child: new SizedBox( constraints: const BoxConstraints(maxHeight: kSnackBarHeight),
height: toolBarHeight, child: snackBar
child: toolBar
)
)); ));
} }
if (snackBar != null || floatingActionButton != null) { final List<Widget> stackChildren = <Widget>[toolBarAndBody];
List<Widget> floatingChildren = <Widget>[];
if (floatingActionButton != null) {
floatingChildren.add(new Padding(
// TODO(eseidel): These change based on device size!
padding: const EdgeDims.only(right: 16.0, bottom: 16.0),
child: floatingActionButton
));
}
// TODO(jackson): On tablet/desktop, minWidth = 288, maxWidth = 568
if (snackBar != null) {
floatingChildren.add(new ConstrainedBox(
constraints: const BoxConstraints(maxHeight: kSnackBarHeight),
child: snackBar
));
}
children.add(new Positioned( if (bottomColumnChildren.length > 0) {
right: 0.0, bottom: statusBarHeight, left: 0.0, stackChildren.add(new Positioned(
child: new Column(floatingChildren, alignItems: FlexAlignItems.end) right: 0.0,
left: 0.0,
bottom: 0.0,
child: new Column(bottomColumnChildren, alignItems: FlexAlignItems.end)
)); ));
} }
return new Stack(children); return new Stack(stackChildren);
} }
} }
...@@ -17,6 +17,7 @@ class ToolBar extends StatelessComponent { ...@@ -17,6 +17,7 @@ class ToolBar extends StatelessComponent {
this.left, this.left,
this.center, this.center,
this.right, this.right,
this.bottom,
this.level: 2, this.level: 2,
this.backgroundColor, this.backgroundColor,
this.textTheme this.textTheme
...@@ -25,6 +26,7 @@ class ToolBar extends StatelessComponent { ...@@ -25,6 +26,7 @@ class ToolBar extends StatelessComponent {
final Widget left; final Widget left;
final Widget center; final Widget center;
final List<Widget> right; final List<Widget> right;
final Widget bottom;
final int level; final int level;
final Color backgroundColor; final Color backgroundColor;
final TextTheme textTheme; final TextTheme textTheme;
...@@ -62,6 +64,16 @@ class ToolBar extends StatelessComponent { ...@@ -62,6 +64,16 @@ class ToolBar extends StatelessComponent {
if (right != null) if (right != null)
children.addAll(right); children.addAll(right);
final List<Widget> columnChildren = <Widget>[
new Container(height: kToolBarHeight, child: new Row(children))
];
if (bottom != null)
columnChildren.add(new DefaultTextStyle(
style: centerStyle,
child: new Container(height: kExtendedToolBarHeight - kToolBarHeight, child: bottom)
));
Widget content = new AnimatedContainer( Widget content = new AnimatedContainer(
duration: kThemeChangeDuration, duration: kThemeChangeDuration,
padding: new EdgeDims.symmetric(horizontal: 8.0), padding: new EdgeDims.symmetric(horizontal: 8.0),
...@@ -71,14 +83,7 @@ class ToolBar extends StatelessComponent { ...@@ -71,14 +83,7 @@ class ToolBar extends StatelessComponent {
), ),
child: new DefaultTextStyle( child: new DefaultTextStyle(
style: sideStyle, style: sideStyle,
child: new Column(<Widget>[ child: new IntrinsicHeight(child: new Column(columnChildren))
new Container(
child: new Row(children),
height: kToolBarHeight
),
],
justifyContent: FlexJustifyContent.end
)
) )
); );
......
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