Index: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
=================================================================== |
--- chrome/browser/ui/views/frame/opaque_browser_frame_view.cc (revision 88686) |
+++ chrome/browser/ui/views/frame/opaque_browser_frame_view.cc (working copy) |
@@ -10,10 +10,10 @@ |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/themes/theme_service.h" |
+#include "chrome/browser/ui/profile_menu_model.h" |
+#include "chrome/browser/ui/views/avatar_menu_button.h" |
#include "chrome/browser/ui/views/frame/browser_frame.h" |
#include "chrome/browser/ui/views/frame/browser_view.h" |
-#include "chrome/browser/ui/views/profile_menu_button.h" |
-#include "chrome/browser/ui/views/profile_tag_view.h" |
#include "chrome/browser/ui/views/tabs/tab_strip.h" |
#include "chrome/browser/ui/views/toolbar_view.h" |
#include "chrome/common/chrome_switches.h" |
@@ -74,13 +74,13 @@ |
const int kIconTitleSpacing = 4; |
// There is a 5 px gap between the title text and the caption buttons. |
const int kTitleLogoSpacing = 5; |
-// The OTR avatar ends 2 px above the bottom of the tabstrip (which, given the |
+// The avatar ends 2 px above the bottom of the tabstrip (which, given the |
// way the tabstrip draws its bottom edge, will appear like a 1 px gap to the |
// user). |
-const int kOTRBottomSpacing = 2; |
-// There are 2 px on each side of the OTR avatar (between the frame border and |
+const int kAvatarBottomSpacing = 2; |
+// There are 2 px on each side of the avatar (between the frame border and |
// it on the left, and between it and the tabstrip on the right). |
-const int kOTRSideSpacing = 2; |
+const int kAvatarSideSpacing = 2; |
// The top 1 px of the tabstrip is shadow; in maximized mode we push this off |
// the top of the screen so the tabs appear flush against the screen edge. |
const int kTabstripTopShadowThickness = 1; |
@@ -93,13 +93,11 @@ |
// looking too cluttered. |
const int kNewTabCaptionMaximizedSpacing = 16; |
// How far to indent the tabstrip from the left side of the screen when there |
-// is no OTR icon. |
+// is no avatar icon. |
const int kTabStripIndent = 1; |
// Inset from the top of the toolbar/tabstrip to the shadow. Used only for |
// vertical tabs. |
const int kVerticalTabBorderInset = 3; |
-// Y position for profile tag inside the frame. |
-const int kProfileTagYPosition = 1; |
// Converts |bounds| from |src|'s coordinate system to |dst|, and checks if |
// |pt| is contained within. |
@@ -200,18 +198,28 @@ |
window_icon_->Update(); |
} |
- // If multi-profile is enabled set up profile button and login notifications. |
+ if (browser_view_->ShouldShowAvatar()) { |
+ ui::MenuModel* menu_model = browser_view_->IsOffTheRecord() ? |
+ NULL : new ProfileMenuModel; |
+ // AvatarMenuButton takes ownership of |menu_model|. |
+ avatar_button_.reset(new AvatarMenuButton(std::wstring(), menu_model)); |
+ AddChildView(avatar_button_.get()); |
+ |
+ if (browser_view_->IsOffTheRecord()) { |
+ avatar_button_->SetIcon(browser_view_->GetOTRAvatarIcon()); |
+ } else { |
+ // TODO(sail) Get the avatar icon assigned to this profile. |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ avatar_button_->SetIcon(*rb.GetBitmapNamed(IDR_PROFILE_AVATAR_1)); |
+ // TODO(sail) Also need to call SetHoverIcon() and SetPushedIcon(). |
+ } |
+ } |
+ |
+ // If multi-profile is enabled set up login notifications. |
const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); |
if (browser_command_line.HasSwitch(switches::kMultiProfiles) && |
- !browser_view_->ShouldShowOffTheRecordAvatar()) { |
+ !browser_view->IsOffTheRecord()) { |
RegisterLoginNotifications(); |
- profile_button_.reset(new ProfileMenuButton(std::wstring(), |
- browser_view_->browser()->profile())); |
- profile_button_->SetVisible(false); |
- profile_tag_.reset(new ProfileTagView(frame_, profile_button_.get())); |
- profile_tag_->SetVisible(false); |
- AddChildView(profile_tag_.get()); |
- AddChildView(profile_button_.get()); |
} |
} |
@@ -269,15 +277,11 @@ |
browser_view_->height()); |
} |
- int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ? |
- (otr_avatar_bounds_.right() + kOTRSideSpacing) : |
+ int tabstrip_x = browser_view_->ShouldShowAvatar() ? |
+ (avatar_bounds_.right() + kAvatarSideSpacing) : |
NonClientBorderThickness() + kTabStripIndent; |
- int maximized_spacing = |
- kNewTabCaptionMaximizedSpacing + |
- (show_profile_button() && profile_button_->IsVisible() ? |
- profile_button_->GetPreferredSize().width() + |
- ProfileMenuButton::kProfileTagHorizontalSpacing : 0); |
+ int maximized_spacing = kNewTabCaptionMaximizedSpacing; |
int tabstrip_width = minimize_button_->x() - tabstrip_x - |
(frame_->IsMaximized() ? |
maximized_spacing : kNewTabCaptionRestoredSpacing); |
@@ -340,9 +344,13 @@ |
if (!bounds().Contains(point)) |
return HTNOWHERE; |
- int frame_component = |
- frame_->client_view()->NonClientHitTest(point); |
+ // See if the point is within the avatar menu button. |
+ if (avatar_button_.get() && |
+ avatar_button_->GetMirroredBounds().Contains(point)) |
+ return HTCLIENT; |
+ int frame_component = frame_->client_view()->NonClientHitTest(point); |
+ |
// See if we're in the sysmenu region. We still have to check the tabstrip |
// first so that clicks in a tab don't get treated as sysmenu clicks. |
gfx::Rect sysmenu_rect(IconBounds()); |
@@ -371,11 +379,6 @@ |
minimize_button_->GetMirroredBounds().Contains(point)) |
return HTMINBUTTON; |
- // See if the point is within the profile menu button. |
- if (show_profile_button() && profile_button_->IsVisible() && |
- profile_button_->GetMirroredBounds().Contains(point)) |
- return HTCLIENT; |
- |
views::WindowDelegate* delegate = frame_->window_delegate(); |
if (!delegate) { |
LOG(WARNING) << "delegate is NULL, returning safe default."; |
@@ -428,8 +431,6 @@ |
if (browser_view_->IsToolbarVisible() || |
browser_view_->UseCompactNavigationBar()) |
PaintToolbarBackground(canvas); |
- if (browser_view_->ShouldShowOffTheRecordAvatar()) |
- PaintOTRAvatar(canvas); |
if (!frame_->IsMaximized()) |
PaintRestoredClientEdge(canvas); |
} |
@@ -437,8 +438,7 @@ |
void OpaqueBrowserFrameView::Layout() { |
LayoutWindowControls(); |
LayoutTitleBar(); |
- LayoutOTRAvatar(); |
- LayoutProfileTag(); |
+ LayoutAvatar(); |
client_view_bounds_ = CalculateClientAreaBounds(width(), height()); |
} |
@@ -524,7 +524,7 @@ |
DCHECK_EQ(NotificationType::PREF_CHANGED, type.value); |
std::string* name = Details<std::string>(details).ptr(); |
if (prefs::kGoogleServicesUsername == *name) |
- LayoutProfileTag(); |
+ LayoutAvatar(); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -925,27 +925,6 @@ |
w - (2 * kClientEdgeThickness), kClientEdgeThickness); |
} |
-void OpaqueBrowserFrameView::PaintOTRAvatar(gfx::Canvas* canvas) { |
- // In RTL mode, the avatar icon should be looking the opposite direction. |
- canvas->Save(); |
- if (base::i18n::IsRTL()) { |
- canvas->TranslateInt(width(), 0); |
- canvas->ScaleInt(-1, 1); |
- } |
- |
- SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); |
- int w = otr_avatar_bounds_.width(); |
- int h = otr_avatar_bounds_.height(); |
- canvas->DrawBitmapInt(otr_avatar_icon, 0, |
- // Bias the rounding to select a region that's lower rather than higher, |
- // as the shadows at the image top mean the apparent center is below the |
- // real center. |
- ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h, |
- otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false); |
- |
- canvas->Restore(); |
-} |
- |
void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { |
ui::ThemeProvider* tp = GetThemeProvider(); |
int client_area_top = frame_->client_view()->y(); |
@@ -1134,67 +1113,30 @@ |
} |
} |
-void OpaqueBrowserFrameView::LayoutOTRAvatar() { |
- SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); |
- int otr_bottom, otr_restored_y; |
+void OpaqueBrowserFrameView::LayoutAvatar() { |
+ // Even though the avatar is used for both incognito and profiles we always |
+ // use the incognito icon to layout the avatar button. |
+ SkBitmap incognito_icon = browser_view_->GetOTRAvatarIcon(); |
+ |
+ int avatar_bottom, avatar_restored_y; |
if (browser_view_->UseVerticalTabs()) { |
- otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing; |
- otr_restored_y = kFrameShadowThickness; |
+ avatar_bottom = NonClientTopBorderHeight(false, false) - |
+ kAvatarBottomSpacing; |
+ avatar_restored_y = kFrameShadowThickness; |
} else { |
- otr_bottom = GetHorizontalTabStripVerticalOffset(false) + |
- browser_view_->GetTabStripHeight() - kOTRBottomSpacing; |
- otr_restored_y = otr_bottom - otr_avatar_icon.height(); |
+ avatar_bottom = GetHorizontalTabStripVerticalOffset(false) + |
+ browser_view_->GetTabStripHeight() - kAvatarBottomSpacing; |
+ avatar_restored_y = avatar_bottom - incognito_icon.height(); |
} |
- int otr_y = frame_->IsMaximized() ? |
+ int avatar_y = frame_->IsMaximized() ? |
(NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) : |
- otr_restored_y; |
- otr_avatar_bounds_.SetRect(NonClientBorderThickness() + kOTRSideSpacing, |
- otr_y, otr_avatar_icon.width(), |
- browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0); |
-} |
+ avatar_restored_y; |
+ avatar_bounds_.SetRect(NonClientBorderThickness() + kAvatarSideSpacing, |
+ avatar_y, incognito_icon.width(), |
+ browser_view_->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0); |
-void OpaqueBrowserFrameView::LayoutProfileTag() { |
- if (!show_profile_button()) |
- return; |
- |
- string16 profile_name = UTF8ToUTF16(browser_view_->browser()->profile()-> |
- GetPrefs()->GetString(prefs::kGoogleServicesUsername)); |
- if (!profile_name.empty()) { |
- profile_button_->SetText(UTF16ToWideHack(profile_name)); |
- } else { |
- profile_button_->SetText(UTF16ToWideHack(l10n_util::GetStringUTF16( |
- IDS_PROFILES_NOT_SIGNED_IN_MENU))); |
- } |
- profile_button_->SetTextShadowColors(ProfileMenuButton::kDarkTextShadow, |
- ProfileMenuButton::kDarkTextShadow); |
- profile_button_->ClearMaxTextSize(); |
- profile_button_->SetVisible(true); |
- int x_tag = |
- // The x position of minimize button in the frame |
- minimize_button_->x() - |
- // - the space between the minimize button and the profile button |
- ProfileMenuButton::kProfileTagHorizontalSpacing - |
- // - the width of the profile button |
- profile_button_->GetPreferredSize().width(); |
- // Adjust for different default font sizes on different Windows platforms. |
- int y_tag = profile_button_->font().GetHeight() < 14 ? 2 : 0; |
- int maximized = frame_->IsMaximized(); |
- profile_button_->SetBounds( |
- x_tag, |
- maximized ? 0 : y_tag, |
- profile_button_->GetPreferredSize().width(), |
- profile_button_->GetPreferredSize().height()); |
- |
- if (!profile_name.empty()) { |
- profile_tag_->SetVisible(true); |
- profile_tag_->SetBounds( |
- x_tag, |
- maximized ? 0 : kProfileTagYPosition, |
- profile_button_->GetPreferredSize().width(), |
- ProfileTagView::kProfileTagHeight); |
- } else { |
- profile_tag_->SetVisible(false); |
- } |
+ if (avatar_button_.get()) |
+ avatar_button_->SetBoundsRect(avatar_bounds_); |
} |
gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, |