gfx::Size BoxLayout::GetPreferredSize(View* host) { gfx::Rect bounds; int position = 0; for(int i=0; i<host->GetChildViewCount(); ++i) { View* child = host->GetChildViewAt(i); if(child->IsVisible()) { gfx::Size size(child->GetPreferredSize()); if(orientation_ == kHorizontal) { gfx::Rect child_bounds(position, 0, size.width(), size.height()); bounds = bounds.Union(child_bounds); position += size.width(); } else { gfx::Rect child_bounds(0, position, size.width(), size.height()); bounds = bounds.Union(child_bounds); position += size.height(); } position += between_child_spacing_; } } gfx::Insets insets(host->GetInsets()); return gfx::Size( bounds.width()+insets.width()+2*inside_border_horizontal_spacing_, bounds.height()+insets.height()+2*inside_border_vertical_spacing_); }
gfx::Size SingleSplitView::GetPreferredSize() { int width = 0; int height = 0; for(int i=0; i<2&&i<GetChildViewCount(); ++i) { View* view = GetChildViewAt(i); gfx::Size pref = view->GetPreferredSize(); if(is_horizontal_) { width += pref.width(); height = std::max(height, pref.height()); } else { width = std::max(width, pref.width()); height += pref.height(); } } if(is_horizontal_) { width += kDividerSize; } else { height += kDividerSize; } return gfx::Size(width, height); }
void BoxLayout::Layout(View* host) { gfx::Rect childArea(gfx::Rect(host->size())); childArea.Inset(host->GetInsets()); childArea.Inset(inside_border_horizontal_spacing_, inside_border_vertical_spacing_); int x = childArea.x(); int y = childArea.y(); for(int i=0; i<host->GetChildViewCount(); ++i) { View* child = host->GetChildViewAt(i); if(child->IsVisible()) { gfx::Rect bounds(x, y, childArea.width(), childArea.height()); gfx::Size size(child->GetPreferredSize()); if(orientation_ == kHorizontal) { bounds.set_width(size.width()); x += size.width() + between_child_spacing_; } else { bounds.set_height(size.height()); y += size.height() + between_child_spacing_; } // Clamp child view bounds to |childArea|. child->SetBounds(bounds.Intersect(childArea)); } } }
virtual gfx::Size GetPreferredSize(View* host) { // First, query the preferred sizes to determine a good width. int width = 0; for(int i=0; i<host->child_count(); ++i) { View* page = host->child_at(i); width = std::max(width, page->GetPreferredSize().width()); } // After we know the width, decide on the height. return gfx::Size(width, GetPreferredHeightForWidth(host, width)); }