Chromium Code Reviews| Index: chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm |
| diff --git a/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm b/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm |
| index 31a300c138527a8a38f61e6a64c9a2fea908a275..c180e5dc3eba16b3698fc88095bca5f73bc04b9b 100644 |
| --- a/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm |
| +++ b/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm |
| @@ -6,6 +6,8 @@ |
| #include "base/mac/foundation_util.h" |
| #include "base/strings/sys_string_conversions.h" |
| +#include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/profiles/profiles_state.h" |
| #include "chrome/browser/themes/theme_service.h" |
| #include "chrome/browser/themes/theme_service_factory.h" |
| @@ -25,10 +27,10 @@ |
| namespace { |
| -const CGFloat kButtonPadding = 12; |
| -const CGFloat kButtonDefaultPadding = 5; |
| -const CGFloat kButtonHeight = 27; |
| -const CGFloat kButtonTitleImageSpacing = 10; |
| +// NSButtons have a default padding of 5px. This button should have a padding |
| +// of 8px. |
| +const CGFloat kButtonExtraPadding = 3; |
| +const CGFloat kButtonHeight = 28; |
| const ui::NinePartImageIds kNormalBorderImageIds = |
| IMAGE_GRID(IDR_AVATAR_MAC_BUTTON_NORMAL); |
| @@ -50,7 +52,7 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| @interface CustomThemeButtonCell : NSButtonCell { |
| @private |
| BOOL isThemedWindow_; |
| - base::scoped_nsobject<NSImage> authenticationErrorImage_; |
| + BOOL hasError_; |
| } |
| - (void)setIsThemedWindow:(BOOL)isThemedWindow; |
| - (void)setHasError:(BOOL)hasError withTitle:(NSString*)title; |
| @@ -61,56 +63,39 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| - (id)initWithThemedWindow:(BOOL)isThemedWindow { |
| if ((self = [super init])) { |
| isThemedWindow_ = isThemedWindow; |
| - authenticationErrorImage_.reset(); |
| + hasError_ = false; |
| } |
| return self; |
| } |
| - (NSSize)cellSize { |
| NSSize buttonSize = [super cellSize]; |
| - CGFloat errorWidth = [authenticationErrorImage_ size].width; |
| - buttonSize.width += 2 * (kButtonPadding - kButtonDefaultPadding) + errorWidth; |
| + |
| + // An image and no error means we are drawing the generic button, which |
| + // is square. Otherwise, we are displaying the profile's name and an |
| + // optional authentication error icon. |
| + if ([self image] && !hasError_) { |
| + buttonSize.width = kButtonHeight; |
| + } else { |
| + buttonSize.width += 2 * kButtonExtraPadding; |
| + } |
| buttonSize.height = kButtonHeight; |
| return buttonSize; |
| } |
| -- (NSRect)drawTitle:(NSAttributedString*)title |
| - withFrame:(NSRect)frame |
| - inView:(NSView*)controlView { |
| - frame.origin.x = kButtonPadding; |
| - |
| - // If there's an auth error, draw a warning icon before the cell image. |
| - if (authenticationErrorImage_) { |
| - NSSize imageSize = [authenticationErrorImage_ size]; |
| - NSRect rect = NSMakeRect( |
| - frame.size.width - imageSize.width, |
| - (kButtonHeight - imageSize.height) / 2, |
| - imageSize.width, |
| - imageSize.height); |
| - [authenticationErrorImage_ drawInRect:rect |
| - fromRect:NSZeroRect |
| - operation:NSCompositeSourceOver |
| - fraction:1.0 |
| - respectFlipped:YES |
| - hints:nil]; |
| - // Padding between the title and the error image. |
| - frame.size.width -= kButtonTitleImageSpacing; |
| - } |
| - |
| - // Padding between the title (or error image, if it exists) and the |
| - // button's drop down image. |
| - frame.size.width -= kButtonTitleImageSpacing; |
| - return [super drawTitle:title withFrame:frame inView:controlView]; |
| +- (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView*)controlView { |
| + NSRect frameAfterPadding = NSInsetRect(frame, kButtonExtraPadding, 0); |
| + [super drawInteriorWithFrame:frameAfterPadding inView:controlView]; |
| } |
| - (void)drawImage:(NSImage*)image |
| withFrame:(NSRect)frame |
| inView:(NSView*)controlView { |
| - // For the x-offset, we need to undo the default padding and apply the |
| - // new one. For the y-offset, increasing the button height means we need |
| - // to move the image a little down to align it nicely with the text; this |
| - // was chosen by visual inspection. |
| - frame = NSOffsetRect(frame, kButtonDefaultPadding - kButtonPadding, 2); |
| + // The image used in the generic button case needs to be shifted down |
| + // slightly to be centered correctly. |
| + // TODO(noms): When the assets are fixed, remove this latter offset. |
| + if (!hasError_) |
| + frame = NSOffsetRect(frame, 0, 1); |
| [super drawImage:image withFrame:frame inView:controlView]; |
| } |
| @@ -134,18 +119,15 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| } |
| - (void)setHasError:(BOOL)hasError withTitle:(NSString*)title { |
| + hasError_ = hasError; |
| if (hasError) { |
| - authenticationErrorImage_.reset( |
| - [ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| - IDR_ICON_PROFILES_AVATAR_BUTTON_ERROR).ToNSImage() retain]); |
| [self accessibilitySetOverrideValue:l10n_util::GetNSStringF( |
| IDS_PROFILES_ACCOUNT_BUTTON_AUTH_ERROR_ACCESSIBLE_NAME, |
| base::SysNSStringToUTF16(title)) |
| forAttribute:NSAccessibilityTitleAttribute]; |
| } else { |
| - authenticationErrorImage_.reset(); |
| [self accessibilitySetOverrideValue:title |
| - forAttribute:NSAccessibilityTitleAttribute]; |
| + forAttribute:NSAccessibilityTitleAttribute]; |
| } |
| } |
| @@ -168,13 +150,6 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| HoverImageButton* hoverButton = |
| [[HoverImageButton alloc] initWithFrame:NSZeroRect]; |
| - [hoverButton setDefaultImage:GetImageFromResourceID( |
| - IDR_AVATAR_MAC_BUTTON_DROPARROW)]; |
| - [hoverButton setHoverImage:GetImageFromResourceID( |
| - IDR_AVATAR_MAC_BUTTON_DROPARROW_HOVER)]; |
| - [hoverButton setPressedImage:GetImageFromResourceID( |
| - IDR_AVATAR_MAC_BUTTON_DROPARROW_PRESSED)]; |
| - |
| button_.reset(hoverButton); |
| base::scoped_nsobject<CustomThemeButtonCell> cell( |
| [[CustomThemeButtonCell alloc] initWithThemedWindow:isThemedWindow_]); |
| @@ -183,8 +158,11 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| [button_ setCell:cell.get()]; |
| - if (errorController) |
| - [cell setHasError:errorController->HasError() withTitle:[button_ title]]; |
| + hasError_ = false; |
| + if (errorController) { |
| + hasError_ = errorController->HasError(); |
| + [cell setHasError:hasError_ withTitle:[button_ title]]; |
|
groby-ooo-7-16
2014/09/25 22:03:30
1) Isn't [button title] empty at this point? It ju
noms (inactive)
2014/09/26 15:49:10
Done.
|
| + } |
| [button_ setWantsLayer:YES]; |
| [self setView:button_]; |
| @@ -192,10 +170,7 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| [button_ setBezelStyle:NSShadowlessSquareBezelStyle]; |
| [button_ setButtonType:NSMomentaryChangeButton]; |
| [button_ setBordered:YES]; |
| - // This is a workaround for an issue in the HoverImageButton where the |
| - // button is initially sized incorrectly unless a default image is provided. |
| - [button_ setImage:GetImageFromResourceID(IDR_AVATAR_MAC_BUTTON_DROPARROW)]; |
| - [button_ setImagePosition:NSImageRight]; |
| + |
| [button_ setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin]; |
| [button_ setTarget:self]; |
| [button_ setAction:@selector(buttonClicked:)]; |
| @@ -248,9 +223,47 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| [shadow setShadowColor:[NSColor colorWithCalibratedWhite:1.0 alpha:0.4]]; |
| } |
| - NSString* buttonTitle = base::SysUTF16ToNSString( |
| + const ProfileInfoCache& cache = |
| + g_browser_process->profile_manager()->GetProfileInfoCache(); |
|
groby-ooo-7-16
2014/09/25 22:03:30
I suppose it's the only way to get the cache :( I'
noms (inactive)
2014/09/26 15:49:10
Yes ma'am. Chrome is peppered with this sad line,
|
| + // 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 useGenericButton = (!browser_->profile()->IsGuestSession() && |
| + cache.GetNumberOfProfiles() == 1 && |
| + cache.GetUserNameOfProfileAtIndex(0).empty()); |
| + |
| + |
| + NSString* buttonTitle = base::SysUTF16ToNSString(useGenericButton ? |
| + base::string16() : |
| profiles::GetAvatarButtonTextForProfile(browser_->profile())); |
| + HoverImageButton* button = base::mac::ObjCCast<HoverImageButton>(button_); |
|
groby-ooo-7-16
2014/09/25 22:03:30
Why not just make button_ a HoverImageButton? That
noms (inactive)
2014/09/26 15:49:10
button_ is defined in AvatarBaseController. Avatar
groby-ooo-7-16
2014/09/29 17:55:43
I keep missing that fact, don't I? No, you probabl
noms (inactive)
2014/09/29 19:21:57
Done.
|
| + if (useGenericButton) { |
| + [button setDefaultImage:GetImageFromResourceID( |
| + IDR_AVATAR_MAC_BUTTON_AVATAR)]; |
| + [button setHoverImage:GetImageFromResourceID( |
| + IDR_AVATAR_MAC_BUTTON_AVATAR_HOVER)]; |
| + [button setPressedImage:GetImageFromResourceID( |
| + IDR_AVATAR_MAC_BUTTON_AVATAR_PRESSED)]; |
| + // This is a workaround for an issue in the HoverImageButton where the |
| + // button is initially sized incorrectly unless a default image is provided. |
|
groby-ooo-7-16
2014/09/25 22:03:30
Can you point to crbug?
noms (inactive)
2014/09/26 15:49:10
Done.
|
| + [button setImage:GetImageFromResourceID(IDR_AVATAR_MAC_BUTTON_AVATAR)]; |
| + [button setImagePosition:NSImageOnly]; |
| + } else if (hasError_) { |
| + [button setDefaultImage:GetImageFromResourceID( |
| + IDR_ICON_PROFILES_AVATAR_BUTTON_ERROR)]; |
| + [button setHoverImage:nil]; |
| + [button setPressedImage:nil]; |
| + [button setImage:GetImageFromResourceID( |
| + IDR_ICON_PROFILES_AVATAR_BUTTON_ERROR)]; |
| + [button setImagePosition:NSImageRight]; |
| + } else { |
| + [button setDefaultImage:nil]; |
| + [button setHoverImage:nil]; |
| + [button setPressedImage:nil]; |
| + [button setImagePosition:NSNoImage]; |
| + } |
| + |
| base::scoped_nsobject<NSMutableParagraphStyle> paragraphStyle( |
| [[NSMutableParagraphStyle alloc] init]); |
| [paragraphStyle setAlignment:NSLeftTextAlignment]; |
| @@ -274,6 +287,7 @@ NSImage* GetImageFromResourceID(int resourceId) { |
| } |
| - (void)updateErrorStatus:(BOOL)hasError { |
| + hasError_ = hasError; |
| [[button_ cell] setHasError:hasError withTitle:[button_ title]]; |
| [self updateAvatarButtonAndLayoutParent:YES]; |
| } |