Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Unified Diff: sky/sdk/lib/widgets/scaffold.dart

Issue 1216613004: Initial implementation of SnackBar (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: abarth cr feedback Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/sdk/lib/rendering/box.dart ('k') | sky/sdk/lib/widgets/snack_bar.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/widgets/scaffold.dart
diff --git a/sky/sdk/lib/widgets/scaffold.dart b/sky/sdk/lib/widgets/scaffold.dart
index 3151241f261658ae1dc147a5fd6d2b2b4b26fe7a..e85aaa83a1e7b644d5663555318f1df4fd84cf86 100644
--- a/sky/sdk/lib/widgets/scaffold.dart
+++ b/sky/sdk/lib/widgets/scaffold.dart
@@ -7,28 +7,32 @@ import '../rendering/object.dart';
import '../theme/view_configuration.dart';
import 'widget.dart';
+// Slots are painted in this order and hit tested in reverse of this order
enum ScaffoldSlots {
- toolbar,
body,
statusBar,
- drawer,
- floatingActionButton
+ toolbar,
+ snackBar,
+ floatingActionButton,
+ drawer
}
class RenderScaffold extends RenderBox {
RenderScaffold({
- RenderBox toolbar,
RenderBox body,
RenderBox statusBar,
- RenderBox drawer,
- RenderBox floatingActionButton
+ RenderBox toolbar,
+ RenderBox snackBar,
+ RenderBox floatingActionButton,
+ RenderBox drawer
}) {
- this[ScaffoldSlots.toolbar] = toolbar;
this[ScaffoldSlots.body] = body;
this[ScaffoldSlots.statusBar] = statusBar;
- this[ScaffoldSlots.drawer] = drawer;
+ this[ScaffoldSlots.toolbar] = toolbar;
+ this[ScaffoldSlots.snackBar] = snackBar;
this[ScaffoldSlots.floatingActionButton] = floatingActionButton;
+ this[ScaffoldSlots.drawer] = drawer;
}
Map<ScaffoldSlots, RenderBox> _slots = new Map<ScaffoldSlots, RenderBox>();
@@ -89,6 +93,13 @@ class RenderScaffold extends RenderBox {
void performLayout() {
double bodyHeight = size.height;
double bodyPosition = 0.0;
+ if (_slots[ScaffoldSlots.statusBar] != null) {
+ RenderBox statusBar = _slots[ScaffoldSlots.statusBar];
+ statusBar.layout(new BoxConstraints.tight(new Size(size.width, kStatusBarHeight)));
+ assert(statusBar.parentData is BoxParentData);
+ statusBar.parentData.position = new Point(0.0, size.height - kStatusBarHeight);
+ bodyHeight -= kStatusBarHeight;
+ }
if (_slots[ScaffoldSlots.toolbar] != null) {
RenderBox toolbar = _slots[ScaffoldSlots.toolbar];
double toolbarHeight = kToolBarHeight + kNotificationAreaHeight;
@@ -98,36 +109,39 @@ class RenderScaffold extends RenderBox {
bodyPosition += toolbarHeight;
bodyHeight -= toolbarHeight;
}
- if (_slots[ScaffoldSlots.statusBar] != null) {
- RenderBox statusBar = _slots[ScaffoldSlots.statusBar];
- statusBar.layout(new BoxConstraints.tight(new Size(size.width, kStatusBarHeight)));
- assert(statusBar.parentData is BoxParentData);
- statusBar.parentData.position = new Point(0.0, size.height - kStatusBarHeight);
- bodyHeight -= kStatusBarHeight;
- }
if (_slots[ScaffoldSlots.body] != null) {
RenderBox body = _slots[ScaffoldSlots.body];
body.layout(new BoxConstraints.tight(new Size(size.width, bodyHeight)));
assert(body.parentData is BoxParentData);
body.parentData.position = new Point(0.0, bodyPosition);
}
- if (_slots[ScaffoldSlots.drawer] != null) {
- RenderBox drawer = _slots[ScaffoldSlots.drawer];
- drawer.layout(new BoxConstraints(minWidth: 0.0, maxWidth: size.width, minHeight: size.height, maxHeight: size.height));
- assert(drawer.parentData is BoxParentData);
- drawer.parentData.position = Point.origin;
+ double snackBarHeight = 0.0;
+ if (_slots[ScaffoldSlots.snackBar] != null) {
+ RenderBox snackBar = _slots[ScaffoldSlots.snackBar];
+ // TODO(jackson): On tablet/desktop, minWidth = 288, maxWidth = 568
+ snackBar.layout(new BoxConstraints(minWidth: size.width, maxWidth: size.width, minHeight: 0.0, maxHeight: size.height),
+ parentUsesSize: true);
+ assert(snackBar.parentData is BoxParentData);
+ snackBar.parentData.position = new Point(0.0, size.height - snackBar.size.height);
+ snackBarHeight = snackBar.size.height;
}
if (_slots[ScaffoldSlots.floatingActionButton] != null) {
RenderBox floatingActionButton = _slots[ScaffoldSlots.floatingActionButton];
- Size area = new Size(size.width - kButtonX, size.height - kButtonY);
+ Size area = new Size(size.width - kButtonX, size.height - kButtonY - snackBarHeight);
floatingActionButton.layout(new BoxConstraints.loose(area), parentUsesSize: true);
assert(floatingActionButton.parentData is BoxParentData);
floatingActionButton.parentData.position = (area - floatingActionButton.size).toPoint();
}
+ if (_slots[ScaffoldSlots.drawer] != null) {
+ RenderBox drawer = _slots[ScaffoldSlots.drawer];
+ drawer.layout(new BoxConstraints(minWidth: 0.0, maxWidth: size.width, minHeight: size.height, maxHeight: size.height));
+ assert(drawer.parentData is BoxParentData);
+ drawer.parentData.position = Point.origin;
+ }
}
void paint(PaintingCanvas canvas, Offset offset) {
- for (ScaffoldSlots slot in [ScaffoldSlots.body, ScaffoldSlots.statusBar, ScaffoldSlots.toolbar, ScaffoldSlots.floatingActionButton, ScaffoldSlots.drawer]) {
+ for (ScaffoldSlots slot in ScaffoldSlots.values) {
RenderBox box = _slots[slot];
if (box != null) {
assert(box.parentData is BoxParentData);
@@ -137,7 +151,7 @@ class RenderScaffold extends RenderBox {
}
void hitTestChildren(HitTestResult result, { Point position }) {
- for (ScaffoldSlots slot in [ScaffoldSlots.drawer, ScaffoldSlots.floatingActionButton, ScaffoldSlots.toolbar, ScaffoldSlots.statusBar, ScaffoldSlots.body]) {
+ for (ScaffoldSlots slot in ScaffoldSlots.values.reversed) {
RenderBox box = _slots[slot];
if (box != null) {
assert(box.parentData is BoxParentData);
@@ -156,44 +170,38 @@ class RenderScaffold extends RenderBox {
class Scaffold extends RenderObjectWrapper {
- // static final Style _style = new Style('''
- // ${typography.typeface};
- // ${typography.black.body1};''');
-
Scaffold({
String key,
- Widget toolbar,
Widget body,
Widget statusBar,
- Widget drawer,
- Widget floatingActionButton
- }) : _toolbar = toolbar,
- _body = body,
- _statusBar = statusBar,
- _drawer = drawer,
- _floatingActionButton = floatingActionButton,
- super(key: key);
-
- Widget _toolbar;
- Widget _body;
- Widget _statusBar;
- Widget _drawer;
- Widget _floatingActionButton;
+ Widget toolbar,
+ Widget snackBar,
+ Widget floatingActionButton,
+ Widget drawer
+ }) : super(key: key) {
+ this[ScaffoldSlots.body] = body;
+ this[ScaffoldSlots.statusBar] = statusBar;
+ this[ScaffoldSlots.toolbar] = toolbar;
+ this[ScaffoldSlots.snackBar] = snackBar;
+ this[ScaffoldSlots.floatingActionButton] = floatingActionButton;
+ this[ScaffoldSlots.drawer] = drawer;
+ }
+
+ Map<ScaffoldSlots, Widget> _slots = new Map<ScaffoldSlots, Widget>();
+ Widget operator[] (ScaffoldSlots slot) => _slots[slot];
+ void operator[]= (ScaffoldSlots slot, Widget value) {
+ _slots[slot] = value;
+ }
RenderScaffold get root => super.root;
RenderScaffold createNode() => new RenderScaffold();
void walkChildren(WidgetTreeWalker walker) {
- if (_toolbar != null)
- walker(_toolbar);
- if (_body != null)
- walker(_body);
- if (_statusBar != null)
- walker(_statusBar);
- if (_drawer != null)
- walker(_drawer);
- if (_floatingActionButton != null)
- walker(_floatingActionButton);
+ for (ScaffoldSlots slot in ScaffoldSlots.values) {
+ Widget widget = _slots[slot];
+ if (widget != null)
+ walker(widget);
+ }
}
void insertChildRoot(RenderObjectWrapper child, ScaffoldSlots slot) {
@@ -215,11 +223,10 @@ class Scaffold extends RenderObjectWrapper {
void syncRenderObject(Widget old) {
super.syncRenderObject(old);
- _toolbar = syncChild(_toolbar, old is Scaffold ? old._toolbar : null, ScaffoldSlots.toolbar);
- _body = syncChild(_body, old is Scaffold ? old._body : null, ScaffoldSlots.body);
- _statusBar = syncChild(_statusBar, old is Scaffold ? old._statusBar : null, ScaffoldSlots.statusBar);
- _drawer = syncChild(_drawer, old is Scaffold ? old._drawer : null, ScaffoldSlots.drawer);
- _floatingActionButton = syncChild(_floatingActionButton, old is Scaffold ? old._floatingActionButton : null, ScaffoldSlots.floatingActionButton);
+ for (ScaffoldSlots slot in ScaffoldSlots.values) {
+ Widget widget = this[slot];
+ this[slot] = syncChild(widget, old is Scaffold ? old[slot] : null, slot);
+ }
}
}
« no previous file with comments | « sky/sdk/lib/rendering/box.dart ('k') | sky/sdk/lib/widgets/snack_bar.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698