Chromium Code Reviews| Index: ui/views/layout/box_layout.h |
| diff --git a/ui/views/layout/box_layout.h b/ui/views/layout/box_layout.h |
| index 9a87984d51f77cec0caa488860fa6dc1986f9e28..b502ce6907bb031864101d20d50f1ffac6857841 100644 |
| --- a/ui/views/layout/box_layout.h |
| +++ b/ui/views/layout/box_layout.h |
| @@ -63,6 +63,14 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager { |
| int inside_border_horizontal_spacing, |
| int inside_border_vertical_spacing, |
| int between_child_spacing); |
| + // As above but with added |collapse_margins_spacing| paramter which controls |
| + // whether or not spacing adjacent to view margins are collapsed base on the |
| + // max of the two values. |
| + BoxLayout(Orientation orientation, |
| + int inside_border_horizontal_spacing, |
| + int inside_border_vertical_spacing, |
| + int between_child_spacing, |
| + bool collapse_margins_spacing); |
|
sky
2017/05/09 19:26:03
Merge this with other constructor and make collaps
kylix_rd
2017/05/09 20:07:06
I'm wondering if the default should be "true". It
sky
2017/05/09 23:55:29
I think existing consumers should have to opt into
kylix_rd
2017/05/10 15:30:37
Done.
|
| ~BoxLayout() override; |
| void set_main_axis_alignment(MainAxisAlignment main_axis_alignment) { |
| @@ -105,6 +113,37 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager { |
| int GetPreferredHeightForWidth(const View* host, int width) const override; |
| private: |
| + // This struct is used internally to "wrap" a child view in order to obviate |
|
sky
2017/05/09 19:26:03
Thanks for the detailed comments!
|
| + // the need for the main layout logic to be fully aware of the per-view |
| + // margins when |collapse_margin_spacing_| is false. Since each view is a |
| + // rectangle of a certain size, this wrapper, coupled with any margins set |
| + // will increase the apparent size of the view. All necessary view size/ |
| + // position methods required for the layout logic add or subtract the margins |
| + // where appropriate to ensure the actual visible size of the view doesn't |
| + // include the margins. |
| + // When |collapse_margin_spacing_| is true, this wrapper provides quick access |
| + // to the view's margins for use by the layout to collapse adjacent spacing |
| + // to the largest of the several values. |
| + struct ViewWrapper { |
|
sky
2017/05/09 19:26:03
Style guide says, "Use a struct only for passive o
kylix_rd
2017/05/09 20:07:06
Sure thing.
This comes from my notion that "class
kylix_rd
2017/05/10 15:30:37
Done.
|
| + ViewWrapper(); |
| + ViewWrapper(const BoxLayout* layout, View* view); |
| + ViewWrapper(const ViewWrapper& wrapper) = delete; |
| + ~ViewWrapper(); |
| + int GetHeightForWidth(int width) const; |
| + const gfx::Insets& margins() const { return margins_; } |
| + gfx::Size GetPreferredSize() const; |
| + void SetBoundsRect(const gfx::Rect& bounds); |
| + View* view() const { return view_; } |
| + bool visible() const; |
| + |
| + private: |
| + View* view_; |
| + const BoxLayout* layout_; |
| + gfx::Insets margins_; |
| + }; |
| + |
| + using FlexMap = std::map<const View*, int>; |
| + |
| // Returns the flex for the specified |view|. |
| int GetFlexForView(const View* view) const; |
| @@ -126,10 +165,28 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager { |
| // Returns the main axis size for the given view. |child_area_width| is needed |
| // to calculate the height of the view when the orientation is vertical. |
| - int MainAxisSizeForView(const View* view, int child_area_width) const; |
| + int MainAxisSizeForView(const ViewWrapper& view, int child_area_width) const; |
| + |
| + // Returns the main axis margin spacing between the two views which is the max |
| + // of the right margin from the |left| view, the left margin of the |right| |
| + // view and |between_child_spacing_|. |
| + int MainAxisMarginBetweenViews(const ViewWrapper& left, |
| + const ViewWrapper& right) const; |
| + |
| + // Adjusts the main axis for |rect| by optionally collapsing the |
| + // left or top margin of the first view with corresponding side of |
| + // |inside_border_insets_| and the right or bottom margin of the last view |
| + // with the corresponding side of |inside_border_insets_|. |
| + void AdjustMainAxisForMargin(gfx::Rect* rect) const; |
| + |
| + // Adjust the cross axis of |rect| by optionally collapsing the closest margin |
| + // of |control| with the corresponding side of |inside_border_insets_| |
| + void AdjustCrossAxisForMargin(const ViewWrapper& child, |
| + const gfx::Rect& client, |
| + gfx::Rect* rect) const; |
| // Returns the cross axis size for the given view. |
| - int CrossAxisSizeForView(const View* view) const; |
| + int CrossAxisSizeForView(const ViewWrapper& view) const; |
| // The preferred size for the dialog given the width of the child area. |
| gfx::Size GetPreferredSizeForChildWidth(const View* host, |
| @@ -139,6 +196,16 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager { |
| // child views. |
| gfx::Size NonChildSize(const View* host) const; |
| + // The next visible view at > index. If no other views are visible, return |
| + // nullptr. |
| + View* NextVisibleView(View* host, int index) const; |
| + |
| + // Return the first visible view in the host or nullptr if none are visible. |
| + View* FirstVisibleView(View* host) const; |
| + |
| + // Return the last visible view in the host or nullptr if none are visible. |
| + View* LastVisibleView(View* host) const; |
| + |
| const Orientation orientation_; |
| // Spacing between child views and host view border. |
| @@ -156,7 +223,7 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager { |
| CrossAxisAlignment cross_axis_alignment_; |
| // A map of views to their flex weights. |
| - std::map<const View*, int> flex_map_; |
| + FlexMap flex_map_; |
| // The flex weight for views if none is set. Defaults to 0. |
| int default_flex_; |
| @@ -164,6 +231,9 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager { |
| // The minimum cross axis size for the layout. |
| int minimum_cross_axis_size_; |
| + // Adjacent view margins and spacing should be collapsed. |
| + bool collapse_margins_spacing_; |
|
sky
2017/05/09 19:26:03
const
kylix_rd
2017/05/10 15:30:37
Done.
|
| + |
| // The view that this BoxLayout is managing the layout for. |
| views::View* host_; |