Index: chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
index 45fafb1968a15ed665469c2e7b1f81f60d00ae02..d61a88b69ef7e6d5d462d68956d43c59a5a5f545 100644 |
--- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
+++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
@@ -339,6 +339,62 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
DISALLOW_COPY_AND_ASSIGN(ActiveProfileObserverBridge); |
}; |
+// Custom button cell that adds a left padding before the button image, and |
+// a custom spacing between the button image and title. |
+@interface CustomPaddingImageButtonCell : NSButtonCell { |
+ @private |
+ // Padding added to the left margin of the button. |
+ int leftMarginSpacing_; |
+ // Spacing between the cell image and title. |
+ int imageTitleSpacing_; |
+} |
+ |
+- (id)initWithLeftMarginSpacing:(int)leftMarginSpacing |
+ imageTitleSpacing:(int)imageTitleSpacing; |
+@end |
+ |
+@implementation CustomPaddingImageButtonCell |
+- (id)initWithLeftMarginSpacing:(int)leftMarginSpacing |
+ imageTitleSpacing:(int)imageTitleSpacing { |
+ if ((self = [super init])) { |
+ leftMarginSpacing_ = leftMarginSpacing; |
+ imageTitleSpacing_ = imageTitleSpacing; |
+ } |
+ return self; |
+} |
+ |
+- (NSRect)drawTitle:(NSAttributedString*)title |
+ withFrame:(NSRect)frame |
+ inView:(NSView*)controlView { |
+ NSRect marginRect; |
+ NSDivideRect(frame, &marginRect, &frame, leftMarginSpacing_, NSMinXEdge); |
+ |
+ // The title frame origin isn't aware of the left margin spacing added |
+ // in -drawImage, so it must be added when drawing the title as well. |
+ if ([self imagePosition] == NSImageLeft) |
+ NSDivideRect(frame, &marginRect, &frame, imageTitleSpacing_, NSMinXEdge); |
+ |
+ return [super drawTitle:title withFrame:frame inView:controlView]; |
+} |
+ |
+- (void)drawImage:(NSImage*)image |
+ withFrame:(NSRect)frame |
+ inView:(NSView*)controlView { |
+ if ([self imagePosition] == NSImageLeft) |
+ frame.origin.x = leftMarginSpacing_; |
+ [super drawImage:image withFrame:frame inView:controlView]; |
+} |
+ |
+- (NSSize)cellSize { |
+ NSSize buttonSize = [super cellSize]; |
+ buttonSize.width += leftMarginSpacing_; |
+ if ([self imagePosition] == NSImageLeft) |
+ buttonSize.width += imageTitleSpacing_; |
+ return buttonSize; |
+} |
+ |
+@end |
+ |
// A custom button that has a transparent backround. |
@interface TransparentBackgroundButton : NSButton |
@end |
@@ -354,7 +410,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
} |
- (void)drawRect:(NSRect)dirtyRect { |
- NSColor* backgroundColor = [NSColor colorWithCalibratedWhite:1 alpha:0.4f]; |
+ NSColor* backgroundColor = [NSColor colorWithCalibratedWhite:1 alpha:0.6f]; |
[backgroundColor setFill]; |
NSRectFillUsingOperation(dirtyRect, NSCompositeSourceAtop); |
[super drawRect:dirtyRect]; |
@@ -464,7 +520,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
@end |
// A custom text control that turns into a textfield for editing when clicked. |
-@interface EditableProfileNameButton : HoverImageButton<NSTextFieldDelegate> { |
+@interface EditableProfileNameButton : HoverImageButton { |
@private |
base::scoped_nsobject<NSTextField> profileNameTextField_; |
Profile* profile_; // Weak. |
@@ -480,8 +536,9 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
// Called when the button is clicked. |
- (void)showEditableView:(id)sender; |
-// Called when the user presses "Enter" in the textfield. |
-- (void)controlTextDidEndEditing:(NSNotification *)obj; |
+// Called when enter is pressed in the text field. |
+- (void)saveProfileName:(id)sender; |
+ |
@end |
@implementation EditableProfileNameButton |
@@ -494,12 +551,6 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
profile_ = profile; |
controller_ = controller; |
- [self setBordered:NO]; |
- [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; |
- [self setAlignment:NSCenterTextAlignment]; |
- [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
- [self setTitle:profileName]; |
- |
if (editingAllowed) { |
// Show an "edit" pencil icon when hovering over. In the default state, |
// we need to create an empty placeholder of the correct size, so that |
@@ -507,6 +558,15 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
NSImage* hoverImage = rb->GetNativeImageNamed( |
IDR_ICON_PROFILES_EDIT_HOVER).AsNSImage(); |
+ |
+ // In order to center the button title, we need to add a left padding of |
+ // the same width as the pencil icon. |
+ base::scoped_nsobject<CustomPaddingImageButtonCell> cell( |
+ [[CustomPaddingImageButtonCell alloc] |
+ initWithLeftMarginSpacing:[hoverImage size].width |
+ imageTitleSpacing:0]); |
+ [self setCell:cell.get()]; |
+ |
NSImage* placeholder = [[NSImage alloc] initWithSize:[hoverImage size]]; |
[self setDefaultImage:placeholder]; |
[self setHoverImage:hoverImage]; |
@@ -531,19 +591,24 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
[[profileNameTextField_ cell] setWraps:NO]; |
[[profileNameTextField_ cell] setLineBreakMode: |
NSLineBreakByTruncatingTail]; |
- [profileNameTextField_ setDelegate:self]; |
[self addSubview:profileNameTextField_]; |
+ [profileNameTextField_ setTarget:self]; |
+ [profileNameTextField_ setAction:@selector(saveProfileName:)]; |
// Hide the textfield until the user clicks on the button. |
[profileNameTextField_ setHidden:YES]; |
} |
+ |
+ [self setBordered:NO]; |
+ [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; |
+ [self setAlignment:NSCenterTextAlignment]; |
+ [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
+ [self setTitle:profileName]; |
} |
return self; |
} |
-// NSTextField objects send an NSNotification to a delegate if |
-// it implements this method: |
-- (void)controlTextDidEndEditing:(NSNotification *)obj { |
+- (void)saveProfileName:(id)sender { |
NSString* text = [profileNameTextField_ stringValue]; |
// Empty profile names are not allowed, and are treated as a cancel. |
if ([text length] > 0) { |
@@ -553,61 +618,11 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
[self setTitle:text]; |
} |
[profileNameTextField_ setHidden:YES]; |
- [profileNameTextField_ resignFirstResponder]; |
} |
- (void)showEditableView:(id)sender { |
[profileNameTextField_ setHidden:NO]; |
- [profileNameTextField_ becomeFirstResponder]; |
-} |
- |
-@end |
- |
-// Custom button cell that adds a left padding before the button image, and |
-// a custom spacing between the button image and title. |
-@interface CustomPaddingImageButtonCell : NSButtonCell { |
- @private |
- // Padding between the left margin of the button and the cell image. |
- int leftMarginSpacing_; |
- // Spacing between the cell image and title. |
- int imageTitleSpacing_; |
-} |
- |
-- (id)initWithLeftMarginSpacing:(int)leftMarginSpacing |
- imageTitleSpacing:(int)imageTitleSpacing; |
-@end |
- |
-@implementation CustomPaddingImageButtonCell |
-- (id)initWithLeftMarginSpacing:(int)leftMarginSpacing |
- imageTitleSpacing:(int)imageTitleSpacing { |
- if ((self = [super init])) { |
- leftMarginSpacing_ = leftMarginSpacing; |
- imageTitleSpacing_ = imageTitleSpacing; |
- } |
- return self; |
-} |
- |
-- (NSRect)drawTitle:(NSAttributedString*)title |
- withFrame:(NSRect)frame |
- inView:(NSView*)controlView { |
- // The title frame origin isn't aware of the left margin spacing added |
- // in -drawImage, so it must be added when drawing the title as well. |
- frame.origin.x += leftMarginSpacing_ + imageTitleSpacing_; |
- frame.size.width -= (imageTitleSpacing_ + leftMarginSpacing_); |
- return [super drawTitle:title withFrame:frame inView:controlView]; |
-} |
- |
-- (void)drawImage:(NSImage*)image |
- withFrame:(NSRect)frame |
- inView:(NSView*)controlView { |
- frame.origin.x = leftMarginSpacing_; |
- [super drawImage:image withFrame:frame inView:controlView]; |
-} |
- |
-- (NSSize)cellSize { |
- NSSize buttonSize = [super cellSize]; |
- buttonSize.width += leftMarginSpacing_ + imageTitleSpacing_; |
- return buttonSize; |
+ [[self window] makeFirstResponder:profileNameTextField_]; |
} |
@end |
@@ -1006,8 +1021,9 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
currentProfileView = [self createGuestProfileView]; |
// |yOffset| is the next position at which to draw in |container| |
- // coordinates. |
- CGFloat yOffset = 0; |
+ // coordinates. Add a pixel offset so that the bottom option buttons don't |
+ // overlap the bubble's rounded corners. |
+ CGFloat yOffset = 1; |
// Option buttons. Only available with the new profile management flag. |
if (switches::IsNewProfileManagement()) { |
@@ -1017,7 +1033,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
[container addSubview:optionsView]; |
rect.origin.y = NSMaxY([optionsView frame]); |
- NSBox* separator = [self separatorWithFrame:rect]; |
+ NSBox* separator = [self horizontalSeparatorWithFrame:rect]; |
[container addSubview:separator]; |
yOffset = NSMaxY([separator frame]); |
} |
@@ -1031,8 +1047,8 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
[container addSubview:otherProfileView]; |
yOffset = NSMaxY([otherProfileView frame]); |
- NSBox* separator = |
- [self separatorWithFrame:NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; |
+ NSBox* separator = [self horizontalSeparatorWithFrame:NSMakeRect( |
+ 0, yOffset, kFixedMenuWidth, 0)]; |
[container addSubview:separator]; |
yOffset = NSMaxY([separator frame]); |
} |
@@ -1047,8 +1063,8 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
yOffset = NSMaxY([disclaimerContainer frame]); |
yOffset += kSmallVerticalSpacing; |
- NSBox* separator = |
- [self separatorWithFrame:NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; |
+ NSBox* separator = [self horizontalSeparatorWithFrame:NSMakeRect( |
+ 0, yOffset, kFixedMenuWidth, 0)]; |
[container addSubview:separator]; |
yOffset = NSMaxY([separator frame]); |
} |
@@ -1059,7 +1075,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
[container addSubview:currentProfileAccountsView]; |
yOffset = NSMaxY([currentProfileAccountsView frame]); |
- NSBox* accountsSeparator = [self separatorWithFrame: |
+ NSBox* accountsSeparator = [self horizontalSeparatorWithFrame: |
NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; |
[container addSubview:accountsSeparator]; |
yOffset = NSMaxY([accountsSeparator frame]); |
@@ -1446,7 +1462,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
- (NSView*)createOptionsViewWithRect:(NSRect)rect |
enableLock:(BOOL)enableLock { |
- int widthOfLockButton = enableLock? 2 * kHorizontalSpacing + 12 : 0; |
+ int widthOfLockButton = enableLock ? 2 * kHorizontalSpacing + 14 : 0; |
NSRect viewRect = NSMakeRect(0, 0, |
rect.size.width - widthOfLockButton, |
kBlueButtonHeight + kVerticalSpacing); |
@@ -1468,6 +1484,10 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
if (enableLock) { |
viewRect.origin.x = NSMaxX([notYouButton frame]); |
+ NSBox* separator = [self verticalSeparatorWithFrame:viewRect]; |
+ [container addSubview:separator]; |
+ |
+ viewRect.origin.x = NSMaxX([separator frame]); |
viewRect.size.width = widthOfLockButton; |
NSButton* lockButton = |
[self hoverButtonWithRect:viewRect |
@@ -1607,7 +1627,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
yOffset = NSMaxY([webview frame]); |
// Adds the title card. |
- NSBox* separator = [self separatorWithFrame: |
+ NSBox* separator = [self horizontalSeparatorWithFrame: |
NSMakeRect(0, yOffset, kFixedGaiaViewWidth, 0)]; |
[container addSubview:separator]; |
yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; |
@@ -1678,7 +1698,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
yOffset = NSMaxY([contentView frame]) + kVerticalSpacing; |
// Adds the title card. |
- NSBox* separator = [self separatorWithFrame: |
+ NSBox* separator = [self horizontalSeparatorWithFrame: |
NSMakeRect(0, yOffset, kFixedAccountRemovalViewWidth, 0)]; |
[container addSubview:separator]; |
yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; |
@@ -1729,7 +1749,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
yOffset = NSMaxY([contentLabel frame]) + kVerticalSpacing; |
// Adds the title card. |
- NSBox* separator = [self separatorWithFrame: |
+ NSBox* separator = [self horizontalSeparatorWithFrame: |
NSMakeRect(0, yOffset, kFixedEndPreviewViewWidth, 0)]; |
[container addSubview:separator]; |
yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; |