Index: ui/views/layout/box_layout.cc |
diff --git a/ui/views/layout/box_layout.cc b/ui/views/layout/box_layout.cc |
index c11479678a998fe492103648b145b3e4911d81d2..ae44a0812a6d46e6f78b8bc3c7af5c3cf9ec9ca5 100644 |
--- a/ui/views/layout/box_layout.cc |
+++ b/ui/views/layout/box_layout.cc |
@@ -19,7 +19,7 @@ BoxLayout::BoxLayout(BoxLayout::Orientation orientation, |
inside_border_vertical_spacing, |
inside_border_horizontal_spacing), |
between_child_spacing_(between_child_spacing), |
- spread_blank_space_(false) { |
+ main_axis_alignment_(MAIN_AXIS_ALIGNMENT_START) { |
} |
BoxLayout::~BoxLayout() { |
@@ -29,38 +29,55 @@ void BoxLayout::Layout(View* host) { |
gfx::Rect child_area(host->GetLocalBounds()); |
child_area.Inset(host->GetInsets()); |
child_area.Inset(inside_border_insets_); |
- int x = child_area.x(); |
- int y = child_area.y(); |
int padding = 0; |
- if (spread_blank_space_) { |
- int total = 0; |
- int visible = 0; |
+ if (main_axis_alignment_ != MAIN_AXIS_ALIGNMENT_START) { |
+ int total_main_axis_size = 0; |
+ int num_visible = 0; |
for (int i = 0; i < host->child_count(); ++i) { |
View* child = host->child_at(i); |
if (!child->visible()) |
continue; |
if (orientation_ == kHorizontal) { |
- total += child->GetPreferredSize().width() + between_child_spacing_; |
+ total_main_axis_size += |
+ child->GetPreferredSize().width() + between_child_spacing_; |
} else { |
- total += child->GetHeightForWidth(child_area.width()) + |
- between_child_spacing_; |
+ total_main_axis_size += child->GetHeightForWidth(child_area.width()) + |
+ between_child_spacing_; |
} |
- ++visible; |
+ ++num_visible; |
} |
- if (visible) { |
- total -= between_child_spacing_; |
- if (orientation_ == kHorizontal) |
- padding = (child_area.width() - total) / visible; |
- else |
- padding = (child_area.height() - total) / visible; |
- |
- if (padding < 0) |
- padding = 0; |
+ if (num_visible) { |
+ total_main_axis_size -= between_child_spacing_; |
+ int free_space = MainAxisSize(child_area) - total_main_axis_size; |
+ int position = MainAxisPosition(child_area); |
+ int size = MainAxisSize(child_area); |
+ switch (main_axis_alignment_) { |
+ case MAIN_AXIS_ALIGNMENT_FILL: |
+ padding = std::max(free_space / num_visible, 0); |
+ break; |
+ case MAIN_AXIS_ALIGNMENT_CENTER: |
+ position += free_space / 2; |
+ size = total_main_axis_size; |
+ break; |
+ case MAIN_AXIS_ALIGNMENT_END: |
+ position += free_space; |
+ size = total_main_axis_size; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ gfx::Rect new_child_area(child_area); |
+ SetMainAxisPosition(position, &new_child_area); |
+ SetMainAxisSize(size, &new_child_area); |
+ child_area.Intersect(new_child_area); |
} |
} |
+ int x = child_area.x(); |
+ int y = child_area.y(); |
for (int i = 0; i < host->child_count(); ++i) { |
View* child = host->child_at(i); |
if (child->visible()) { |
@@ -102,6 +119,28 @@ int BoxLayout::GetPreferredHeightForWidth(View* host, int width) { |
return GetPreferredSizeForChildWidth(host, child_width).height(); |
} |
+int BoxLayout::MainAxisSize(const gfx::Rect& child_area) const { |
+ return orientation_ == kHorizontal ? child_area.width() : child_area.height(); |
+} |
+ |
+int BoxLayout::MainAxisPosition(const gfx::Rect& child_area) const { |
+ return orientation_ == kHorizontal ? child_area.x() : child_area.y(); |
+} |
+ |
+void BoxLayout::SetMainAxisSize(int size, gfx::Rect* child_area) const { |
+ if (orientation_ == kHorizontal) |
+ child_area->set_width(size); |
+ else |
+ child_area->set_height(size); |
+} |
+ |
+void BoxLayout::SetMainAxisPosition(int position, gfx::Rect* child_area) const { |
+ if (orientation_ == kHorizontal) |
+ child_area->set_x(position); |
+ else |
+ child_area->set_y(position); |
+} |
+ |
gfx::Size BoxLayout::GetPreferredSizeForChildWidth(View* host, |
int child_area_width) { |
gfx::Rect child_area_bounds; |