// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_VIEWS_LAYOUT_TABLE_LAYOUT_H_ #define UI_VIEWS_LAYOUT_TABLE_LAYOUT_H_ #include <memory> #include <optional> #include <vector> #include "base/memory/raw_ptr.h" #include "ui/gfx/geometry/size.h" #include "ui/views/layout/layout_manager_base.h" #include "ui/views/layout/layout_types.h" namespace views { // TableLayout is a LayoutManager that positions child views in a table. You // define the structure of the table independently of adding child views. // The following creates a trivial table with two columns separated by a column // with padding, and two rows: // // layout->AddColumn(LayoutAlignment::kStretch, // Views are horizontally // // resized to fill column. // LayoutAlignment::kStretch, // Views starting in this // // column are vertically // // resized. // 1.0f, // This column has a resize // // weight of 1. // ColumnSize::kUsePreferred, // Use the preferred size of // // the view. // 0, // Ignored for kUsePreferred. // 0); // A minimum width of 0. // layout->AddPaddingColumn(kFixedSize, // The padding column is not // // resizable. // 10); // And has a width of 10 DIP. // layout->AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kStretch, // kFixedSize, ColumnSize::kUsePreferred, 0, 0); // layout->AddRows(2, kFixedSize); // These rows aren't // // vertically resizable. // // Now (or before setting up the table, either way works), add the views: // // host->AddChildView(v1); // Will go in the first column, first row. // host->AddChildView(v2); // Will go in the last column, first row. // host->AddChildView(v3); // Will go in the first column, second row. // host->AddChildView(v4); // Will go in the last column, second row. // // Notice you need not skip over padding columns, that's done for you. // // When adding a column you give it the default alignment for all views // originating in that column. You can override this for specific views by // setting a class property on them. For example, the following forces a view to // have a horizontal and vertical alignment of leading regardless of that // defined for the column: // // view->SetProperty(kTableHorizAlignKey, LayoutAlignment::kStart); // view->SetProperty(kTableVertAlignKey, LayoutAlignment::kStart); // // If the view using TableLayout is given a size bigger than the preferred, // columns and rows with a resize percent > 0 are resized. Each column/row is // given (resize / total_resize * delta) extra DIPs. Only views with an // alignment of LayoutAlignment::kStretch are given extra space, others are // aligned in the provided space. // // TableLayout allows you to force columns to have the same width. This is done // using LinkColumnSizes(). // // If the host view is sized smaller than the preferred width, TableLayout may // use the minimum size. The minimum size is considered only for views whose // preferred width was not explicitly specified and where the containing columns // are resizable (resize > 0) and don't have a fixed width. class VIEWS_EXPORT TableLayout : public LayoutManagerBase { … }; } // namespace views #endif // UI_VIEWS_LAYOUT_TABLE_LAYOUT_H_