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

Side by Side Diff: chrome/browser/ui/views/constrained_window_frame_simple.cc

Issue 11077006: Correct padding and focus ring for frameless constrained window dialog (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Add comments and ASCII art. More clear implementation of client insets. Created 8 years, 2 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/constrained_window_frame_simple.h" 5 #include "chrome/browser/ui/views/constrained_window_frame_simple.h"
6 6
7 #include "chrome/browser/ui/constrained_window.h" 7 #include "chrome/browser/ui/constrained_window.h"
8 #include "chrome/browser/ui/views/constrained_window_views.h" 8 #include "chrome/browser/ui/views/constrained_window_views.h"
9 #include "grit/ui_resources.h" 9 #include "grit/ui_resources.h"
10 #include "grit/chromium_strings.h" 10 #include "grit/chromium_strings.h"
(...skipping 16 matching lines...) Expand all
27 #include "ui/views/widget/widget_delegate.h" 27 #include "ui/views/widget/widget_delegate.h"
28 28
29 namespace { 29 namespace {
30 30
31 typedef ConstrainedWindowFrameSimple::HeaderViews HeaderViews; 31 typedef ConstrainedWindowFrameSimple::HeaderViews HeaderViews;
32 32
33 // A layout manager that lays out the header view with proper padding, 33 // A layout manager that lays out the header view with proper padding,
34 // and sized to the widget's client view. 34 // and sized to the widget's client view.
35 class HeaderLayout : public views::LayoutManager { 35 class HeaderLayout : public views::LayoutManager {
36 public: 36 public:
37 explicit HeaderLayout(views::Widget* container) : container_(container) {} 37 explicit HeaderLayout(
38 views::Widget* container,
39 int client_left_inset,
40 int client_right_inset);
38 virtual ~HeaderLayout() {} 41 virtual ~HeaderLayout() {}
39 42
40 // Overridden from LayoutManager 43 // Overridden from LayoutManager
41 virtual void Layout(views::View* host); 44 virtual void Layout(views::View* host);
42 virtual gfx::Size GetPreferredSize(views::View* host); 45 virtual gfx::Size GetPreferredSize(views::View* host);
43 46
44 private: 47 private:
45 views::Widget* container_; 48 views::Widget* container_;
49 int client_left_inset_;
50 int client_right_inset_;
46 51
47 DISALLOW_COPY_AND_ASSIGN(HeaderLayout); 52 DISALLOW_COPY_AND_ASSIGN(HeaderLayout);
48 }; 53 };
49 54
55 HeaderLayout::HeaderLayout(
56 views::Widget* container,
57 int client_left_inset,
58 int client_right_inset)
59 : container_(container),
60 client_left_inset_(client_left_inset),
61 client_right_inset_(client_right_inset) {}
62
50 void HeaderLayout::Layout(views::View* host) { 63 void HeaderLayout::Layout(views::View* host) {
51 if (!host->has_children()) 64 if (!host->has_children())
52 return; 65 return;
53 66
54 int horizontal_padding = ConstrainedWindow::kHorizontalPadding; 67 int top_padding = ConstrainedWindow::kCloseButtonPadding;
55 int vertical_padding = ConstrainedWindow::kVerticalPadding; 68 int left_padding = ConstrainedWindow::kHorizontalPadding;
56 int row_padding = ConstrainedWindow::kRowPadding; 69 int right_padding = ConstrainedWindow::kCloseButtonPadding;
57 70
58 views::View* header = host->child_at(0); 71 views::View* header = host->child_at(0);
59 gfx::Size preferred_size = GetPreferredSize(host); 72 gfx::Size preferred_size = GetPreferredSize(host);
60 int width = preferred_size.width() - 2 * horizontal_padding; 73 int width = preferred_size.width() - left_padding - right_padding;
61 int height = preferred_size.height() - vertical_padding - row_padding; 74 int height = preferred_size.height() - top_padding;
62 75
63 header->SetBounds(horizontal_padding, vertical_padding, width, height); 76 header->SetBounds(left_padding, top_padding, width, height);
64 } 77 }
65 78
66 gfx::Size HeaderLayout::GetPreferredSize(views::View* host) { 79 gfx::Size HeaderLayout::GetPreferredSize(views::View* host) {
67 int horizontal_padding = ConstrainedWindow::kHorizontalPadding; 80 int left_padding = ConstrainedWindow::kHorizontalPadding;
68 int vertical_padding = ConstrainedWindow::kVerticalPadding; 81 int top_padding = ConstrainedWindow::kCloseButtonPadding;
69 int row_padding = ConstrainedWindow::kRowPadding; 82 int right_padding = ConstrainedWindow::kCloseButtonPadding;
70 83
71 views::View* header = host->child_at(0); 84 views::View* header = host->child_at(0);
72 views::View* client_view = container_->client_view(); 85 views::View* client_view = container_->client_view();
73 86
74 gfx::Size header_size = header ? header->GetPreferredSize() : gfx::Size(); 87 gfx::Size header_size = header ? header->GetPreferredSize() : gfx::Size();
75 gfx::Size client_size = 88 gfx::Size client_size =
76 client_view ? client_view->GetPreferredSize() : gfx::Size(); 89 client_view ? client_view->GetPreferredSize() : gfx::Size();
77 int width = std::max(client_size.width(), header_size.width()) + 90 int width = std::max(
78 2 * horizontal_padding; 91 client_left_inset_ + client_size.width() + client_right_inset_,
79 int height = vertical_padding + header_size.height() + row_padding; 92 left_padding + header_size.width() + right_padding);
93 int height = header_size.height() + top_padding;
80 return gfx::Size(width, height); 94 return gfx::Size(width, height);
81 } 95 }
82 96
97 // Utility function to add padding to a view.
98 views::View* AddPadding(
99 views::View* viewToPad,
Peter Kasting 2012/10/09 19:31:10 Nit: Use underscores
please use gerrit instead 2012/10/10 19:12:58 I've removed this method entirely in favor of set_
100 int top,
101 int left,
102 int bottom,
103 int right) {
104 views::View* result = new views::View();
105 views::GridLayout* layout = new views::GridLayout(result);
106 result->SetLayoutManager(layout);
107 layout->SetInsets(top, left, bottom, right);
108 views::ColumnSet* cs = layout->AddColumnSet(0);
109 cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0,
110 views::GridLayout::USE_PREF, 0, 0);
111 layout->StartRow(0, 0);
112 layout->AddView(viewToPad);
113 return result;
114 }
115
83 } // namespace 116 } // namespace
84 117
85 ConstrainedWindowFrameSimple::HeaderViews::HeaderViews( 118 ConstrainedWindowFrameSimple::HeaderViews::HeaderViews(
86 views::View* header, 119 views::View* header,
87 views::Label* title_label, 120 views::Label* title_label,
88 views::Button* close_button) 121 views::Button* close_button)
89 : header(header), 122 : header(header),
90 title_label(title_label), 123 title_label(title_label),
91 close_button(close_button) { 124 close_button(close_button) {
92 DCHECK(header); 125 DCHECK(header);
93 } 126 }
94 127
95 ConstrainedWindowFrameSimple::ConstrainedWindowFrameSimple( 128 ConstrainedWindowFrameSimple::ConstrainedWindowFrameSimple(
96 ConstrainedWindowViews* container) 129 ConstrainedWindowViews* container)
97 : container_(container) { 130 : container_(container),
131 client_insets_(ConstrainedWindow::kRowPadding,
132 ConstrainedWindow::kHorizontalPadding,
133 ConstrainedWindow::kVerticalPadding,
134 ConstrainedWindow::kHorizontalPadding) {
Peter Kasting 2012/10/09 19:31:10 Instead of constructing an Insets member, do somet
Mike Wittman 2012/10/09 22:55:46 This is good advice, but if you go this route plea
please use gerrit instead 2012/10/10 19:12:58 wittman@: Please try the latest patch set on your
please use gerrit instead 2012/10/10 19:12:58 I am using set_border now, but I want to keep |cli
98 container_->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); 135 container_->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM);
99 136
100 layout_ = new HeaderLayout(container_); 137 layout_ = new HeaderLayout(container_, client_insets_.left(),
138 client_insets_.right());
Peter Kasting 2012/10/09 19:31:10 Nit: Indent even
please use gerrit instead 2012/10/10 19:12:58 Done.
101 SetLayoutManager(layout_); 139 SetLayoutManager(layout_);
102 140
103 SetHeaderView(CreateDefaultHeaderView()); 141 SetHeaderView(CreateDefaultHeaderView());
104 142
105 set_background(views::Background::CreateSolidBackground( 143 set_background(views::Background::CreateSolidBackground(
106 ConstrainedWindow::GetBackgroundColor())); 144 ConstrainedWindow::GetBackgroundColor()));
107 } 145 }
108 146
109 ConstrainedWindowFrameSimple::~ConstrainedWindowFrameSimple() { 147 ConstrainedWindowFrameSimple::~ConstrainedWindowFrameSimple() {
110 } 148 }
111 149
112 void ConstrainedWindowFrameSimple::SetHeaderView(HeaderViews* header_views) 150 void ConstrainedWindowFrameSimple::SetHeaderView(HeaderViews* header_views)
113 { 151 {
114 RemoveAllChildViews(true); 152 RemoveAllChildViews(true);
115 153
116 header_views_.reset(header_views); 154 header_views_.reset(header_views);
117 155
118 AddChildView(header_views_->header); 156 AddChildView(header_views_->header);
119 } 157 }
120 158
121 HeaderViews* ConstrainedWindowFrameSimple::CreateDefaultHeaderView() { 159 HeaderViews* ConstrainedWindowFrameSimple::CreateDefaultHeaderView() {
160 const int kTitleTopPadding = ConstrainedWindow::kTitleTopPadding -
161 ConstrainedWindow::kCloseButtonPadding;
162 const int kTitleLeftPadding = 0;
163 const int kTitleBottomPadding = 0;
164 const int kTitleRightPadding = 0;
165
122 views::View* header_view = new views::View; 166 views::View* header_view = new views::View;
123 167
124 views::GridLayout* grid_layout = new views::GridLayout(header_view); 168 views::GridLayout* grid_layout = new views::GridLayout(header_view);
125 header_view->SetLayoutManager(grid_layout); 169 header_view->SetLayoutManager(grid_layout);
126 170
127 views::ColumnSet* header_cs = grid_layout->AddColumnSet(0); 171 views::ColumnSet* header_cs = grid_layout->AddColumnSet(0);
128 header_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, 172 header_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0,
129 views::GridLayout::USE_PREF, 0, 0); // Title. 173 views::GridLayout::USE_PREF, 0, 0); // Title.
130 header_cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); 174 header_cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
131 header_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, 175 header_cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
132 views::GridLayout::USE_PREF, 0, 0); // Close Button. 176 0, views::GridLayout::USE_PREF, 0, 0); // Close Button.
133 177
134 // Header row. 178 // Header row.
135 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 179 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
136 grid_layout->StartRow(0, 0); 180 grid_layout->StartRow(0, 0);
181
137 views::Label* title_label = new views::Label(); 182 views::Label* title_label = new views::Label();
138 title_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 183 title_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
139 title_label->SetFont(rb.GetFont(ConstrainedWindow::kTitleFontStyle)); 184 title_label->SetFont(rb.GetFont(ConstrainedWindow::kTitleFontStyle));
140 title_label->SetEnabledColor(ConstrainedWindow::GetTextColor()); 185 title_label->SetEnabledColor(ConstrainedWindow::GetTextColor());
141 title_label->SetText(container_->widget_delegate()->GetWindowTitle()); 186 title_label->SetText(container_->widget_delegate()->GetWindowTitle());
142 grid_layout->AddView(title_label); 187 grid_layout->AddView(AddPadding(title_label, kTitleTopPadding,
188 kTitleLeftPadding, kTitleBottomPadding, kTitleRightPadding));
143 189
144 views::Button* close_button = CreateCloseButton(); 190 views::Button* close_button = CreateCloseButton();
145 grid_layout->AddView(close_button); 191 grid_layout->AddView(close_button);
146 192
147 return new HeaderViews(header_view, title_label, close_button); 193 return new HeaderViews(header_view, title_label, close_button);
148 } 194 }
149 195
150 gfx::Rect ConstrainedWindowFrameSimple::GetBoundsForClientView() const { 196 gfx::Rect ConstrainedWindowFrameSimple::GetBoundsForClientView() const {
151 int horizontal_padding = ConstrainedWindow::kHorizontalPadding;
152 int vertical_padding = ConstrainedWindow::kVerticalPadding;
153 int row_padding = ConstrainedWindow::kRowPadding;
154 gfx::Size header_size = 197 gfx::Size header_size =
Peter Kasting 2012/10/09 19:31:10 Nit: Simpler: gfx::Rect bounds(GetContentsBound
please use gerrit instead 2012/10/10 19:12:58 Done.
155 header_views_->header ? 198 header_views_->header ?
156 header_views_->header->GetPreferredSize() : gfx::Size(); 199 header_views_->header->GetPreferredSize() : gfx::Size();
157 200
158 return gfx::Rect(horizontal_padding, 201 int client_x = client_insets_.left();
159 vertical_padding + header_size.height() + row_padding, 202 int client_y = header_size.height() + client_insets_.top();
160 std::max(0, width() - 2 * horizontal_padding), 203 int client_width = width() - client_x - client_insets_.right();
161 std::max(0, (height() - 2 * vertical_padding - 204 int client_height = height() - client_y - client_insets_.bottom();
162 header_size.height() - row_padding))); 205
206 client_width = std::max(0, client_width);
207 client_height = std::max(0, client_height);
208
209 return gfx::Rect(client_x, client_y, client_width, client_height);
163 } 210 }
164 211
165 gfx::Rect ConstrainedWindowFrameSimple::GetWindowBoundsForClientBounds( 212 gfx::Rect ConstrainedWindowFrameSimple::GetWindowBoundsForClientBounds(
166 const gfx::Rect& client_bounds) const { 213 const gfx::Rect& client_bounds) const {
167 int horizontal_padding = ConstrainedWindow::kHorizontalPadding;
168 int vertical_padding = ConstrainedWindow::kVerticalPadding;
169 int row_padding = ConstrainedWindow::kRowPadding;
170 gfx::Size header_size = 214 gfx::Size header_size =
Peter Kasting 2012/10/09 19:31:10 Nit: Simplify by rewriting like the function above
please use gerrit instead 2012/10/10 19:12:58 Done.
171 header_views_->header ? 215 header_views_->header ?
172 header_views_->header->GetPreferredSize() : gfx::Size(); 216 header_views_->header->GetPreferredSize() : gfx::Size();
173 217
174 int x = client_bounds.x() - horizontal_padding; 218 int x = client_bounds.x() - client_insets_.left();
175 int y = client_bounds.y() - vertical_padding - header_size.height() - 219 int y = client_bounds.y() - header_size.height() - client_insets_.top();
176 row_padding; 220 int width = client_bounds.width() + client_insets_.left() +
177 int width = client_bounds.width() + 2 * horizontal_padding; 221 client_insets_.right();
178 int height = client_bounds.height() + 2 * vertical_padding + 222 int height = client_bounds.height() + header_size.height() +
179 header_size.height() + row_padding; 223 client_insets_.top() + client_insets_.bottom();
180 224
181 return gfx::Rect(x, y, width, height); 225 return gfx::Rect(x, y, width, height);
182 } 226 }
183 227
184 int ConstrainedWindowFrameSimple::NonClientHitTest(const gfx::Point& point) { 228 int ConstrainedWindowFrameSimple::NonClientHitTest(const gfx::Point& point) {
185 if (!bounds().Contains(point)) 229 if (!bounds().Contains(point))
186 return HTNOWHERE; 230 return HTNOWHERE;
187 return HTCLIENT; 231 return HTCLIENT;
188 } 232 }
189 233
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 272 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
229 views::ImageButton* close_button = new views::ImageButton(this); 273 views::ImageButton* close_button = new views::ImageButton(this);
230 close_button->SetImage(views::CustomButton::BS_NORMAL, 274 close_button->SetImage(views::CustomButton::BS_NORMAL,
231 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X)); 275 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X));
232 close_button->SetImage(views::CustomButton::BS_HOT, 276 close_button->SetImage(views::CustomButton::BS_HOT,
233 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER)); 277 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER));
234 close_button->SetImage(views::CustomButton::BS_PUSHED, 278 close_button->SetImage(views::CustomButton::BS_PUSHED,
235 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER)); 279 rb.GetImageSkiaNamed(IDR_SHARED_IMAGES_X_HOVER));
236 return close_button; 280 return close_button;
237 } 281 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698