summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/theme/default_100_percent/win/avatar_button/themed/sign_in_button_arrow.pngbin173 -> 0 bytes
-rw-r--r--chrome/app/theme/default_100_percent/win/avatar_button/win7/sign_in_button_arrow.pngbin101 -> 0 bytes
-rw-r--r--chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_arrow.pngbin94 -> 0 bytes
-rw-r--r--chrome/app/theme/theme_resources.grd6
-rw-r--r--chrome/browser/ui/views/frame/browser_non_client_frame_view.cc6
-rw-r--r--chrome/browser/ui/views/frame/glass_browser_frame_view.cc10
-rw-r--r--chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc26
-rw-r--r--chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc7
-rw-r--r--chrome/browser/ui/views/profiles/new_avatar_button.cc76
-rw-r--r--chrome/browser/ui/views/profiles/new_avatar_button.h17
-rw-r--r--chrome/browser/ui/views/tabs/tab_strip.h14
11 files changed, 100 insertions, 62 deletions
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/themed/sign_in_button_arrow.png b/chrome/app/theme/default_100_percent/win/avatar_button/themed/sign_in_button_arrow.png
deleted file mode 100644
index 085ee20..0000000
--- a/chrome/app/theme/default_100_percent/win/avatar_button/themed/sign_in_button_arrow.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win7/sign_in_button_arrow.png b/chrome/app/theme/default_100_percent/win/avatar_button/win7/sign_in_button_arrow.png
deleted file mode 100644
index b36bdb6..0000000
--- a/chrome/app/theme/default_100_percent/win/avatar_button/win7/sign_in_button_arrow.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_arrow.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_arrow.png
deleted file mode 100644
index 03316a9..0000000
--- a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_arrow.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index e3b17d3..f8760da 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -678,7 +678,7 @@
<!-- New style avatar button -->
<if expr="toolkit_views">
<!-- Windows, themed -->
- <structure type="chrome_scaled_image" name="IDR_AVATAR_THEMED_BUTTON_DROPARROW" file="win/avatar_button/themed/sign_in_button_arrow.png" />
+ <structure type="chrome_scaled_image" name="IDR_AVATAR_THEMED_BUTTON_AVATAR" file="win/avatar_button/themed/sign_in_button_avatar.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_THEMED_BUTTON_NORMAL_BOTTOM" file="win/avatar_button/themed/sign_in_button_bottom.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_THEMED_BUTTON_NORMAL_BOTTOM_LEFT" file="win/avatar_button/themed/sign_in_button_bottom_left.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_THEMED_BUTTON_NORMAL_BOTTOM_RIGHT" file="win/avatar_button/themed/sign_in_button_bottom_right.png" />
@@ -708,7 +708,7 @@
<structure type="chrome_scaled_image" name="IDR_AVATAR_THEMED_BUTTON_PRESSED_TOP_RIGHT" file="win/avatar_button/themed/sign_in_button_pressed_top_right.png" />
<!-- Windows, Aero -->
- <structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_DROPARROW" file="win/avatar_button/win7/sign_in_button_arrow.png" />
+ <structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_AVATAR" file="win/avatar_button/win7/sign_in_button_avatar.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_NORMAL_BOTTOM" file="win/avatar_button/win7/sign_in_button_bottom.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_NORMAL_BOTTOM_LEFT" file="win/avatar_button/win7/sign_in_button_bottom_left.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_NORMAL_BOTTOM_RIGHT" file="win/avatar_button/win7/sign_in_button_bottom_right.png" />
@@ -738,7 +738,7 @@
<structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_PRESSED_TOP_RIGHT" file="win/avatar_button/win7/sign_in_button_pressed_top_right.png" />
<!-- Windows, metro -->
- <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_DROPARROW" file="win/avatar_button/win8/sign_in_button_arrow.png" />
+ <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_AVATAR" file="win/avatar_button/win8/sign_in_button_avatar.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_BOTTOM" file="win/avatar_button/win8/sign_in_button_bottom.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_BOTTOM_LEFT" file="win/avatar_button/win8/sign_in_button_bottom_left.png" />
<structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_BOTTOM_RIGHT" file="win/avatar_button/win8/sign_in_button_bottom_right.png" />
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
index ea8a110..232ad19 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -146,10 +146,8 @@ void BrowserNonClientFrameView::UpdateNewStyleAvatarInfo(
if (browser_view_->ShouldShowAvatar()) {
if (!new_avatar_button_) {
- base::string16 profile_name = profiles::GetAvatarNameForProfile(
- browser_view_->browser()->profile()->GetPath());
- new_avatar_button_ = new NewAvatarButton(
- listener, profile_name, style, browser_view_->browser());
+ new_avatar_button_ =
+ new NewAvatarButton(listener, style, browser_view_->browser());
new_avatar_button_->set_id(VIEW_ID_NEW_AVATAR_BUTTON);
AddChildView(new_avatar_button_);
frame_->GetRootView()->Layout();
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
index 116a7b9..3e59d005 100644
--- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
@@ -112,7 +112,15 @@ gfx::Rect GlassBrowserFrameView::GetBoundsForTabStrip(
// minimize button.
if (new_avatar_button()) {
DCHECK(switches::IsNewAvatarMenu());
- minimize_button_offset -= new_avatar_button()->width();
+ minimize_button_offset -=
+ new_avatar_button()->width() + kNewAvatarButtonOffset;
+
+ // In non-maximized mode, allow the new tab button to completely slide under
+ // the avatar button.
+ if (!frame()->IsMaximized() && !base::i18n::IsRTL()) {
+ minimize_button_offset +=
+ TabStrip::kNewTabButtonAssetWidth + kNewTabCaptionRestoredSpacing;
+ }
}
int tabstrip_x = browser_view()->ShouldShowAvatar() ?
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
index 6366fad..a7dd9d9 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/browser/ui/views/profiles/avatar_label.h"
#include "chrome/browser/ui/views/profiles/avatar_menu_button.h"
+#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include "chrome/common/chrome_switches.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "ui/gfx/font.h"
@@ -382,21 +383,26 @@ void OpaqueBrowserFrameViewLayout::LayoutNewStyleAvatar(views::View* host) {
if (!new_avatar_button_)
return;
- gfx::Size label_size = new_avatar_button_->GetPreferredSize();
- int button_size_with_offset = kNewAvatarButtonOffset + label_size.width();
+ int button_width = new_avatar_button_->GetPreferredSize().width();
+ int button_width_with_offset = button_width + kNewAvatarButtonOffset;
- int button_x = host->width() - trailing_button_start_ -
- button_size_with_offset;
+ int button_x =
+ host->width() - trailing_button_start_ - button_width_with_offset;
int button_y = CaptionButtonY(!IsTitleBarCondensed());
- trailing_button_start_ += button_size_with_offset;
- minimum_size_for_buttons_ += button_size_with_offset;
+ minimum_size_for_buttons_ += button_width_with_offset;
+ trailing_button_start_ += button_width_with_offset;
+
+ // In non-maximized mode, allow the new tab button to completely slide under
+ // the avatar button.
+ if (!IsTitleBarCondensed()) {
+ trailing_button_start_ -=
+ TabStrip::kNewTabButtonAssetWidth + kNewTabCaptionNormalSpacing;
+ }
// Do not include the 1px padding that is added for the caption buttons.
- new_avatar_button_->SetBounds(button_x,
- button_y,
- label_size.width(),
- kCaptionButtonHeightWithPadding - 1);
+ new_avatar_button_->SetBounds(
+ button_x, button_y, button_width, kCaptionButtonHeightWithPadding - 1);
}
void OpaqueBrowserFrameViewLayout::LayoutAvatar(views::View* host) {
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
index dca72d8..8579da2 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
@@ -528,10 +528,9 @@ TEST_F(OpaqueBrowserFrameViewLayoutTest, WindowWithNewAvatar) {
// Check the location of the avatar button.
EXPECT_EQ("385,1 12x18", new_avatar_button_->bounds().ToString());
- // The basic window bounds are (-1, 13 398x29). There should not be an icon
- // avatar in the left, and the new avatar button has an offset of 5 to its
- // next control.
- EXPECT_EQ("-1,13 381x29",
+ // The new tab button is 39px wide and slides completely under the new
+ // avatar button, thus increasing the tabstrip by that amount.
+ EXPECT_EQ("-1,13 420x29",
layout_manager_->GetBoundsForTabStrip(
delegate_->GetTabstripPreferredSize(), kWidth).ToString());
EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString());
diff --git a/chrome/browser/ui/views/profiles/new_avatar_button.cc b/chrome/browser/ui/views/profiles/new_avatar_button.cc
index 2e3647c..ef9a22e 100644
--- a/chrome/browser/ui/views/profiles/new_avatar_button.cc
+++ b/chrome/browser/ui/views/profiles/new_avatar_button.cc
@@ -31,8 +31,8 @@ scoped_ptr<views::Border> CreateBorder(const int normal_image_set[],
border->SetPainter(false, views::Button::STATE_PRESSED,
views::Painter::CreateImageGridPainter(pushed_image_set));
- const int kLeftRightInset = 10;
- const int kTopInset = 0;
+ const int kLeftRightInset = 8;
+ const int kTopInset = 2;
const int kBottomInset = 4;
border->set_insets(gfx::Insets(kTopInset, kLeftRightInset,
kBottomInset, kLeftRightInset));
@@ -42,16 +42,12 @@ scoped_ptr<views::Border> CreateBorder(const int normal_image_set[],
} // namespace
-NewAvatarButton::NewAvatarButton(
- views::ButtonListener* listener,
- const base::string16& profile_name,
- AvatarButtonStyle button_style,
- Browser* browser)
- : MenuButton(listener,
- profiles::GetAvatarButtonTextForProfile(browser->profile()),
- NULL,
- true),
+NewAvatarButton::NewAvatarButton(views::ButtonListener* listener,
+ AvatarButtonStyle button_style,
+ Browser* browser)
+ : LabelButton(listener, base::string16()),
browser_(browser),
+ has_auth_error_(false),
suppress_mouse_released_action_(false) {
set_animate_on_state_change(false);
SetTextColor(views::Button::STATE_NORMAL, SK_ColorWHITE);
@@ -60,6 +56,7 @@ NewAvatarButton::NewAvatarButton(
SetTextShadows(gfx::ShadowValues(10,
gfx::ShadowValue(gfx::Point(), 1.0f, SK_ColorDKGRAY)));
SetTextSubpixelRenderingEnabled(false);
+ SetHorizontalAlignment(gfx::ALIGN_CENTER);
// The largest text height that fits in the button. If the font list height
// is larger than this, it will be shrunk to match it.
@@ -74,8 +71,8 @@ NewAvatarButton::NewAvatarButton(
const int kPushedImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_PRESSED);
SetBorder(CreateBorder(kNormalImageSet, kHotImageSet, kPushedImageSet));
- set_menu_marker(
- rb->GetImageNamed(IDR_AVATAR_THEMED_BUTTON_DROPARROW).ToImageSkia());
+ generic_avatar_ =
+ *rb->GetImageNamed(IDR_AVATAR_THEMED_BUTTON_AVATAR).ToImageSkia();
#if defined(OS_WIN)
} else if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_METRO_BUTTON_NORMAL);
@@ -83,8 +80,8 @@ NewAvatarButton::NewAvatarButton(
const int kPushedImageSet[] = IMAGE_GRID(IDR_AVATAR_METRO_BUTTON_PRESSED);
SetBorder(CreateBorder(kNormalImageSet, kHotImageSet, kPushedImageSet));
- set_menu_marker(
- rb->GetImageNamed(IDR_AVATAR_METRO_BUTTON_DROPARROW).ToImageSkia());
+ generic_avatar_ =
+ *rb->GetImageNamed(IDR_AVATAR_METRO_BUTTON_AVATAR).ToImageSkia();
#endif
} else {
const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_NORMAL);
@@ -92,8 +89,8 @@ NewAvatarButton::NewAvatarButton(
const int kPushedImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_PRESSED);
SetBorder(CreateBorder(kNormalImageSet, kHotImageSet, kPushedImageSet));
- set_menu_marker(
- rb->GetImageNamed(IDR_AVATAR_GLASS_BUTTON_DROPARROW).ToImageSkia());
+ generic_avatar_ =
+ *rb->GetImageNamed(IDR_AVATAR_GLASS_BUTTON_AVATAR).ToImageSkia();
}
g_browser_process->profile_manager()->GetProfileInfoCache().AddObserver(this);
@@ -104,9 +101,11 @@ NewAvatarButton::NewAvatarButton(
profiles::GetSigninErrorController(browser_->profile());
if (error) {
error->AddObserver(this);
+ // This calls UpdateAvatarButtonAndRelayoutParent().
OnErrorChanged();
+ } else {
+ UpdateAvatarButtonAndRelayoutParent();
}
-
SchedulePaint();
}
@@ -122,14 +121,14 @@ NewAvatarButton::~NewAvatarButton() {
bool NewAvatarButton::OnMousePressed(const ui::MouseEvent& event) {
// Prevent the bubble from being re-shown if it's already showing.
suppress_mouse_released_action_ = ProfileChooserView::IsShowing();
- return MenuButton::OnMousePressed(event);
+ return LabelButton::OnMousePressed(event);
}
void NewAvatarButton::OnMouseReleased(const ui::MouseEvent& event) {
if (suppress_mouse_released_action_)
suppress_mouse_released_action_ = false;
else
- MenuButton::OnMouseReleased(event);
+ LabelButton::OnMouseReleased(event);
}
void NewAvatarButton::OnProfileAdded(const base::FilePath& profile_path) {
@@ -159,24 +158,45 @@ void NewAvatarButton::OnProfileSupervisedUserIdChanged(
}
void NewAvatarButton::OnErrorChanged() {
- gfx::ImageSkia icon;
-
// If there is an error, show an warning icon.
const SigninErrorController* error =
profiles::GetSigninErrorController(browser_->profile());
- if (error && error->HasError()) {
- icon = *ui::ResourceBundle::GetSharedInstance().GetImageNamed(
- IDR_ICON_PROFILES_AVATAR_BUTTON_ERROR).ToImageSkia();
- }
+ has_auth_error_ = error && error->HasError();
- SetImage(views::Button::STATE_NORMAL, icon);
UpdateAvatarButtonAndRelayoutParent();
}
void NewAvatarButton::UpdateAvatarButtonAndRelayoutParent() {
+ const ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+
+ // If we have a single local profile, then use the generic avatar
+ // button instead of the profile name. Never use the generic button if
+ // the active profile is Guest.
+ bool use_generic_button = (!browser_->profile()->IsGuestSession() &&
+ cache.GetNumberOfProfiles() == 1 &&
+ cache.GetUserNameOfProfileAtIndex(0).empty());
+
+ SetText(use_generic_button ? base::string16() :
+ profiles::GetAvatarButtonTextForProfile(browser_->profile()));
// We want the button to resize if the new text is shorter.
- SetText(profiles::GetAvatarButtonTextForProfile(browser_->profile()));
SetMinSize(gfx::Size());
+
+ if (use_generic_button) {
+ SetImage(views::Button::STATE_NORMAL, generic_avatar_);
+ } else if (has_auth_error_) {
+ SetImage(views::Button::STATE_NORMAL,
+ *ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+ IDR_ICON_PROFILES_AVATAR_BUTTON_ERROR).ToImageSkia());
+ } else {
+ SetImage(views::Button::STATE_NORMAL, gfx::ImageSkia());
+ }
+
+ // If we are not using the generic button, then reset the spacing between
+ // the text and the possible authentication error icon.
+ const int kDefaultImageTextSpacing = 5;
+ SetImageLabelSpacing(use_generic_button ? 0 : kDefaultImageTextSpacing);
+
InvalidateLayout();
// Because the width of the button might have changed, the parent browser
diff --git a/chrome/browser/ui/views/profiles/new_avatar_button.h b/chrome/browser/ui/views/profiles/new_avatar_button.h
index 917a696..76c40bf 100644
--- a/chrome/browser/ui/views/profiles/new_avatar_button.h
+++ b/chrome/browser/ui/views/profiles/new_avatar_button.h
@@ -7,12 +7,12 @@
#include "chrome/browser/profiles/profile_info_cache_observer.h"
#include "components/signin/core/browser/signin_error_controller.h"
-#include "ui/views/controls/button/menu_button.h"
+#include "ui/views/controls/button/label_button.h"
class Browser;
// Avatar button that displays the active profile's name in the caption area.
-class NewAvatarButton : public views::MenuButton,
+class NewAvatarButton : public views::LabelButton,
public ProfileInfoCacheObserver,
public SigninErrorController::Observer {
public:
@@ -23,12 +23,11 @@ class NewAvatarButton : public views::MenuButton,
};
NewAvatarButton(views::ButtonListener* listener,
- const base::string16& profile_name,
AvatarButtonStyle button_style,
Browser* browser);
virtual ~NewAvatarButton();
- // Views::MenuButton
+ // Views::LabelButton
virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
@@ -55,11 +54,19 @@ class NewAvatarButton : public views::MenuButton,
virtual void OnErrorChanged() OVERRIDE;
// Called when the profile info cache has changed, which means we might
- // have to re-display the profile name.
+ // have to update the icon/text of the button.
void UpdateAvatarButtonAndRelayoutParent();
Browser* browser_;
+ // Whether the signed in profile has an authentication error. Used to display
+ // an error icon next to the button text.
+ bool has_auth_error_;
+
+ // The icon displayed instead of the profile name in the local profile case.
+ // Different assets are used depending on the OS version.
+ gfx::ImageSkia generic_avatar_;
+
// This is used to check if the bubble was showing during the mouse pressed
// event. If this is true then the mouse released event is ignored to prevent
// the bubble from reshowing.
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h
index 9bac2da..34cc810 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.h
+++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -66,6 +66,13 @@ class TabStrip : public views::View,
// restored windows.
static const int kNewTabButtonVerticalOffset;
+ // The size of the new tab button must be hardcoded because we need to be
+ // able to lay it out before we are able to get its image from the
+ // ui::ThemeProvider. It also makes sense to do this, because the size of the
+ // new tab button should not need to be calculated dynamically.
+ static const int kNewTabButtonAssetWidth;
+ static const int kNewTabButtonAssetHeight;
+
explicit TabStrip(TabStripController* controller);
virtual ~TabStrip();
@@ -311,13 +318,6 @@ class TabStrip : public views::View,
// Horizontal gap between mini and non-mini-tabs.
static const int kMiniToNonMiniGap;
- // The size of the new tab button must be hardcoded because we need to be
- // able to lay it out before we are able to get its image from the
- // ui::ThemeProvider. It also makes sense to do this, because the size of the
- // new tab button should not need to be calculated dynamically.
- static const int kNewTabButtonAssetWidth;
- static const int kNewTabButtonAssetHeight;
-
void Init();
// Creates and returns a new tab. The caller owners the returned tab.