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

Side by Side Diff: chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc

Issue 111723012: Linux Aura: Added --use-system-title-bar flag. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Formatting. Created 7 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/frame/opaque_browser_frame_view_layout.h" 5 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
6 6
7 #include "base/command_line.h"
7 #include "chrome/browser/profiles/profiles_state.h" 8 #include "chrome/browser/profiles/profiles_state.h"
8 #include "chrome/browser/ui/views/avatar_menu_button.h" 9 #include "chrome/browser/ui/views/avatar_menu_button.h"
10 #include "chrome/common/chrome_switches.h"
9 #include "ui/gfx/font.h" 11 #include "ui/gfx/font.h"
10 #include "ui/views/controls/button/image_button.h" 12 #include "ui/views/controls/button/image_button.h"
11 #include "ui/views/controls/label.h" 13 #include "ui/views/controls/label.h"
12 14
13 #if defined(OS_WIN) 15 #if defined(OS_WIN)
14 #include "win8/util/win8_util.h" 16 #include "win8/util/win8_util.h"
15 #endif // OS_WIN 17 #endif // OS_WIN
16 18
17 namespace { 19 namespace {
18 20
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 137
136 gfx::Rect OpaqueBrowserFrameViewLayout::GetBoundsForTabStrip( 138 gfx::Rect OpaqueBrowserFrameViewLayout::GetBoundsForTabStrip(
137 const gfx::Size& tabstrip_preferred_size, 139 const gfx::Size& tabstrip_preferred_size,
138 int available_width) const { 140 int available_width) const {
139 available_width -= trailing_button_start_; 141 available_width -= trailing_button_start_;
140 available_width -= leading_button_start_; 142 available_width -= leading_button_start_;
141 143
142 if (delegate_->GetAdditionalReservedSpaceInTabStrip()) 144 if (delegate_->GetAdditionalReservedSpaceInTabStrip())
143 available_width -= delegate_->GetAdditionalReservedSpaceInTabStrip(); 145 available_width -= delegate_->GetAdditionalReservedSpaceInTabStrip();
144 146
145 const int caption_spacing = delegate_->IsMaximized() ? 147 const int caption_spacing = IsTitleBarCondensed() ?
146 kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing; 148 kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing;
147 const int tabstrip_width = available_width - caption_spacing; 149 const int tabstrip_width = available_width - caption_spacing;
148 gfx::Rect bounds(leading_button_start_, GetTabStripInsetsTop(false), 150 gfx::Rect bounds(leading_button_start_, GetTabStripInsetsTop(false),
149 std::max(0, tabstrip_width), 151 std::max(0, tabstrip_width),
150 tabstrip_preferred_size.height()); 152 tabstrip_preferred_size.height());
151 153
152 int leading_tabstrip_indent = kTabStripIndent; 154 int leading_tabstrip_indent = kTabStripIndent;
153 if (delegate_->ShouldShowAvatar() && !ShouldAvatarBeOnRight()) { 155 if (delegate_->ShouldShowAvatar() && !ShouldAvatarBeOnRight()) {
154 if (avatar_label_ && avatar_label_->bounds().width()) 156 if (avatar_label_ && avatar_label_->bounds().width())
155 leading_tabstrip_indent += kAvatarLabelInnerSpacing; 157 leading_tabstrip_indent += kAvatarLabelInnerSpacing;
(...skipping 12 matching lines...) Expand all
168 NonClientTopBorderHeight(false) + border_thickness); 170 NonClientTopBorderHeight(false) + border_thickness);
169 171
170 // Ensure that we can, at minimum, hold our window controls and avatar icon. 172 // Ensure that we can, at minimum, hold our window controls and avatar icon.
171 min_size.set_width(std::max(min_size.width(), minimum_size_for_buttons_)); 173 min_size.set_width(std::max(min_size.width(), minimum_size_for_buttons_));
172 174
173 // Ensure that the minimum width is enough to hold a minimum width tab strip 175 // Ensure that the minimum width is enough to hold a minimum width tab strip
174 // at its usual insets. 176 // at its usual insets.
175 if (delegate_->IsTabStripVisible()) { 177 if (delegate_->IsTabStripVisible()) {
176 gfx::Size preferred_size = delegate_->GetTabstripPreferredSize(); 178 gfx::Size preferred_size = delegate_->GetTabstripPreferredSize();
177 const int min_tabstrip_width = preferred_size.width(); 179 const int min_tabstrip_width = preferred_size.width();
178 const int caption_spacing = delegate_->IsMaximized() ? 180 const int caption_spacing = IsTitleBarCondensed() ?
179 kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing; 181 kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing;
180 min_size.Enlarge(min_tabstrip_width + caption_spacing, 0); 182 min_size.Enlarge(min_tabstrip_width + caption_spacing, 0);
181 } 183 }
182 184
183 return min_size; 185 return min_size;
184 } 186 }
185 187
186 gfx::Rect OpaqueBrowserFrameViewLayout::GetWindowBoundsForClientBounds( 188 gfx::Rect OpaqueBrowserFrameViewLayout::GetWindowBoundsForClientBounds(
187 const gfx::Rect& client_bounds) const { 189 const gfx::Rect& client_bounds) const {
188 int top_height = NonClientTopBorderHeight(false); 190 int top_height = NonClientTopBorderHeight(false);
189 int border_thickness = NonClientBorderThickness(); 191 int border_thickness = NonClientBorderThickness();
190 return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), 192 return gfx::Rect(std::max(0, client_bounds.x() - border_thickness),
191 std::max(0, client_bounds.y() - top_height), 193 std::max(0, client_bounds.y() - top_height),
192 client_bounds.width() + (2 * border_thickness), 194 client_bounds.width() + (2 * border_thickness),
193 client_bounds.height() + top_height + border_thickness); 195 client_bounds.height() + top_height + border_thickness);
194 } 196 }
195 197
196 int OpaqueBrowserFrameViewLayout::FrameBorderThickness(bool restored) const { 198 int OpaqueBrowserFrameViewLayout::FrameBorderThickness(bool restored) const {
197 return (!restored && (delegate_->IsMaximized() || 199 return (!restored && (IsTitleBarCondensed() ||
198 delegate_->IsFullscreen())) ? 200 delegate_->IsFullscreen())) ?
199 0 : kFrameBorderThickness; 201 0 : kFrameBorderThickness;
200 } 202 }
201 203
202 int OpaqueBrowserFrameViewLayout::NonClientBorderThickness() const { 204 int OpaqueBrowserFrameViewLayout::NonClientBorderThickness() const {
203 // When we fill the screen, we don't show a client edge. 205 // When we fill the screen, we don't show a client edge.
204 return FrameBorderThickness(false) + 206 return FrameBorderThickness(false) +
205 ((delegate_->IsMaximized() || delegate_->IsFullscreen()) ? 207 ((IsTitleBarCondensed() || delegate_->IsFullscreen()) ?
206 0 : views::NonClientFrameView::kClientEdgeThickness); 208 0 : views::NonClientFrameView::kClientEdgeThickness);
207 } 209 }
208 210
209 int OpaqueBrowserFrameViewLayout::NonClientTopBorderHeight( 211 int OpaqueBrowserFrameViewLayout::NonClientTopBorderHeight(
210 bool restored) const { 212 bool restored) const {
211 if (delegate_->ShouldShowWindowTitle()) { 213 if (delegate_->ShouldShowWindowTitle()) {
212 return std::max(FrameBorderThickness(restored) + delegate_->GetIconSize(), 214 return std::max(FrameBorderThickness(restored) + delegate_->GetIconSize(),
213 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + 215 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) +
214 TitlebarBottomThickness(restored); 216 TitlebarBottomThickness(restored);
215 } 217 }
216 218
217 return FrameBorderThickness(restored) - 219 return FrameBorderThickness(restored) -
218 ((delegate_->IsTabStripVisible() && 220 ((delegate_->IsTabStripVisible() && !restored &&
219 !restored && !delegate_->ShouldLeaveOffsetNearTopBorder()) 221 (!delegate_->ShouldLeaveOffsetNearTopBorder() ||
James Cook 2013/12/19 20:57:55 Though not your fault, this conditional is too cra
Matt Giuca 2013/12/20 03:53:22 Done.
220 ? kTabstripTopShadowThickness : 0); 222 IsTitleBarCondensed()))
223 ? kTabstripTopShadowThickness
224 : 0);
221 } 225 }
222 226
223 int OpaqueBrowserFrameViewLayout::GetTabStripInsetsTop(bool restored) const { 227 int OpaqueBrowserFrameViewLayout::GetTabStripInsetsTop(bool restored) const {
224 return NonClientTopBorderHeight(restored) + ((!restored && 228 return NonClientTopBorderHeight(restored) + ((!restored &&
225 (!delegate_->ShouldLeaveOffsetNearTopBorder() || 229 (!delegate_->ShouldLeaveOffsetNearTopBorder() ||
230 IsTitleBarCondensed() ||
226 delegate_->IsFullscreen())) ? 231 delegate_->IsFullscreen())) ?
227 0 : kNonClientRestoredExtraThickness); 232 0 : kNonClientRestoredExtraThickness);
228 } 233 }
229 234
230 int OpaqueBrowserFrameViewLayout::TitlebarBottomThickness(bool restored) const { 235 int OpaqueBrowserFrameViewLayout::TitlebarBottomThickness(bool restored) const {
231 return kTitlebarTopAndBottomEdgeThickness + 236 return kTitlebarTopAndBottomEdgeThickness +
232 ((!restored && delegate_->IsMaximized()) ? 0 : 237 ((!restored && IsTitleBarCondensed()) ? 0 :
233 views::NonClientFrameView::kClientEdgeThickness); 238 views::NonClientFrameView::kClientEdgeThickness);
234 } 239 }
235 240
236 int OpaqueBrowserFrameViewLayout::CaptionButtonY(bool restored) const { 241 int OpaqueBrowserFrameViewLayout::CaptionButtonY(bool restored) const {
237 // Maximized buttons start at window top, since the window has no border. This 242 // Maximized buttons start at window top, since the window has no border. This
238 // offset is for the image (the actual clickable bounds extend all the way to 243 // offset is for the image (the actual clickable bounds extend all the way to
239 // the top to take Fitts' Law into account). 244 // the top to take Fitts' Law into account).
240 return ((!restored && delegate_->IsMaximized()) ? 245 return ((!restored && IsTitleBarCondensed()) ?
241 FrameBorderThickness(false) : 246 FrameBorderThickness(false) :
242 views::NonClientFrameView::kFrameShadowThickness) + extra_caption_y_; 247 views::NonClientFrameView::kFrameShadowThickness) + extra_caption_y_;
243 } 248 }
244 249
245 gfx::Rect OpaqueBrowserFrameViewLayout::IconBounds() const { 250 gfx::Rect OpaqueBrowserFrameViewLayout::IconBounds() const {
246 return window_icon_bounds_; 251 return window_icon_bounds_;
247 } 252 }
248 253
249 gfx::Rect OpaqueBrowserFrameViewLayout::CalculateClientAreaBounds( 254 gfx::Rect OpaqueBrowserFrameViewLayout::CalculateClientAreaBounds(
250 int width, 255 int width,
251 int height) const { 256 int height) const {
252 int top_height = NonClientTopBorderHeight(false); 257 int top_height = NonClientTopBorderHeight(false);
253 int border_thickness = NonClientBorderThickness(); 258 int border_thickness = NonClientBorderThickness();
254 return gfx::Rect(border_thickness, top_height, 259 return gfx::Rect(border_thickness, top_height,
255 std::max(0, width - (2 * border_thickness)), 260 std::max(0, width - (2 * border_thickness)),
256 std::max(0, height - top_height - border_thickness)); 261 std::max(0, height - top_height - border_thickness));
257 } 262 }
258 263
264 bool OpaqueBrowserFrameViewLayout::IsTitleBarCondensed() const {
265 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
266 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseSystemTitleBar))
267 return true;
268 #endif
269
270 return delegate_->IsMaximized();
271 }
272
259 /////////////////////////////////////////////////////////////////////////////// 273 ///////////////////////////////////////////////////////////////////////////////
260 // OpaqueBrowserFrameView, private: 274 // OpaqueBrowserFrameView, private:
261 275
262 bool OpaqueBrowserFrameViewLayout::ShouldAvatarBeOnRight() const { 276 bool OpaqueBrowserFrameViewLayout::ShouldAvatarBeOnRight() const {
263 // The avatar should be shown either on the end of the left or the beginning 277 // The avatar should be shown either on the end of the left or the beginning
264 // of the right depending on which side has fewer buttons. 278 // of the right depending on which side has fewer buttons.
265 return trailing_buttons_.size() < leading_buttons_.size(); 279 return trailing_buttons_.size() < leading_buttons_.size();
266 } 280 }
267 281
268 void OpaqueBrowserFrameViewLayout::LayoutWindowControls(views::View* host) { 282 void OpaqueBrowserFrameViewLayout::LayoutWindowControls(views::View* host) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 use_hidden_icon_location = false; 327 use_hidden_icon_location = false;
314 328
315 // Our frame border has a different "3D look" than Windows'. Theirs has 329 // Our frame border has a different "3D look" than Windows'. Theirs has
316 // a more complex gradient on the top that they push their icon/title 330 // a more complex gradient on the top that they push their icon/title
317 // below; then the maximized window cuts this off and the icon/title are 331 // below; then the maximized window cuts this off and the icon/title are
318 // centered in the remaining space. Because the apparent shape of our 332 // centered in the remaining space. Because the apparent shape of our
319 // border is simpler, using the same positioning makes things look 333 // border is simpler, using the same positioning makes things look
320 // slightly uncentered with restored windows, so when the window is 334 // slightly uncentered with restored windows, so when the window is
321 // restored, instead of calculating the remaining space from below the 335 // restored, instead of calculating the remaining space from below the
322 // frame border, we calculate from below the 3D edge. 336 // frame border, we calculate from below the 3D edge.
323 int unavailable_px_at_top = delegate_->IsMaximized() ? 337 int unavailable_px_at_top = IsTitleBarCondensed() ?
324 frame_thickness : kTitlebarTopAndBottomEdgeThickness; 338 frame_thickness : kTitlebarTopAndBottomEdgeThickness;
325 // When the icon is shorter than the minimum space we reserve for the 339 // When the icon is shorter than the minimum space we reserve for the
326 // caption button, we vertically center it. We want to bias rounding to 340 // caption button, we vertically center it. We want to bias rounding to
327 // put extra space above the icon, since the 3D edge (+ client edge, for 341 // put extra space above the icon, since the 3D edge (+ client edge, for
328 // restored windows) below looks (to the eye) more like additional space 342 // restored windows) below looks (to the eye) more like additional space
329 // than does the 3D edge (or nothing at all, for maximized windows) 343 // than does the 3D edge (or nothing at all, for maximized windows)
330 // above; hence the +1. 344 // above; hence the +1.
331 int y = unavailable_px_at_top + (NonClientTopBorderHeight(false) - 345 int y = unavailable_px_at_top + (NonClientTopBorderHeight(false) -
332 unavailable_px_at_top - size - 346 unavailable_px_at_top - size -
333 TitlebarBottomThickness(false) + 1) / 2; 347 TitlebarBottomThickness(false) + 1) / 2;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 gfx::ImageSkia incognito_icon = delegate_->GetOTRAvatarIcon(); 413 gfx::ImageSkia incognito_icon = delegate_->GetOTRAvatarIcon();
400 414
401 bool avatar_on_right = ShouldAvatarBeOnRight(); 415 bool avatar_on_right = ShouldAvatarBeOnRight();
402 int avatar_bottom = GetTabStripInsetsTop(false) + 416 int avatar_bottom = GetTabStripInsetsTop(false) +
403 delegate_->GetTabStripHeight() - kAvatarBottomSpacing; 417 delegate_->GetTabStripHeight() - kAvatarBottomSpacing;
404 int avatar_restored_y = avatar_bottom - incognito_icon.height(); 418 int avatar_restored_y = avatar_bottom - incognito_icon.height();
405 int avatar_x = avatar_on_right ? 419 int avatar_x = avatar_on_right ?
406 host->width() - trailing_button_start_ - kAvatarOuterSpacing - 420 host->width() - trailing_button_start_ - kAvatarOuterSpacing -
407 incognito_icon.width() : 421 incognito_icon.width() :
408 leading_button_start_ + kAvatarOuterSpacing; 422 leading_button_start_ + kAvatarOuterSpacing;
409 int avatar_y = delegate_->IsMaximized() ? 423 int avatar_y = IsTitleBarCondensed() ?
410 (NonClientTopBorderHeight(false) + kTabstripTopShadowThickness) : 424 (NonClientTopBorderHeight(false) + kTabstripTopShadowThickness) :
411 avatar_restored_y; 425 avatar_restored_y;
412 avatar_bounds_.SetRect( 426 avatar_bounds_.SetRect(
413 avatar_x, 427 avatar_x,
414 avatar_y, 428 avatar_y,
415 incognito_icon.width(), 429 incognito_icon.width(),
416 delegate_->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0); 430 delegate_->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0);
417 if (avatar_button_) { 431 if (avatar_button_) {
418 avatar_button_->set_button_on_right(avatar_on_right); 432 avatar_button_->set_button_on_right(avatar_on_right);
419 avatar_button_->SetBoundsRect(avatar_bounds_); 433 avatar_button_->SetBoundsRect(avatar_bounds_);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 519
506 button->SetImageAlignment( 520 button->SetImageAlignment(
507 (alignment == ALIGN_LEADING) ? 521 (alignment == ALIGN_LEADING) ?
508 views::ImageButton::ALIGN_RIGHT : views::ImageButton::ALIGN_LEFT, 522 views::ImageButton::ALIGN_RIGHT : views::ImageButton::ALIGN_LEFT,
509 views::ImageButton::ALIGN_BOTTOM); 523 views::ImageButton::ALIGN_BOTTOM);
510 524
511 // There should always be the same number of non-shadow pixels visible to the 525 // There should always be the same number of non-shadow pixels visible to the
512 // side of the caption buttons. In maximized mode we extend buttons to the 526 // side of the caption buttons. In maximized mode we extend buttons to the
513 // screen top and the rightmost button to the screen right (or leftmost button 527 // screen top and the rightmost button to the screen right (or leftmost button
514 // to the screen left, for left-aligned buttons) to obey Fitts' Law. 528 // to the screen left, for left-aligned buttons) to obey Fitts' Law.
515 bool is_maximized = delegate_->IsMaximized(); 529 bool is_maximized = IsTitleBarCondensed();
James Cook 2013/12/19 20:57:55 nit: Maybe call this title_bar_condensed instead o
Matt Giuca 2013/12/20 03:53:22 Done.
516 530
517 // When we are the first button on the leading side and are the close 531 // When we are the first button on the leading side and are the close
518 // button, we must flip ourselves, because the close button assets have 532 // button, we must flip ourselves, because the close button assets have
519 // a little notch to fit in the rounded frame. 533 // a little notch to fit in the rounded frame.
520 button->SetDrawImageMirrored(alignment == ALIGN_LEADING && 534 button->SetDrawImageMirrored(alignment == ALIGN_LEADING &&
521 !has_leading_buttons_ && 535 !has_leading_buttons_ &&
522 button == close_button_); 536 button == close_button_);
523 // If the window is maximized, align the buttons to its upper edge. 537 // If the window is maximized, align the buttons to its upper edge.
524 int extra_height = is_maximized ? extra_caption_y_ : 0; 538 int extra_height = is_maximized ? extra_caption_y_ : 0;
525 539
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 686
673 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host, 687 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host,
674 views::View* view) { 688 views::View* view) {
675 SetView(view->id(), view); 689 SetView(view->id(), view);
676 } 690 }
677 691
678 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host, 692 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host,
679 views::View* view) { 693 views::View* view) {
680 SetView(view->id(), NULL); 694 SetView(view->id(), NULL);
681 } 695 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698