Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" | 7 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" |
| 8 | 8 |
| 9 #include "base/mac/bundle_locations.h" | 9 #include "base/mac/bundle_locations.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 709 imageResourceId:(int)imageResourceId | 709 imageResourceId:(int)imageResourceId |
| 710 alternateImageResourceId:(int)alternateImageResourceId | 710 alternateImageResourceId:(int)alternateImageResourceId |
| 711 action:(SEL)action; | 711 action:(SEL)action; |
| 712 | 712 |
| 713 // Creates a generic link button with |title| and an |action| positioned at | 713 // Creates a generic link button with |title| and an |action| positioned at |
| 714 // |frameOrigin|. | 714 // |frameOrigin|. |
| 715 - (NSButton*)linkButtonWithTitle:(NSString*)title | 715 - (NSButton*)linkButtonWithTitle:(NSString*)title |
| 716 frameOrigin:(NSPoint)frameOrigin | 716 frameOrigin:(NSPoint)frameOrigin |
| 717 action:(SEL)action; | 717 action:(SEL)action; |
| 718 | 718 |
| 719 // Creates an email account button with |title| and a remove icon. | 719 // Creates an email account button with |title| and a remove icon. |tag| |
| 720 // indicates which account the button refers to. | |
| 720 - (NSButton*)accountButtonWithRect:(NSRect)rect | 721 - (NSButton*)accountButtonWithRect:(NSRect)rect |
| 721 title:(const std::string&)title; | 722 title:(const std::string&)title |
| 723 tag:(int)tag; | |
| 722 | 724 |
| 723 @end | 725 @end |
| 724 | 726 |
| 725 @implementation ProfileChooserController | 727 @implementation ProfileChooserController |
| 726 - (BubbleViewMode) viewMode { | 728 - (BubbleViewMode) viewMode { |
| 727 return viewMode_; | 729 return viewMode_; |
| 728 } | 730 } |
| 729 | 731 |
| 730 - (IBAction)switchToProfile:(id)sender { | 732 - (IBAction)switchToProfile:(id)sender { |
| 731 // Check the event flags to see if a new window should be created. | 733 // Check the event flags to see if a new window should be created. |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1331 SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedUsername(); | 1333 SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedUsername(); |
| 1332 DCHECK(!primaryAccount.empty()); | 1334 DCHECK(!primaryAccount.empty()); |
| 1333 std::vector<std::string>accounts = | 1335 std::vector<std::string>accounts = |
| 1334 profiles::GetSecondaryAccountsForProfile(profile, primaryAccount); | 1336 profiles::GetSecondaryAccountsForProfile(profile, primaryAccount); |
| 1335 | 1337 |
| 1336 rect.origin.y = 0; | 1338 rect.origin.y = 0; |
| 1337 for (size_t i = 0; i < accounts.size(); ++i) { | 1339 for (size_t i = 0; i < accounts.size(); ++i) { |
| 1338 // Save the original email address, as the button text could be elided. | 1340 // Save the original email address, as the button text could be elided. |
| 1339 currentProfileAccounts_[i] = accounts[i]; | 1341 currentProfileAccounts_[i] = accounts[i]; |
| 1340 NSButton* accountButton = [self accountButtonWithRect:rect | 1342 NSButton* accountButton = [self accountButtonWithRect:rect |
| 1341 title:accounts[i]]; | 1343 title:accounts[i] |
| 1342 [accountButton setTag:i]; | 1344 tag:i]; |
| 1343 [container addSubview:accountButton]; | 1345 [container addSubview:accountButton]; |
| 1344 rect.origin.y = NSMaxY([accountButton frame]); | 1346 rect.origin.y = NSMaxY([accountButton frame]); |
| 1345 } | 1347 } |
| 1346 | 1348 |
| 1347 // The primary account should always be listed first. | 1349 // The primary account should always be listed first. |
| 1348 NSButton* accountButton = [self accountButtonWithRect:rect | 1350 NSButton* accountButton = [self accountButtonWithRect:rect |
| 1349 title:primaryAccount]; | 1351 title:primaryAccount |
| 1352 tag:kPrimaryProfileTag]; | |
| 1350 [container addSubview:accountButton]; | 1353 [container addSubview:accountButton]; |
| 1351 [container setFrameSize:NSMakeSize(NSWidth([container frame]), | 1354 [container setFrameSize:NSMakeSize(NSWidth([container frame]), |
| 1352 NSMaxY([accountButton frame]))]; | 1355 NSMaxY([accountButton frame]))]; |
| 1353 [accountButton setTag:kPrimaryProfileTag]; | |
| 1354 return container.autorelease(); | 1356 return container.autorelease(); |
| 1355 } | 1357 } |
| 1356 | 1358 |
| 1357 - (NSView*)buildGaiaEmbeddedView { | 1359 - (NSView*)buildGaiaEmbeddedView { |
| 1358 base::scoped_nsobject<NSView> container( | 1360 base::scoped_nsobject<NSView> container( |
| 1359 [[NSView alloc] initWithFrame:NSZeroRect]); | 1361 [[NSView alloc] initWithFrame:NSZeroRect]); |
| 1360 CGFloat yOffset = 0; | 1362 CGFloat yOffset = 0; |
| 1361 | 1363 |
| 1362 bool addSecondaryAccount = viewMode_ == BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT; | 1364 bool addSecondaryAccount = viewMode_ == BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT; |
| 1363 signin::Source source = addSecondaryAccount ? | 1365 signin::Source source = addSecondaryAccount ? |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1516 [link setFont:[NSFont labelFontOfSize:kTextFontSize]]; | 1518 [link setFont:[NSFont labelFontOfSize:kTextFontSize]]; |
| 1517 [link setTarget:self]; | 1519 [link setTarget:self]; |
| 1518 [link setAction:action]; | 1520 [link setAction:action]; |
| 1519 [link setFrameOrigin:frameOrigin]; | 1521 [link setFrameOrigin:frameOrigin]; |
| 1520 [link sizeToFit]; | 1522 [link sizeToFit]; |
| 1521 | 1523 |
| 1522 return link.autorelease(); | 1524 return link.autorelease(); |
| 1523 } | 1525 } |
| 1524 | 1526 |
| 1525 - (NSButton*)accountButtonWithRect:(NSRect)rect | 1527 - (NSButton*)accountButtonWithRect:(NSRect)rect |
| 1526 title:(const std::string&)title { | 1528 title:(const std::string&)title |
| 1529 tag:(int)tag { | |
| 1527 NSColor* backgroundColor = gfx::SkColorToCalibratedNSColor( | 1530 NSColor* backgroundColor = gfx::SkColorToCalibratedNSColor( |
| 1528 profiles::kAvatarBubbleAccountsBackgroundColor); | 1531 profiles::kAvatarBubbleAccountsBackgroundColor); |
| 1529 base::scoped_nsobject<BackgroundColorHoverButton> button( | 1532 base::scoped_nsobject<BackgroundColorHoverButton> button( |
| 1530 [[BackgroundColorHoverButton alloc] initWithFrame:rect | 1533 [[BackgroundColorHoverButton alloc] initWithFrame:rect |
| 1531 imageTitleSpacing:0 | 1534 imageTitleSpacing:0 |
| 1532 backgroundColor:backgroundColor]); | 1535 backgroundColor:backgroundColor]); |
| 1533 | 1536 const CGFloat kDeleteButtonWidth = 18; |
|
groby-ooo-7-16
2014/05/02 22:21:57
Why 18? Any chance we can get that number from the
noms (inactive)
2014/05/05 17:21:24
Done.
| |
| 1534 [button setTitle:ElideEmail(title, rect.size.width)]; | 1537 CGFloat availableWidth = rect.size.width - |
| 1538 kDeleteButtonWidth - kHorizontalSpacing; | |
| 1539 [button setTitle:ElideEmail(title, availableWidth)]; | |
| 1535 [button setAlignment:NSLeftTextAlignment]; | 1540 [button setAlignment:NSLeftTextAlignment]; |
| 1536 [button setBordered:NO]; | 1541 [button setBordered:NO]; |
| 1537 [button setTarget:self]; | |
| 1538 [button setAction:@selector(showAccountRemovalView:)]; | |
| 1539 | 1542 |
| 1543 // Delete button. | |
| 1544 rect.origin = NSMakePoint(availableWidth, 0); | |
| 1545 rect.size.width = kDeleteButtonWidth; | |
| 1546 base::scoped_nsobject<HoverImageButton> deleteButton( | |
| 1547 [[HoverImageButton alloc] initWithFrame:rect]); | |
| 1548 [deleteButton setBordered:NO]; | |
| 1549 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | |
| 1550 [deleteButton setDefaultImage:rb->GetNativeImageNamed( | |
| 1551 IDR_CLOSE_1).ToNSImage()]; | |
| 1552 [deleteButton setHoverImage:rb->GetNativeImageNamed( | |
| 1553 IDR_CLOSE_1_H).ToNSImage()]; | |
| 1554 [deleteButton setPressedImage:rb->GetNativeImageNamed( | |
| 1555 IDR_CLOSE_1_P).ToNSImage()]; | |
| 1556 [deleteButton setTarget:self]; | |
| 1557 [deleteButton setAction:@selector(showAccountRemovalView:)]; | |
| 1558 [deleteButton setTag:tag]; | |
| 1559 | |
| 1560 [button addSubview:deleteButton]; | |
|
groby-ooo-7-16
2014/05/02 22:21:57
A HoverButton in a HoverButton? We must go deeper!
noms (inactive)
2014/05/05 17:21:24
Blerg. :(
Yup, the hovering is fine by magic. The
| |
| 1540 return button.autorelease(); | 1561 return button.autorelease(); |
| 1541 } | 1562 } |
| 1542 | 1563 |
| 1543 @end | 1564 @end |
| OLD | NEW |