OLD | NEW |
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 "base/command_line.h" |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 #include "chrome/browser/profiles/profiles_state.h" | 9 #include "chrome/browser/profiles/profiles_state.h" |
10 #include "chrome/browser/ui/layout_constants.h" | 10 #include "chrome/browser/ui/layout_constants.h" |
11 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" | 11 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" |
12 #include "chrome/common/chrome_switches.h" | 12 #include "chrome/common/chrome_switches.h" |
13 #include "components/signin/core/common/profile_management_switches.h" | 13 #include "components/signin/core/common/profile_management_switches.h" |
14 #include "ui/base/material_design/material_design_controller.h" | 14 #include "ui/base/material_design/material_design_controller.h" |
15 #include "ui/gfx/font.h" | 15 #include "ui/gfx/font.h" |
16 #include "ui/views/controls/button/image_button.h" | 16 #include "ui/views/controls/button/image_button.h" |
17 #include "ui/views/controls/label.h" | 17 #include "ui/views/controls/label.h" |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 // Besides the frame border, there's empty space atop the window in restored | |
22 // mode, to use to drag the window around. | |
23 const int kNonClientRestoredExtraThickness = 11; | |
24 | |
25 // The titlebar never shrinks too short to show the caption button plus some | 21 // The titlebar never shrinks too short to show the caption button plus some |
26 // padding below it. | 22 // padding below it. |
27 const int kCaptionButtonHeight = 18; | 23 const int kCaptionButtonHeight = 18; |
28 const int kTitleBarAdditionalPadding = 3; | 24 const int kTitleBarAdditionalPadding = 3; |
29 | 25 |
30 // There is a 5 px gap between the title text and the caption buttons. | |
31 const int kTitleLogoSpacing = 5; | |
32 | |
33 // The frame border is only visible in restored mode and is hardcoded to 4 px on | |
34 // each side regardless of the system window border size. | |
35 const int kFrameBorderThickness = 4; | |
36 | |
37 // The titlebar has a 2 px 3D edge along the top and bottom. | |
38 const int kTitlebarTopAndBottomEdgeThickness = 2; | |
39 | |
40 // The icon is inset 2 px from the left frame border. | |
41 const int kIconLeftSpacing = 2; | |
42 | |
43 // There is a 4 px gap between the icon and the title text. | |
44 const int kIconTitleSpacing = 4; | |
45 | |
46 // How far the new avatar button is from the closest caption button. | |
47 const int kNewAvatarButtonOffset = 5; | |
48 | |
49 // When the title bar is in its normal two row mode (usually the case for | |
50 // restored windows), the New Tab button isn't at the same height as the caption | |
51 // buttons, but the space will look cluttered if it actually slides under them, | |
52 // so we stop it when the gap between the two is down to 5 px. | |
53 const int kNewTabCaptionNormalSpacing = 5; | |
54 | |
55 // When the title bar is condensed to one row (as when maximized), the New Tab | |
56 // button and the caption buttons are at similar vertical coordinates, so we | |
57 // need to reserve a larger, 16 px gap to avoid looking too cluttered. | |
58 const int kNewTabCaptionCondensedSpacing = 16; | |
59 | |
60 // If there are no caption buttons to the right of the New Tab button, we | |
61 // reserve a small 5px gap, regardless of whether the window is maximized. This | |
62 // overrides the two previous constants. | |
63 const int kNewTabNoCaptionButtonsSpacing = 5; | |
64 | |
65 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 26 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
66 // Default extra space between the top of the frame and the top of the window | 27 // Default extra space between the top of the frame and the top of the window |
67 // caption buttons. | 28 // caption buttons. |
68 const int kExtraCaption = 2; | 29 const int kExtraCaption = 2; |
69 | 30 |
70 // Default extra spacing between individual window caption buttons. | 31 // Default extra spacing between individual window caption buttons. |
71 const int kCaptionButtonSpacing = 2; | 32 const int kCaptionButtonSpacing = 2; |
72 #else | 33 #else |
73 const int kExtraCaption = 0; | 34 const int kExtraCaption = 0; |
74 const int kCaptionButtonSpacing = 0; | 35 const int kCaptionButtonSpacing = 0; |
75 #endif | 36 #endif |
76 | 37 |
77 } // namespace | 38 } // namespace |
78 | 39 |
79 /////////////////////////////////////////////////////////////////////////////// | 40 /////////////////////////////////////////////////////////////////////////////// |
80 // OpaqueBrowserFrameView, public: | 41 // OpaqueBrowserFrameView, public: |
81 | 42 |
| 43 // statics |
| 44 |
| 45 // Besides the frame border, there's empty space atop the window in restored |
| 46 // mode, to use to drag the window around. |
| 47 const int OpaqueBrowserFrameViewLayout::kNonClientRestoredExtraThickness = 11; |
| 48 |
| 49 // The frame border is only visible in restored mode and is hardcoded to 4 px on |
| 50 // each side regardless of the system window border size. |
| 51 const int OpaqueBrowserFrameViewLayout::kFrameBorderThickness = 4; |
| 52 |
| 53 // The titlebar has a 2 px 3D edge along the top and bottom. |
| 54 const int OpaqueBrowserFrameViewLayout::kTitlebarTopAndBottomEdgeThickness = 2; |
| 55 |
| 56 // The icon is inset 2 px from the left frame border. |
| 57 const int OpaqueBrowserFrameViewLayout::kIconLeftSpacing = 2; |
| 58 |
| 59 // There is a 4 px gap between the icon and the title text. |
| 60 const int OpaqueBrowserFrameViewLayout::kIconTitleSpacing = 4; |
| 61 |
| 62 // The horizontal spacing to use in most cases when laying out things near the |
| 63 // caption button area. |
| 64 const int OpaqueBrowserFrameViewLayout::kCaptionSpacing = 5; |
| 65 |
| 66 // When the title bar is condensed to one row (as when maximized), the New Tab |
| 67 // button and the caption buttons are at similar vertical coordinates, so we |
| 68 // need to reserve a larger, 16 px gap to avoid looking too cluttered. |
| 69 const int OpaqueBrowserFrameViewLayout::kNewTabCaptionCondensedSpacing = 16; |
| 70 |
| 71 |
82 OpaqueBrowserFrameViewLayout::OpaqueBrowserFrameViewLayout( | 72 OpaqueBrowserFrameViewLayout::OpaqueBrowserFrameViewLayout( |
83 OpaqueBrowserFrameViewLayoutDelegate* delegate) | 73 OpaqueBrowserFrameViewLayoutDelegate* delegate) |
84 : delegate_(delegate), | 74 : delegate_(delegate), |
85 leading_button_start_(0), | 75 leading_button_start_(0), |
86 trailing_button_start_(0), | 76 trailing_button_start_(0), |
87 minimum_size_for_buttons_(0), | 77 minimum_size_for_buttons_(0), |
88 has_leading_buttons_(false), | 78 has_leading_buttons_(false), |
89 has_trailing_buttons_(false), | 79 has_trailing_buttons_(false), |
90 extra_caption_y_(kExtraCaption), | 80 extra_caption_y_(kExtraCaption), |
91 window_caption_spacing_(kCaptionButtonSpacing), | 81 window_caption_spacing_(kCaptionButtonSpacing), |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 /////////////////////////////////////////////////////////////////////////////// | 227 /////////////////////////////////////////////////////////////////////////////// |
238 // OpaqueBrowserFrameView, private: | 228 // OpaqueBrowserFrameView, private: |
239 | 229 |
240 bool OpaqueBrowserFrameViewLayout::ShouldIncognitoIconBeOnRight() const { | 230 bool OpaqueBrowserFrameViewLayout::ShouldIncognitoIconBeOnRight() const { |
241 // The incognito should be shown either on the end of the left or the | 231 // The incognito should be shown either on the end of the left or the |
242 // beginning of the right, depending on which side has fewer buttons. | 232 // beginning of the right, depending on which side has fewer buttons. |
243 return trailing_buttons_.size() < leading_buttons_.size(); | 233 return trailing_buttons_.size() < leading_buttons_.size(); |
244 } | 234 } |
245 | 235 |
246 int OpaqueBrowserFrameViewLayout::NewTabCaptionSpacing() const { | 236 int OpaqueBrowserFrameViewLayout::NewTabCaptionSpacing() const { |
247 if (!has_trailing_buttons_) | 237 return (has_trailing_buttons_ && IsTitleBarCondensed()) ? |
248 return kNewTabNoCaptionButtonsSpacing; | 238 kNewTabCaptionCondensedSpacing : kCaptionSpacing; |
249 return IsTitleBarCondensed() ? | |
250 kNewTabCaptionCondensedSpacing : kNewTabCaptionNormalSpacing; | |
251 } | 239 } |
252 | 240 |
253 void OpaqueBrowserFrameViewLayout::LayoutWindowControls(views::View* host) { | 241 void OpaqueBrowserFrameViewLayout::LayoutWindowControls(views::View* host) { |
254 int caption_y = CaptionButtonY(false); | 242 int caption_y = CaptionButtonY(false); |
255 | 243 |
256 // Keep a list of all buttons that we don't show. | 244 // Keep a list of all buttons that we don't show. |
257 std::vector<views::FrameButton> buttons_not_shown; | 245 std::vector<views::FrameButton> buttons_not_shown; |
258 buttons_not_shown.push_back(views::FRAME_BUTTON_MAXIMIZE); | 246 buttons_not_shown.push_back(views::FRAME_BUTTON_MAXIMIZE); |
259 buttons_not_shown.push_back(views::FRAME_BUTTON_MINIMIZE); | 247 buttons_not_shown.push_back(views::FRAME_BUTTON_MINIMIZE); |
260 buttons_not_shown.push_back(views::FRAME_BUTTON_CLOSE); | 248 buttons_not_shown.push_back(views::FRAME_BUTTON_CLOSE); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 | 310 |
323 if (should_show_icon) | 311 if (should_show_icon) |
324 window_icon_->SetBoundsRect(window_icon_bounds_); | 312 window_icon_->SetBoundsRect(window_icon_bounds_); |
325 | 313 |
326 if (window_title_) { | 314 if (window_title_) { |
327 window_title_->SetVisible(should_show_title); | 315 window_title_->SetVisible(should_show_title); |
328 if (should_show_title) { | 316 if (should_show_title) { |
329 window_title_->SetText(delegate_->GetWindowTitle()); | 317 window_title_->SetText(delegate_->GetWindowTitle()); |
330 | 318 |
331 int text_width = std::max( | 319 int text_width = std::max( |
332 0, host->width() - trailing_button_start_ - kTitleLogoSpacing - | 320 0, host->width() - trailing_button_start_ - kCaptionSpacing - |
333 leading_button_start_ - kIconTitleSpacing); | 321 leading_button_start_ - kIconTitleSpacing); |
334 window_title_->SetBounds(leading_button_start_ + kIconTitleSpacing, | 322 window_title_->SetBounds(leading_button_start_ + kIconTitleSpacing, |
335 window_icon_bounds_.y(), | 323 window_icon_bounds_.y(), |
336 text_width, window_icon_bounds_.height()); | 324 text_width, window_icon_bounds_.height()); |
337 leading_button_start_ += text_width + kIconTitleSpacing; | 325 leading_button_start_ += text_width + kIconTitleSpacing; |
338 } | 326 } |
339 } | 327 } |
340 | 328 |
341 if (use_hidden_icon_location) { | 329 if (use_hidden_icon_location) { |
342 if (has_leading_buttons_) { | 330 if (has_leading_buttons_) { |
343 // There are window button icons on the left. Don't size the hidden window | 331 // There are window button icons on the left. Don't size the hidden window |
344 // icon that people can double click on to close the window. | 332 // icon that people can double click on to close the window. |
345 window_icon_bounds_ = gfx::Rect(); | 333 window_icon_bounds_ = gfx::Rect(); |
346 } else { | 334 } else { |
347 // We set the icon bounds to a small rectangle in the top leading corner | 335 // We set the icon bounds to a small rectangle in the top leading corner |
348 // if there are no icons on the leading side. | 336 // if there are no icons on the leading side. |
349 window_icon_bounds_ = gfx::Rect( | 337 window_icon_bounds_ = gfx::Rect( |
350 frame_thickness + kIconLeftSpacing, frame_thickness, size, size); | 338 frame_thickness + kIconLeftSpacing, frame_thickness, size, size); |
351 } | 339 } |
352 } | 340 } |
353 } | 341 } |
354 | 342 |
355 void OpaqueBrowserFrameViewLayout::LayoutNewStyleAvatar(views::View* host) { | 343 void OpaqueBrowserFrameViewLayout::LayoutNewStyleAvatar(views::View* host) { |
356 if (!new_avatar_button_) | 344 if (!new_avatar_button_) |
357 return; | 345 return; |
358 | 346 |
359 int button_width = new_avatar_button_->GetPreferredSize().width(); | 347 int button_width = new_avatar_button_->GetPreferredSize().width(); |
360 int button_width_with_offset = button_width + kNewAvatarButtonOffset; | 348 int button_width_with_offset = button_width + kCaptionSpacing; |
361 | 349 |
362 int button_x = | 350 int button_x = |
363 host->width() - trailing_button_start_ - button_width_with_offset; | 351 host->width() - trailing_button_start_ - button_width_with_offset; |
364 int button_y = CaptionButtonY(!IsTitleBarCondensed()); | 352 int button_y = CaptionButtonY(!IsTitleBarCondensed()); |
365 | 353 |
366 minimum_size_for_buttons_ += button_width_with_offset; | 354 minimum_size_for_buttons_ += button_width_with_offset; |
367 trailing_button_start_ += button_width_with_offset; | 355 trailing_button_start_ += button_width_with_offset; |
368 | 356 |
369 // In non-maximized mode, allow the new tab button to completely slide under | 357 // In non-maximized mode, allow the new tab button to completely slide under |
370 // the avatar button. | 358 // the avatar button. |
371 if (!IsTitleBarCondensed()) { | 359 if (!IsTitleBarCondensed()) { |
372 trailing_button_start_ -= | 360 trailing_button_start_ -= |
373 GetLayoutSize(NEW_TAB_BUTTON).width() + kNewTabCaptionNormalSpacing; | 361 GetLayoutSize(NEW_TAB_BUTTON).width() + kCaptionSpacing; |
374 } | 362 } |
375 | 363 |
376 new_avatar_button_->SetBounds(button_x, button_y, button_width, | 364 new_avatar_button_->SetBounds(button_x, button_y, button_width, |
377 kCaptionButtonHeight); | 365 kCaptionButtonHeight); |
378 } | 366 } |
379 | 367 |
380 void OpaqueBrowserFrameViewLayout::LayoutIncognitoIcon(views::View* host) { | 368 void OpaqueBrowserFrameViewLayout::LayoutIncognitoIcon(views::View* host) { |
381 const int old_button_size = leading_button_start_ + trailing_button_start_; | 369 const int old_button_size = leading_button_start_ + trailing_button_start_; |
382 | 370 |
383 // Any buttons/icon/title were laid out based on the frame border thickness, | 371 // Any buttons/icon/title were laid out based on the frame border thickness, |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 int extra_height = title_bar_condensed ? extra_caption_y_ : 0; | 480 int extra_height = title_bar_condensed ? extra_caption_y_ : 0; |
493 | 481 |
494 switch (alignment) { | 482 switch (alignment) { |
495 case ALIGN_LEADING: { | 483 case ALIGN_LEADING: { |
496 if (has_leading_buttons_) | 484 if (has_leading_buttons_) |
497 leading_button_start_ += window_caption_spacing_; | 485 leading_button_start_ += window_caption_spacing_; |
498 | 486 |
499 // If we're the first button on the left and maximized, add width to the | 487 // If we're the first button on the left and maximized, add width to the |
500 // right hand side of the screen. | 488 // right hand side of the screen. |
501 int extra_width = (title_bar_condensed && !has_leading_buttons_) ? | 489 int extra_width = (title_bar_condensed && !has_leading_buttons_) ? |
502 (kFrameBorderThickness - | 490 (kFrameBorderThickness - |
503 views::NonClientFrameView::kFrameShadowThickness) : 0; | 491 views::NonClientFrameView::kFrameShadowThickness) : |
| 492 0; |
504 | 493 |
505 button->SetBounds( | 494 button->SetBounds(leading_button_start_, |
506 leading_button_start_, | 495 caption_y - extra_height, |
507 caption_y - extra_height, | 496 button_size.width() + extra_width, |
508 button_size.width() + extra_width, | 497 button_size.height() + extra_height); |
509 button_size.height() + extra_height); | |
510 | 498 |
511 leading_button_start_ += extra_width + button_size.width(); | 499 leading_button_start_ += extra_width + button_size.width(); |
512 minimum_size_for_buttons_ += extra_width + button_size.width(); | 500 minimum_size_for_buttons_ += extra_width + button_size.width(); |
513 has_leading_buttons_ = true; | 501 has_leading_buttons_ = true; |
514 break; | 502 break; |
515 } | 503 } |
516 case ALIGN_TRAILING: { | 504 case ALIGN_TRAILING: { |
517 if (has_trailing_buttons_) | 505 if (has_trailing_buttons_) |
518 trailing_button_start_ += window_caption_spacing_; | 506 trailing_button_start_ += window_caption_spacing_; |
519 | 507 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 | 619 |
632 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host, | 620 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host, |
633 views::View* view) { | 621 views::View* view) { |
634 SetView(view->id(), view); | 622 SetView(view->id(), view); |
635 } | 623 } |
636 | 624 |
637 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host, | 625 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host, |
638 views::View* view) { | 626 views::View* view) { |
639 SetView(view->id(), nullptr); | 627 SetView(view->id(), nullptr); |
640 } | 628 } |
OLD | NEW |