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

Unified Diff: ui/views/layout/box_layout.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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 | « ui/views/layout/box_layout.h ('k') | ui/views/layout/box_layout_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/layout/box_layout.cc
diff --git a/ui/views/layout/box_layout.cc b/ui/views/layout/box_layout.cc
deleted file mode 100644
index 4864dd62f66c52830f9098d9acc70e045e5744d6..0000000000000000000000000000000000000000
--- a/ui/views/layout/box_layout.cc
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/layout/box_layout.h"
-
-#include "ui/gfx/rect.h"
-#include "ui/views/view.h"
-
-namespace views {
-
-BoxLayout::BoxLayout(BoxLayout::Orientation orientation,
- int inside_border_horizontal_spacing,
- int inside_border_vertical_spacing,
- int between_child_spacing)
- : orientation_(orientation),
- inside_border_insets_(inside_border_vertical_spacing,
- inside_border_horizontal_spacing,
- inside_border_vertical_spacing,
- inside_border_horizontal_spacing),
- between_child_spacing_(between_child_spacing),
- main_axis_alignment_(MAIN_AXIS_ALIGNMENT_START),
- cross_axis_alignment_(CROSS_AXIS_ALIGNMENT_STRETCH),
- default_flex_(0),
- minimum_cross_axis_size_(0),
- host_(NULL) {
-}
-
-BoxLayout::~BoxLayout() {
-}
-
-void BoxLayout::SetFlexForView(const View* view, int flex_weight) {
- DCHECK(host_);
- DCHECK(view);
- DCHECK_EQ(host_, view->parent());
- DCHECK_GE(flex_weight, 0);
- flex_map_[view] = flex_weight;
-}
-
-void BoxLayout::ClearFlexForView(const View* view) {
- DCHECK(view);
- flex_map_.erase(view);
-}
-
-void BoxLayout::SetDefaultFlex(int default_flex) {
- DCHECK_GE(default_flex, 0);
- default_flex_ = default_flex;
-}
-
-void BoxLayout::Layout(View* host) {
- DCHECK_EQ(host_, host);
- gfx::Rect child_area(host->GetLocalBounds());
- child_area.Inset(host->GetInsets());
- child_area.Inset(inside_border_insets_);
-
- int total_main_axis_size = 0;
- int num_visible = 0;
- int flex_sum = 0;
- // Calculate the total size of children in the main axis.
- for (int i = 0; i < host->child_count(); ++i) {
- View* child = host->child_at(i);
- if (!child->visible())
- continue;
- total_main_axis_size +=
- MainAxisSizeForView(child, child_area.width()) + between_child_spacing_;
- ++num_visible;
- flex_sum += GetFlexForView(child);
- }
-
- if (!num_visible)
- return;
-
- total_main_axis_size -= between_child_spacing_;
- // Free space can be negative indicating that the views want to overflow.
- int main_free_space = MainAxisSize(child_area) - total_main_axis_size;
- {
- int position = MainAxisPosition(child_area);
- int size = MainAxisSize(child_area);
- if (!flex_sum) {
- switch (main_axis_alignment_) {
- case MAIN_AXIS_ALIGNMENT_START:
- break;
- case MAIN_AXIS_ALIGNMENT_CENTER:
- position += main_free_space / 2;
- size = total_main_axis_size;
- break;
- case MAIN_AXIS_ALIGNMENT_END:
- position += main_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 main_position = MainAxisPosition(child_area);
- int total_padding = 0;
- int current_flex = 0;
- for (int i = 0; i < host->child_count(); ++i) {
- View* child = host->child_at(i);
- if (!child->visible())
- continue;
-
- // Calculate cross axis size.
- gfx::Rect bounds(child_area);
- SetMainAxisPosition(main_position, &bounds);
- if (cross_axis_alignment_ != CROSS_AXIS_ALIGNMENT_STRETCH) {
- int free_space = CrossAxisSize(bounds) - CrossAxisSizeForView(child);
- int position = CrossAxisPosition(bounds);
- if (cross_axis_alignment_ == CROSS_AXIS_ALIGNMENT_CENTER) {
- position += free_space / 2;
- } else if (cross_axis_alignment_ == CROSS_AXIS_ALIGNMENT_END) {
- position += free_space;
- }
- SetCrossAxisPosition(position, &bounds);
- SetCrossAxisSize(CrossAxisSizeForView(child), &bounds);
- }
-
- // Calculate flex padding.
- int current_padding = 0;
- if (GetFlexForView(child) > 0) {
- current_flex += GetFlexForView(child);
- int quot = (main_free_space * current_flex) / flex_sum;
- int rem = (main_free_space * current_flex) % flex_sum;
- current_padding = quot - total_padding;
- // Use the current remainder to round to the nearest pixel.
- if (std::abs(rem) * 2 >= flex_sum)
- current_padding += main_free_space > 0 ? 1 : -1;
- total_padding += current_padding;
- }
-
- // Set main axis size.
- int child_main_axis_size = MainAxisSizeForView(child, child_area.width());
- SetMainAxisSize(child_main_axis_size + current_padding, &bounds);
- if (MainAxisSize(bounds) > 0 || GetFlexForView(child) > 0)
- main_position += MainAxisSize(bounds) + between_child_spacing_;
-
- // Clamp child view bounds to |child_area|.
- bounds.Intersect(child_area);
- child->SetBoundsRect(bounds);
- }
-
- // Flex views should have grown/shrunk to consume all free space.
- if (flex_sum)
- DCHECK_EQ(total_padding, main_free_space);
-}
-
-gfx::Size BoxLayout::GetPreferredSize(const View* host) const {
- DCHECK_EQ(host_, host);
- // Calculate the child views' preferred width.
- int width = 0;
- if (orientation_ == kVertical) {
- for (int i = 0; i < host->child_count(); ++i) {
- const View* child = host->child_at(i);
- if (!child->visible())
- continue;
-
- width = std::max(width, child->GetPreferredSize().width());
- }
- width = std::max(width, minimum_cross_axis_size_);
- }
-
- return GetPreferredSizeForChildWidth(host, width);
-}
-
-int BoxLayout::GetPreferredHeightForWidth(const View* host, int width) const {
- DCHECK_EQ(host_, host);
- int child_width = width - NonChildSize(host).width();
- return GetPreferredSizeForChildWidth(host, child_width).height();
-}
-
-void BoxLayout::Installed(View* host) {
- DCHECK(!host_);
- host_ = host;
-}
-
-void BoxLayout::Uninstalled(View* host) {
- DCHECK_EQ(host_, host);
- host_ = NULL;
- flex_map_.clear();
-}
-
-void BoxLayout::ViewRemoved(View* host, View* view) {
- ClearFlexForView(view);
-}
-
-int BoxLayout::GetFlexForView(const View* view) const {
- std::map<const View*, int>::const_iterator it = flex_map_.find(view);
- if (it == flex_map_.end())
- return default_flex_;
-
- return it->second;
-}
-
-int BoxLayout::MainAxisSize(const gfx::Rect& rect) const {
- return orientation_ == kHorizontal ? rect.width() : rect.height();
-}
-
-int BoxLayout::MainAxisPosition(const gfx::Rect& rect) const {
- return orientation_ == kHorizontal ? rect.x() : rect.y();
-}
-
-void BoxLayout::SetMainAxisSize(int size, gfx::Rect* rect) const {
- if (orientation_ == kHorizontal)
- rect->set_width(size);
- else
- rect->set_height(size);
-}
-
-void BoxLayout::SetMainAxisPosition(int position, gfx::Rect* rect) const {
- if (orientation_ == kHorizontal)
- rect->set_x(position);
- else
- rect->set_y(position);
-}
-
-int BoxLayout::CrossAxisSize(const gfx::Rect& rect) const {
- return orientation_ == kVertical ? rect.width() : rect.height();
-}
-
-int BoxLayout::CrossAxisPosition(const gfx::Rect& rect) const {
- return orientation_ == kVertical ? rect.x() : rect.y();
-}
-
-void BoxLayout::SetCrossAxisSize(int size, gfx::Rect* rect) const {
- if (orientation_ == kVertical)
- rect->set_width(size);
- else
- rect->set_height(size);
-}
-
-void BoxLayout::SetCrossAxisPosition(int position, gfx::Rect* rect) const {
- if (orientation_ == kVertical)
- rect->set_x(position);
- else
- rect->set_y(position);
-}
-
-int BoxLayout::MainAxisSizeForView(const View* view,
- int child_area_width) const {
- return orientation_ == kHorizontal
- ? view->GetPreferredSize().width()
- : view->GetHeightForWidth(cross_axis_alignment_ ==
- CROSS_AXIS_ALIGNMENT_STRETCH
- ? child_area_width
- : view->GetPreferredSize().width());
-}
-
-int BoxLayout::CrossAxisSizeForView(const View* view) const {
- return orientation_ == kVertical
- ? view->GetPreferredSize().width()
- : view->GetHeightForWidth(view->GetPreferredSize().width());
-}
-
-gfx::Size BoxLayout::GetPreferredSizeForChildWidth(const View* host,
- int child_area_width) const {
- gfx::Rect child_area_bounds;
-
- if (orientation_ == kHorizontal) {
- // Horizontal layouts ignore |child_area_width|, meaning they mimic the
- // default behavior of GridLayout::GetPreferredHeightForWidth().
- // TODO(estade): fix this if it ever becomes a problem.
- int position = 0;
- for (int i = 0; i < host->child_count(); ++i) {
- const View* child = host->child_at(i);
- if (!child->visible())
- continue;
-
- gfx::Size size(child->GetPreferredSize());
- if (size.IsEmpty())
- continue;
-
- gfx::Rect child_bounds(position, 0, size.width(), size.height());
- child_area_bounds.Union(child_bounds);
- position += size.width() + between_child_spacing_;
- }
- child_area_bounds.set_height(
- std::max(child_area_bounds.height(), minimum_cross_axis_size_));
- } else {
- int height = 0;
- for (int i = 0; i < host->child_count(); ++i) {
- const View* child = host->child_at(i);
- if (!child->visible())
- continue;
-
- // Use the child area width for getting the height if the child is
- // supposed to stretch. Use its preferred size otherwise.
- int extra_height = MainAxisSizeForView(child, child_area_width);
- // Only add |between_child_spacing_| if this is not the only child.
- if (height != 0 && extra_height > 0)
- height += between_child_spacing_;
- height += extra_height;
- }
-
- child_area_bounds.set_width(child_area_width);
- child_area_bounds.set_height(height);
- }
-
- gfx::Size non_child_size = NonChildSize(host);
- return gfx::Size(child_area_bounds.width() + non_child_size.width(),
- child_area_bounds.height() + non_child_size.height());
-}
-
-gfx::Size BoxLayout::NonChildSize(const View* host) const {
- gfx::Insets insets(host->GetInsets());
- return gfx::Size(insets.width() + inside_border_insets_.width(),
- insets.height() + inside_border_insets_.height());
-}
-
-} // namespace views
« no previous file with comments | « ui/views/layout/box_layout.h ('k') | ui/views/layout/box_layout_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698