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

Side by Side Diff: ui/views/layout/box_layout.h

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 unified diff | Download patch
« no previous file with comments | « ui/views/ime/null_input_method.cc ('k') | ui/views/layout/box_layout.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef UI_VIEWS_LAYOUT_BOX_LAYOUT_H_
6 #define UI_VIEWS_LAYOUT_BOX_LAYOUT_H_
7
8 #include <map>
9
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "ui/gfx/insets.h"
13 #include "ui/views/layout/layout_manager.h"
14
15 namespace gfx {
16 class Rect;
17 class Size;
18 }
19
20 namespace views {
21
22 class View;
23
24 // A Layout manager that arranges child views vertically or horizontally in a
25 // side-by-side fashion with spacing around and between the child views. The
26 // child views are always sized according to their preferred size. If the
27 // host's bounds provide insufficient space, child views will be clamped.
28 // Excess space will not be distributed.
29 class VIEWS_EXPORT BoxLayout : public LayoutManager {
30 public:
31 enum Orientation {
32 kHorizontal,
33 kVertical,
34 };
35
36 // This specifies where along the main axis the children should be laid out.
37 // e.g. a horizontal layout of MAIN_AXIS_ALIGNMENT_END will result in the
38 // child views being right-aligned.
39 enum MainAxisAlignment {
40 MAIN_AXIS_ALIGNMENT_START,
41 MAIN_AXIS_ALIGNMENT_CENTER,
42 MAIN_AXIS_ALIGNMENT_END,
43 // TODO(calamity): Add MAIN_AXIS_ALIGNMENT_JUSTIFY which spreads blank space
44 // in-between the child views.
45 };
46
47 // This specifies where along the cross axis the children should be laid out.
48 // e.g. a horizontal layout of CROSS_AXIS_ALIGNMENT_END will result in the
49 // child views being bottom-aligned.
50 enum CrossAxisAlignment {
51 // This causes the child view to stretch to fit the host in the cross axis.
52 CROSS_AXIS_ALIGNMENT_STRETCH,
53 CROSS_AXIS_ALIGNMENT_START,
54 CROSS_AXIS_ALIGNMENT_CENTER,
55 CROSS_AXIS_ALIGNMENT_END,
56 };
57
58 // Use |inside_border_horizontal_spacing| and
59 // |inside_border_vertical_spacing| to add additional space between the child
60 // view area and the host view border. |between_child_spacing| controls the
61 // space in between child views.
62 BoxLayout(Orientation orientation,
63 int inside_border_horizontal_spacing,
64 int inside_border_vertical_spacing,
65 int between_child_spacing);
66 virtual ~BoxLayout();
67
68 void set_main_axis_alignment(MainAxisAlignment main_axis_alignment) {
69 main_axis_alignment_ = main_axis_alignment;
70 }
71
72 void set_cross_axis_alignment(CrossAxisAlignment cross_axis_alignment) {
73 cross_axis_alignment_ = cross_axis_alignment;
74 }
75
76 void set_inside_border_insets(const gfx::Insets& insets) {
77 inside_border_insets_ = insets;
78 }
79
80 void set_minimum_cross_axis_size(int size) {
81 minimum_cross_axis_size_ = size;
82 }
83
84 // Sets the flex weight for the given |view|. Using the preferred size as
85 // the basis, free space along the main axis is distributed to views in the
86 // ratio of their flex weights. Similarly, if the views will overflow the
87 // parent, space is subtracted in these ratios.
88 //
89 // A flex of 0 means this view is not resized. Flex values must not be
90 // negative.
91 void SetFlexForView(const View* view, int flex);
92
93 // Clears the flex for the given |view|, causing it to use the default
94 // flex.
95 void ClearFlexForView(const View* view);
96
97 // Sets the flex for views to use when none is specified.
98 void SetDefaultFlex(int default_flex);
99
100 // Overridden from views::LayoutManager:
101 virtual void Installed(View* host) override;
102 virtual void Uninstalled(View* host) override;
103 virtual void ViewRemoved(View* host, View* view) override;
104 virtual void Layout(View* host) override;
105 virtual gfx::Size GetPreferredSize(const View* host) const override;
106 virtual int GetPreferredHeightForWidth(const View* host,
107 int width) const override;
108
109 private:
110 // Returns the flex for the specified |view|.
111 int GetFlexForView(const View* view) const;
112
113 // Returns the size and position along the main axis of |rect|.
114 int MainAxisSize(const gfx::Rect& rect) const;
115 int MainAxisPosition(const gfx::Rect& rect) const;
116
117 // Sets the size and position along the main axis of |rect|.
118 void SetMainAxisSize(int size, gfx::Rect* rect) const;
119 void SetMainAxisPosition(int position, gfx::Rect* rect) const;
120
121 // Returns the size and position along the cross axis of |rect|.
122 int CrossAxisSize(const gfx::Rect& rect) const;
123 int CrossAxisPosition(const gfx::Rect& rect) const;
124
125 // Sets the size and position along the cross axis of |rect|.
126 void SetCrossAxisSize(int size, gfx::Rect* rect) const;
127 void SetCrossAxisPosition(int size, gfx::Rect* rect) const;
128
129 // Returns the main axis size for the given view. |child_area_width| is needed
130 // to calculate the height of the view when the orientation is vertical.
131 int MainAxisSizeForView(const View* view, int child_area_width) const;
132
133 // Returns the cross axis size for the given view.
134 int CrossAxisSizeForView(const View* view) const;
135
136 // The preferred size for the dialog given the width of the child area.
137 gfx::Size GetPreferredSizeForChildWidth(const View* host,
138 int child_area_width) const;
139
140 // The amount of space the layout requires in addition to any space for the
141 // child views.
142 gfx::Size NonChildSize(const View* host) const;
143
144 const Orientation orientation_;
145
146 // Spacing between child views and host view border.
147 gfx::Insets inside_border_insets_;
148
149 // Spacing to put in between child views.
150 const int between_child_spacing_;
151
152 // The alignment of children in the main axis. This is
153 // MAIN_AXIS_ALIGNMENT_START by default.
154 MainAxisAlignment main_axis_alignment_;
155
156 // The alignment of children in the cross axis. This is
157 // CROSS_AXIS_ALIGNMENT_STRETCH by default.
158 CrossAxisAlignment cross_axis_alignment_;
159
160 // A map of views to their flex weights.
161 std::map<const View*, int> flex_map_;
162
163 // The flex weight for views if none is set. Defaults to 0.
164 int default_flex_;
165
166 // The minimum cross axis size for the layout.
167 int minimum_cross_axis_size_;
168
169 // The view that this BoxLayout is managing the layout for.
170 views::View* host_;
171
172 DISALLOW_IMPLICIT_CONSTRUCTORS(BoxLayout);
173 };
174
175 } // namespace views
176
177 #endif // UI_VIEWS_LAYOUT_BOX_LAYOUT_H_
OLDNEW
« no previous file with comments | « ui/views/ime/null_input_method.cc ('k') | ui/views/layout/box_layout.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698