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

Unified Diff: sky/sdk/lib/framework/rendering/flex.dart

Issue 1164363002: Sky support for flexbox justify content (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: merge Created 5 years, 6 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/framework/fn2.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/framework/rendering/flex.dart
diff --git a/sky/sdk/lib/framework/rendering/flex.dart b/sky/sdk/lib/framework/rendering/flex.dart
index 1a0a1f61d1a0760f3a0749ae573f818e02d81366..0f5dc51072fdb697ba9ec82a82b093e8d8a7aaa0 100644
--- a/sky/sdk/lib/framework/rendering/flex.dart
+++ b/sky/sdk/lib/framework/rendering/flex.dart
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'dart:math' as math;
import 'box.dart';
import 'object.dart';
@@ -16,14 +17,22 @@ class FlexBoxParentData extends BoxParentData with ContainerParentDataMixin<Rend
}
enum FlexDirection { horizontal, vertical }
+enum FlexJustifyContent {
+ flexStart,
+ flexEnd,
+ center,
+ spaceBetween,
+ spaceAround,
+}
class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, FlexBoxParentData>,
RenderBoxContainerDefaultsMixin<RenderBox, FlexBoxParentData> {
// lays out RenderBox children using flexible layout
RenderFlex({
- FlexDirection direction: FlexDirection.horizontal
- }) : _direction = direction;
+ FlexDirection direction: FlexDirection.horizontal,
+ FlexJustifyContent justifyContent: FlexJustifyContent.flexStart
+ }) : _direction = direction, _justifyContent = justifyContent;
FlexDirection _direction;
FlexDirection get direction => _direction;
@@ -34,6 +43,15 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
}
}
+ FlexJustifyContent _justifyContent;
+ FlexJustifyContent get justifyContent => _justifyContent;
+ void set justifyContent (FlexJustifyContent value) {
+ if (_justifyContent != value) {
+ _justifyContent = value;
+ markNeedsLayout();
+ }
+ }
+
void setParentData(RenderBox child) {
if (child.parentData is! FlexBoxParentData)
child.parentData = new FlexBoxParentData();
@@ -55,10 +73,12 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
// Based on http://www.w3.org/TR/css-flexbox-1/ Section 9.7 Resolving Flexible Lengths
// Steps 1-3. Determine used flex factor, size inflexible items, calculate free space
int totalFlex = 0;
+ int totalChildren = 0;
assert(constraints != null);
double freeSpace = (_direction == FlexDirection.horizontal) ? constraints.maxWidth : constraints.maxHeight;
RenderBox child = firstChild;
while (child != null) {
+ totalChildren++;
int flex = _getFlex(child);
if (flex > 0) {
totalFlex += child.parentData.flex;
@@ -93,19 +113,54 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
break;
}
child.layout(innerConstraints, parentUsesSize: true);
+ usedSpace += _direction == FlexDirection.horizontal ? child.size.width : child.size.height;
}
+ child = child.parentData.nextSibling;
+ }
+
+ // Section 8.2: Axis Alignment using the justify-content property
+ double remainingSpace = math.max(0.0, freeSpace - usedSpace);
+ double leadingSpace;
+ double betweenSpace;
+ child = firstChild;
+ switch (_justifyContent) {
+ case FlexJustifyContent.flexStart:
+ leadingSpace = 0.0;
+ betweenSpace = 0.0;
+ break;
+ case FlexJustifyContent.flexEnd:
+ leadingSpace = remainingSpace;
+ betweenSpace = 0.0;
+ break;
+ case FlexJustifyContent.center:
+ leadingSpace = remainingSpace / 2.0;
+ betweenSpace = 0.0;
+ break;
+ case FlexJustifyContent.spaceBetween:
+ leadingSpace = 0.0;
+ betweenSpace = totalChildren > 1 ? remainingSpace / (totalChildren - 1) : 0.0;
+ break;
+ case FlexJustifyContent.spaceAround:
+ betweenSpace = totalChildren > 0 ? remainingSpace / totalChildren : 0.0;
+ leadingSpace = betweenSpace / 2.0;
+ break;
+ }
- // For now, center the flex items in the cross direction
+ // Position elements. For now, center the flex items in the cross direction
+ double mainDimPosition = leadingSpace;
+ child = firstChild;
+ while (child != null) {
switch (_direction) {
case FlexDirection.horizontal:
- child.parentData.position = new Point(usedSpace, size.height / 2.0 - child.size.height / 2.0);
- usedSpace += child.size.width;
+ child.parentData.position = new Point(mainDimPosition, size.height / 2.0 - child.size.height / 2.0);
+ mainDimPosition += child.size.width;
break;
case FlexDirection.vertical:
- child.parentData.position = new Point(size.width / 2.0 - child.size.width / 2.0, usedSpace);
- usedSpace += child.size.height;
+ child.parentData.position = new Point(size.width / 2.0 - child.size.width / 2.0, mainDimPosition);
+ mainDimPosition += child.size.height;
break;
}
+ mainDimPosition += betweenSpace;
child = child.parentData.nextSibling;
}
}
« no previous file with comments | « sky/sdk/lib/framework/fn2.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698