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/gfx/font.h" | 15 #include "ui/gfx/font.h" |
15 #include "ui/views/controls/button/image_button.h" | 16 #include "ui/views/controls/button/image_button.h" |
16 #include "ui/views/controls/label.h" | 17 #include "ui/views/controls/label.h" |
17 | 18 |
18 namespace { | 19 namespace { |
19 | 20 |
20 // Besides the frame border, there's empty space atop the window in restored | 21 // Besides the frame border, there's empty space atop the window in restored |
21 // mode, to use to drag the window around. | 22 // mode, to use to drag the window around. |
22 const int kNonClientRestoredExtraThickness = 11; | 23 const int kNonClientRestoredExtraThickness = 11; |
23 | 24 |
(...skipping 11 matching lines...) Expand all Loading... |
35 | 36 |
36 // The titlebar has a 2 px 3D edge along the top and bottom. | 37 // The titlebar has a 2 px 3D edge along the top and bottom. |
37 const int kTitlebarTopAndBottomEdgeThickness = 2; | 38 const int kTitlebarTopAndBottomEdgeThickness = 2; |
38 | 39 |
39 // The icon is inset 2 px from the left frame border. | 40 // The icon is inset 2 px from the left frame border. |
40 const int kIconLeftSpacing = 2; | 41 const int kIconLeftSpacing = 2; |
41 | 42 |
42 // There is a 4 px gap between the icon and the title text. | 43 // There is a 4 px gap between the icon and the title text. |
43 const int kIconTitleSpacing = 4; | 44 const int kIconTitleSpacing = 4; |
44 | 45 |
45 // Space between the edge of the avatar and the tabstrip. | |
46 const int kAvatarInnerSpacing = 4; | |
47 | |
48 // How far the new avatar button is from the closest caption button. | 46 // How far the new avatar button is from the closest caption button. |
49 const int kNewAvatarButtonOffset = 5; | 47 const int kNewAvatarButtonOffset = 5; |
50 | 48 |
51 // When the title bar is in its normal two row mode (usually the case for | 49 // When the title bar is in its normal two row mode (usually the case for |
52 // restored windows), the New Tab button isn't at the same height as the caption | 50 // restored windows), the New Tab button isn't at the same height as the caption |
53 // buttons, but the space will look cluttered if it actually slides under them, | 51 // buttons, but the space will look cluttered if it actually slides under them, |
54 // so we stop it when the gap between the two is down to 5 px. | 52 // so we stop it when the gap between the two is down to 5 px. |
55 const int kNewTabCaptionNormalSpacing = 5; | 53 const int kNewTabCaptionNormalSpacing = 5; |
56 | 54 |
57 // When the title bar is condensed to one row (as when maximized), the New Tab | 55 // When the title bar is condensed to one row (as when maximized), the New Tab |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 const std::vector<views::FrameButton>& trailing_buttons) { | 109 const std::vector<views::FrameButton>& trailing_buttons) { |
112 leading_buttons_ = leading_buttons; | 110 leading_buttons_ = leading_buttons; |
113 trailing_buttons_ = trailing_buttons; | 111 trailing_buttons_ = trailing_buttons; |
114 } | 112 } |
115 | 113 |
116 gfx::Rect OpaqueBrowserFrameViewLayout::GetBoundsForTabStrip( | 114 gfx::Rect OpaqueBrowserFrameViewLayout::GetBoundsForTabStrip( |
117 const gfx::Size& tabstrip_preferred_size, | 115 const gfx::Size& tabstrip_preferred_size, |
118 int available_width) const { | 116 int available_width) const { |
119 int x = leading_button_start_ + GetLayoutInsets(AVATAR_ICON).right(); | 117 int x = leading_button_start_ + GetLayoutInsets(AVATAR_ICON).right(); |
120 available_width -= x + NewTabCaptionSpacing() + trailing_button_start_; | 118 available_width -= x + NewTabCaptionSpacing() + trailing_button_start_; |
121 gfx::Rect bounds(x, GetTabStripInsetsTop(false), std::max(0, available_width), | 119 return gfx::Rect(x, GetTabStripInsetsTop(false), std::max(0, available_width), |
122 tabstrip_preferred_size.height()); | 120 tabstrip_preferred_size.height()); |
123 | |
124 if (delegate_->ShouldShowAvatar() && !ShouldIncognitoIconBeOnRight()) | |
125 bounds.Inset(kAvatarInnerSpacing, 0, 0, 0); | |
126 return bounds; | |
127 } | 121 } |
128 | 122 |
129 gfx::Size OpaqueBrowserFrameViewLayout::GetMinimumSize( | 123 gfx::Size OpaqueBrowserFrameViewLayout::GetMinimumSize( |
130 int available_width) const { | 124 int available_width) const { |
131 gfx::Size min_size = delegate_->GetBrowserViewMinimumSize(); | 125 gfx::Size min_size = delegate_->GetBrowserViewMinimumSize(); |
132 int border_thickness = NonClientBorderThickness(); | 126 int border_thickness = NonClientBorderThickness(); |
133 min_size.Enlarge(2 * border_thickness, | 127 min_size.Enlarge(2 * border_thickness, |
134 NonClientTopBorderHeight(false) + border_thickness); | 128 NonClientTopBorderHeight(false) + border_thickness); |
135 | 129 |
136 // Ensure that we can, at minimum, hold our window controls and avatar icon. | 130 // Ensure that we can, at minimum, hold our window controls and avatar icon. |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 GetLayoutSize(NEW_TAB_BUTTON).width() + kNewTabCaptionNormalSpacing; | 373 GetLayoutSize(NEW_TAB_BUTTON).width() + kNewTabCaptionNormalSpacing; |
380 } | 374 } |
381 | 375 |
382 new_avatar_button_->SetBounds(button_x, button_y, button_width, | 376 new_avatar_button_->SetBounds(button_x, button_y, button_width, |
383 kCaptionButtonHeight); | 377 kCaptionButtonHeight); |
384 } | 378 } |
385 | 379 |
386 void OpaqueBrowserFrameViewLayout::LayoutIncognitoIcon(views::View* host) { | 380 void OpaqueBrowserFrameViewLayout::LayoutIncognitoIcon(views::View* host) { |
387 const int old_button_size = leading_button_start_ + trailing_button_start_; | 381 const int old_button_size = leading_button_start_ + trailing_button_start_; |
388 | 382 |
| 383 // Any buttons/icon/title were laid out based on the frame border thickness, |
| 384 // but the tabstrip bounds need to be based on the non-client border thickness |
| 385 // on any side where there aren't other buttons forcing a larger inset. |
| 386 const bool md = ui::MaterialDesignController::IsModeMaterial(); |
| 387 int min_button_width = NonClientBorderThickness(); |
| 388 // In non-MD, the toolbar has a rounded corner that we don't want the tabstrip |
| 389 // to overlap. |
| 390 if (!md && !avatar_button_) |
| 391 min_button_width += delegate_->GetToolbarLeadingCornerClientWidth(); |
| 392 leading_button_start_ = std::max(leading_button_start_, min_button_width); |
| 393 // The trailing corner is a mirror of the leading one. |
| 394 trailing_button_start_ = std::max(trailing_button_start_, min_button_width); |
| 395 |
389 if (avatar_button_) { | 396 if (avatar_button_) { |
390 const gfx::Insets insets(GetLayoutInsets(AVATAR_ICON)); | 397 const gfx::Insets insets(GetLayoutInsets(AVATAR_ICON)); |
391 const gfx::Size size(delegate_->GetOTRAvatarIcon().size()); | 398 const gfx::Size size(delegate_->GetOTRAvatarIcon().size()); |
392 const int incognito_width = insets.left() + size.width(); | 399 const int incognito_width = insets.left() + size.width(); |
393 int x; | 400 int x; |
394 if (ShouldIncognitoIconBeOnRight()) { | 401 if (ShouldIncognitoIconBeOnRight()) { |
395 trailing_button_start_ += incognito_width; | 402 trailing_button_start_ += incognito_width; |
396 x = host->width() - trailing_button_start_; | 403 x = host->width() - trailing_button_start_; |
397 } else { | 404 } else { |
398 x = leading_button_start_ + insets.left(); | 405 x = leading_button_start_ + insets.left(); |
399 leading_button_start_ += incognito_width; | 406 leading_button_start_ += incognito_width; |
400 } | 407 } |
401 const int bottom = GetTabStripInsetsTop(false) + | 408 const int bottom = GetTabStripInsetsTop(false) + |
402 delegate_->GetTabStripHeight() - insets.bottom(); | 409 delegate_->GetTabStripHeight() - insets.bottom(); |
403 int y = IsTitleBarCondensed() ? | 410 const int y = (md || !IsTitleBarCondensed()) ? |
404 FrameBorderThickness(false) : (bottom - size.height()); | 411 (bottom - size.height()) : FrameBorderThickness(false); |
405 avatar_button_->SetBounds(x, y, size.width(), bottom - y); | 412 avatar_button_->SetBounds(x, y, size.width(), bottom - y); |
406 } | 413 } |
407 | 414 |
408 minimum_size_for_buttons_ += | 415 minimum_size_for_buttons_ += |
409 (leading_button_start_ + trailing_button_start_ - old_button_size); | 416 (leading_button_start_ + trailing_button_start_ - old_button_size); |
410 } | 417 } |
411 | 418 |
412 void OpaqueBrowserFrameViewLayout::ConfigureButton( | 419 void OpaqueBrowserFrameViewLayout::ConfigureButton( |
413 views::View* host, | 420 views::View* host, |
414 views::FrameButton button_id, | 421 views::FrameButton button_id, |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 int thickness = FrameBorderThickness(false); | 606 int thickness = FrameBorderThickness(false); |
600 leading_button_start_ = thickness; | 607 leading_button_start_ = thickness; |
601 trailing_button_start_ = thickness; | 608 trailing_button_start_ = thickness; |
602 minimum_size_for_buttons_ = leading_button_start_ + trailing_button_start_; | 609 minimum_size_for_buttons_ = leading_button_start_ + trailing_button_start_; |
603 has_leading_buttons_ = false; | 610 has_leading_buttons_ = false; |
604 has_trailing_buttons_ = false; | 611 has_trailing_buttons_ = false; |
605 | 612 |
606 LayoutWindowControls(host); | 613 LayoutWindowControls(host); |
607 LayoutTitleBar(host); | 614 LayoutTitleBar(host); |
608 | 615 |
609 // We now add a single pixel to the leading spacing. We do this because the | |
610 // avatar and tab strip start one pixel inward compared to where things start | |
611 // on the trailing side. | |
612 leading_button_start_++; | |
613 | |
614 if (delegate_->IsRegularOrGuestSession()) | 616 if (delegate_->IsRegularOrGuestSession()) |
615 LayoutNewStyleAvatar(host); | 617 LayoutNewStyleAvatar(host); |
616 else | 618 LayoutIncognitoIcon(host); |
617 LayoutIncognitoIcon(host); | |
618 | 619 |
619 client_view_bounds_ = CalculateClientAreaBounds( | 620 client_view_bounds_ = CalculateClientAreaBounds( |
620 host->width(), host->height()); | 621 host->width(), host->height()); |
621 } | 622 } |
622 | 623 |
623 gfx::Size OpaqueBrowserFrameViewLayout::GetPreferredSize( | 624 gfx::Size OpaqueBrowserFrameViewLayout::GetPreferredSize( |
624 const views::View* host) const { | 625 const views::View* host) const { |
625 // This is never used; NonClientView::GetPreferredSize() will be called | 626 // This is never used; NonClientView::GetPreferredSize() will be called |
626 // instead. | 627 // instead. |
627 NOTREACHED(); | 628 NOTREACHED(); |
628 return gfx::Size(); | 629 return gfx::Size(); |
629 } | 630 } |
630 | 631 |
631 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host, | 632 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host, |
632 views::View* view) { | 633 views::View* view) { |
633 SetView(view->id(), view); | 634 SetView(view->id(), view); |
634 } | 635 } |
635 | 636 |
636 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host, | 637 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host, |
637 views::View* view) { | 638 views::View* view) { |
638 SetView(view->id(), nullptr); | 639 SetView(view->id(), nullptr); |
639 } | 640 } |
OLD | NEW |