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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 | 78 |
79 const CGFloat kVerticalSpacing = 16.0; | 79 const CGFloat kVerticalSpacing = 16.0; |
80 const CGFloat kSmallVerticalSpacing = 10.0; | 80 const CGFloat kSmallVerticalSpacing = 10.0; |
81 const CGFloat kHorizontalSpacing = 16.0; | 81 const CGFloat kHorizontalSpacing = 16.0; |
82 const CGFloat kTitleFontSize = 15.0; | 82 const CGFloat kTitleFontSize = 15.0; |
83 const CGFloat kTextFontSize = 12.0; | 83 const CGFloat kTextFontSize = 12.0; |
84 const CGFloat kProfileButtonHeight = 30; | 84 const CGFloat kProfileButtonHeight = 30; |
85 const int kBezelThickness = 3; // Width of the bezel on an NSButton. | 85 const int kBezelThickness = 3; // Width of the bezel on an NSButton. |
86 const int kImageTitleSpacing = 10; | 86 const int kImageTitleSpacing = 10; |
87 const int kBlueButtonHeight = 30; | 87 const int kBlueButtonHeight = 30; |
88 const CGFloat kFocusRingLineWidth = 2; | |
89 | 88 |
90 // Fixed size for embedded sign in pages as defined in Gaia. | 89 // Fixed size for embedded sign in pages as defined in Gaia. |
91 const CGFloat kFixedGaiaViewWidth = 360; | 90 const CGFloat kFixedGaiaViewWidth = 360; |
92 const CGFloat kFixedGaiaViewHeight = 440; | 91 const CGFloat kFixedGaiaViewHeight = 440; |
93 | 92 |
94 // Fixed size for the account removal view. | 93 // Fixed size for the account removal view. |
95 const CGFloat kFixedAccountRemovalViewWidth = 280; | 94 const CGFloat kFixedAccountRemovalViewWidth = 280; |
96 | 95 |
97 // Fixed size for the switch user view. | 96 // Fixed size for the switch user view. |
98 const int kFixedSwitchUserViewWidth = 320; | 97 const int kFixedSwitchUserViewWidth = 320; |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 } | 396 } |
398 | 397 |
399 - (NSSize)cellSize { | 398 - (NSSize)cellSize { |
400 NSSize buttonSize = [super cellSize]; | 399 NSSize buttonSize = [super cellSize]; |
401 buttonSize.width += leftMarginSpacing_; | 400 buttonSize.width += leftMarginSpacing_; |
402 if ([self imagePosition] == NSImageLeft) | 401 if ([self imagePosition] == NSImageLeft) |
403 buttonSize.width += imageTitleSpacing_; | 402 buttonSize.width += imageTitleSpacing_; |
404 return buttonSize; | 403 return buttonSize; |
405 } | 404 } |
406 | 405 |
407 - (NSFocusRingType)focusRingType { | |
408 // This is taken care of by the custom drawing code. | |
409 return NSFocusRingTypeNone; | |
410 } | |
411 | |
412 - (void)drawWithFrame:(NSRect)frame inView:(NSView *)controlView { | |
413 [super drawInteriorWithFrame:frame inView:controlView]; | |
414 | |
415 // Focus ring. | |
416 if ([self showsFirstResponder]) { | |
417 NSRect focusRingRect = | |
418 NSInsetRect(frame, kFocusRingLineWidth, kFocusRingLineWidth); | |
419 // TODO(noms): When we are targetting 10.7, we should change this to use | |
420 // -drawFocusRingMaskWithFrame instead. | |
421 [[[NSColor keyboardFocusIndicatorColor] colorWithAlphaComponent:1] set]; | |
422 NSBezierPath* path = [NSBezierPath bezierPathWithRect:focusRingRect]; | |
423 [path setLineWidth:kFocusRingLineWidth]; | |
424 [path stroke]; | |
425 } | |
426 } | |
427 | |
428 @end | 406 @end |
429 | 407 |
430 // A custom image view that has a transparent backround. | 408 // A custom button that has a transparent backround. |
431 @interface TransparentBackgroundImageView : NSImageView | 409 @interface TransparentBackgroundButton : NSButton |
432 @end | 410 @end |
433 | 411 |
434 @implementation TransparentBackgroundImageView | 412 @implementation TransparentBackgroundButton |
| 413 - (id)initWithFrame:(NSRect)frameRect { |
| 414 if ((self = [super initWithFrame:frameRect])) { |
| 415 [self setBordered:NO]; |
| 416 [self setFont:[NSFont labelFontOfSize:kTextFontSize]]; |
| 417 [self setButtonType:NSMomentaryChangeButton]; |
| 418 } |
| 419 return self; |
| 420 } |
| 421 |
435 - (void)drawRect:(NSRect)dirtyRect { | 422 - (void)drawRect:(NSRect)dirtyRect { |
436 NSColor* backgroundColor = [NSColor colorWithCalibratedWhite:1 alpha:0.6f]; | 423 NSColor* backgroundColor = [NSColor colorWithCalibratedWhite:1 alpha:0.6f]; |
437 [backgroundColor setFill]; | 424 [backgroundColor setFill]; |
438 NSRectFillUsingOperation(dirtyRect, NSCompositeSourceAtop); | 425 NSRectFillUsingOperation(dirtyRect, NSCompositeSourceAtop); |
439 [super drawRect:dirtyRect]; | 426 [super drawRect:dirtyRect]; |
440 } | 427 } |
441 @end | 428 @end |
442 | 429 |
443 @interface CustomCircleImageCell : NSButtonCell | |
444 @end | |
445 | |
446 @implementation CustomCircleImageCell | |
447 - (void)drawWithFrame:(NSRect)frame inView:(NSView *)controlView { | |
448 // Display everything as a circle that spans the entire control. | |
449 NSBezierPath* path = [NSBezierPath bezierPathWithOvalInRect:frame]; | |
450 [path addClip]; | |
451 | |
452 [super drawImage:[self image] withFrame:frame inView:controlView]; | |
453 | |
454 // Focus ring. | |
455 if ([self showsFirstResponder]) { | |
456 [[[NSColor keyboardFocusIndicatorColor] colorWithAlphaComponent:1] set]; | |
457 [path setLineWidth:kFocusRingLineWidth]; | |
458 [path stroke]; | |
459 } | |
460 } | |
461 @end | |
462 | |
463 // A custom image control that shows a "Change" button when moused over. | 430 // A custom image control that shows a "Change" button when moused over. |
464 @interface EditableProfilePhoto : HoverImageButton { | 431 @interface EditableProfilePhoto : NSImageView { |
465 @private | 432 @private |
466 AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. | 433 AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. |
467 base::scoped_nsobject<TransparentBackgroundImageView> changePhotoImage_; | 434 base::scoped_nsobject<TransparentBackgroundButton> changePhotoButton_; |
| 435 // Used to display the "Change" button on hover. |
| 436 ui::ScopedCrTrackingArea trackingArea_; |
468 ProfileChooserController* controller_; | 437 ProfileChooserController* controller_; |
469 } | 438 } |
470 | 439 |
471 - (id)initWithFrame:(NSRect)frameRect | 440 - (id)initWithFrame:(NSRect)frameRect |
472 avatarMenu:(AvatarMenu*)avatarMenu | 441 avatarMenu:(AvatarMenu*)avatarMenu |
473 profileIcon:(const gfx::Image&)profileIcon | 442 profileIcon:(const gfx::Image&)profileIcon |
474 editingAllowed:(BOOL)editingAllowed | 443 editingAllowed:(BOOL)editingAllowed |
475 withController:(ProfileChooserController*)controller; | 444 withController:(ProfileChooserController*)controller; |
476 | 445 |
477 // Called when the "Change" button is clicked. | 446 // Called when the "Change" button is clicked. |
478 - (void)editPhoto:(id)sender; | 447 - (void)editPhoto:(id)sender; |
479 | 448 |
| 449 // When hovering over the profile photo, show the "Change" button. |
| 450 - (void)mouseEntered:(NSEvent*)event; |
| 451 |
| 452 // When hovering away from the profile photo, hide the "Change" button. |
| 453 - (void)mouseExited:(NSEvent*)event; |
| 454 @end |
| 455 |
| 456 @interface EditableProfilePhoto (Private) |
| 457 // Create the "Change" avatar photo button. |
| 458 - (TransparentBackgroundButton*)changePhotoButtonWithRect:(NSRect)rect; |
480 @end | 459 @end |
481 | 460 |
482 @implementation EditableProfilePhoto | 461 @implementation EditableProfilePhoto |
483 - (id)initWithFrame:(NSRect)frameRect | 462 - (id)initWithFrame:(NSRect)frameRect |
484 avatarMenu:(AvatarMenu*)avatarMenu | 463 avatarMenu:(AvatarMenu*)avatarMenu |
485 profileIcon:(const gfx::Image&)profileIcon | 464 profileIcon:(const gfx::Image&)profileIcon |
486 editingAllowed:(BOOL)editingAllowed | 465 editingAllowed:(BOOL)editingAllowed |
487 withController:(ProfileChooserController*)controller { | 466 withController:(ProfileChooserController*)controller { |
488 if ((self = [super initWithFrame:frameRect])) { | 467 if ((self = [super initWithFrame:frameRect])) { |
489 avatarMenu_ = avatarMenu; | 468 avatarMenu_ = avatarMenu; |
490 controller_ = controller; | 469 controller_ = controller; |
| 470 [self setImage:CreateProfileImage( |
| 471 profileIcon, kLargeImageSide).ToNSImage()]; |
491 | 472 |
492 [self setBordered:NO]; | 473 // Add a tracking area so that we can show/hide the button when hovering. |
493 | 474 trackingArea_.reset([[CrTrackingArea alloc] |
494 base::scoped_nsobject<CustomCircleImageCell> cell( | 475 initWithRect:[self bounds] |
495 [[CustomCircleImageCell alloc] init]); | 476 options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways |
496 [self setCell:cell.get()]; | 477 owner:self |
497 | 478 userInfo:nil]); |
498 [self setDefaultImage:CreateProfileImage( | 479 [self addTrackingArea:trackingArea_.get()]; |
499 profileIcon, kLargeImageSide).ToNSImage()]; | |
500 [self setImagePosition:NSImageOnly]; | |
501 | 480 |
502 NSRect bounds = NSMakeRect(0, 0, kLargeImageSide, kLargeImageSide); | 481 NSRect bounds = NSMakeRect(0, 0, kLargeImageSide, kLargeImageSide); |
503 if (editingAllowed) { | 482 if (editingAllowed) { |
504 [self setTarget:self]; | 483 changePhotoButton_.reset([self changePhotoButtonWithRect:bounds]); |
505 [self setAction:@selector(editPhoto:)]; | 484 [self addSubview:changePhotoButton_]; |
506 changePhotoImage_.reset([[TransparentBackgroundImageView alloc] | |
507 initWithFrame:bounds]); | |
508 [changePhotoImage_ setImage:ui::ResourceBundle::GetSharedInstance(). | |
509 GetNativeImageNamed(IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; | |
510 [self addSubview:changePhotoImage_]; | |
511 | 485 |
512 // Hide the image until the button is hovered over. | 486 // Hide the button until the image is hovered over. |
513 [changePhotoImage_ setHidden:YES]; | 487 [changePhotoButton_ setHidden:YES]; |
514 } | 488 } |
515 | 489 |
516 // Set the image cell's accessibility strings to be the same as the | 490 // Set the image cell's accessibility strings to be the same as the |
517 // button's strings. | 491 // button's strings. |
518 [[self cell] accessibilitySetOverrideValue:l10n_util::GetNSString( | 492 [[self cell] accessibilitySetOverrideValue:l10n_util::GetNSString( |
519 editingAllowed ? | 493 editingAllowed ? |
520 IDS_PROFILES_NEW_AVATAR_MENU_CHANGE_PHOTO_ACCESSIBLE_NAME : | 494 IDS_PROFILES_NEW_AVATAR_MENU_CHANGE_PHOTO_ACCESSIBLE_NAME : |
521 IDS_PROFILES_NEW_AVATAR_MENU_PHOTO_ACCESSIBLE_NAME) | 495 IDS_PROFILES_NEW_AVATAR_MENU_PHOTO_ACCESSIBLE_NAME) |
522 forAttribute:NSAccessibilityTitleAttribute]; | 496 forAttribute:NSAccessibilityTitleAttribute]; |
523 [[self cell] accessibilitySetOverrideValue: | 497 [[self cell] accessibilitySetOverrideValue: |
(...skipping 11 matching lines...) Expand all Loading... |
535 forAttribute:NSAccessibilityTitleAttribute]; | 509 forAttribute:NSAccessibilityTitleAttribute]; |
536 [self accessibilitySetOverrideValue:NSAccessibilityButtonRole | 510 [self accessibilitySetOverrideValue:NSAccessibilityButtonRole |
537 forAttribute:NSAccessibilityRoleAttribute]; | 511 forAttribute:NSAccessibilityRoleAttribute]; |
538 [self accessibilitySetOverrideValue: | 512 [self accessibilitySetOverrideValue: |
539 NSAccessibilityRoleDescription(NSAccessibilityButtonRole, nil) | 513 NSAccessibilityRoleDescription(NSAccessibilityButtonRole, nil) |
540 forAttribute:NSAccessibilityRoleDescriptionAttribute]; | 514 forAttribute:NSAccessibilityRoleDescriptionAttribute]; |
541 } | 515 } |
542 return self; | 516 return self; |
543 } | 517 } |
544 | 518 |
| 519 - (void)drawRect:(NSRect)dirtyRect { |
| 520 NSRect bounds = [self bounds]; |
| 521 |
| 522 // Display the profile picture as a circle. |
| 523 NSBezierPath* path = [NSBezierPath bezierPathWithOvalInRect:bounds]; |
| 524 [path addClip]; |
| 525 [self.image drawAtPoint:bounds.origin |
| 526 fromRect:bounds |
| 527 operation:NSCompositeSourceOver |
| 528 fraction:1.0]; |
| 529 |
| 530 } |
| 531 |
545 - (void)editPhoto:(id)sender { | 532 - (void)editPhoto:(id)sender { |
546 avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); | 533 avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); |
547 [controller_ | 534 [controller_ |
548 postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_IMAGE]; | 535 postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_IMAGE]; |
549 } | 536 } |
550 | 537 |
551 - (void)setHoverState:(HoverState)state { | 538 - (void)mouseEntered:(NSEvent*)event { |
552 [super setHoverState:state]; | 539 [changePhotoButton_ setHidden:NO]; |
553 [changePhotoImage_ setHidden:([self hoverState] == kHoverStateNone)]; | 540 } |
| 541 |
| 542 - (void)mouseExited:(NSEvent*)event { |
| 543 [changePhotoButton_ setHidden:YES]; |
| 544 } |
| 545 |
| 546 // Make sure the element is focusable for accessibility. |
| 547 - (BOOL)canBecomeKeyView { |
| 548 return YES; |
554 } | 549 } |
555 | 550 |
556 - (BOOL)accessibilityIsIgnored { | 551 - (BOOL)accessibilityIsIgnored { |
557 return NO; | 552 return NO; |
558 } | 553 } |
559 | 554 |
560 - (NSArray*)accessibilityActionNames { | 555 - (NSArray*)accessibilityActionNames { |
561 NSArray* parentActions = [super accessibilityActionNames]; | 556 NSArray* parentActions = [super accessibilityActionNames]; |
562 return [parentActions arrayByAddingObject:NSAccessibilityPressAction]; | 557 return [parentActions arrayByAddingObject:NSAccessibilityPressAction]; |
563 } | 558 } |
564 | 559 |
565 - (void)accessibilityPerformAction:(NSString*)action { | 560 - (void)accessibilityPerformAction:(NSString*)action { |
566 if ([action isEqualToString:NSAccessibilityPressAction]) { | 561 if ([action isEqualToString:NSAccessibilityPressAction]) { |
567 avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); | 562 avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); |
568 } | 563 } |
569 | 564 |
570 [super accessibilityPerformAction:action]; | 565 [super accessibilityPerformAction:action]; |
571 } | 566 } |
572 | 567 |
| 568 - (TransparentBackgroundButton*)changePhotoButtonWithRect:(NSRect)rect { |
| 569 TransparentBackgroundButton* button = |
| 570 [[TransparentBackgroundButton alloc] initWithFrame:rect]; |
| 571 [button setImage:ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
| 572 IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; |
| 573 [button setImagePosition:NSImageOnly]; |
| 574 [button setTarget:self]; |
| 575 [button setAction:@selector(editPhoto:)]; |
| 576 return button; |
| 577 } |
573 @end | 578 @end |
574 | 579 |
575 // A custom text control that turns into a textfield for editing when clicked. | 580 // A custom text control that turns into a textfield for editing when clicked. |
576 @interface EditableProfileNameButton : HoverImageButton { | 581 @interface EditableProfileNameButton : HoverImageButton { |
577 @private | 582 @private |
578 base::scoped_nsobject<NSTextField> profileNameTextField_; | 583 base::scoped_nsobject<NSTextField> profileNameTextField_; |
579 Profile* profile_; // Weak. | 584 Profile* profile_; // Weak. |
580 ProfileChooserController* controller_; | 585 ProfileChooserController* controller_; |
581 } | 586 } |
582 | 587 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 return self; | 759 return self; |
755 } | 760 } |
756 | 761 |
757 - (void)drawRect:(NSRect)dirtyRect { | 762 - (void)drawRect:(NSRect)dirtyRect { |
758 [backgroundColor_ setFill]; | 763 [backgroundColor_ setFill]; |
759 NSRectFill(dirtyRect); | 764 NSRectFill(dirtyRect); |
760 [super drawRect:dirtyRect]; | 765 [super drawRect:dirtyRect]; |
761 } | 766 } |
762 @end | 767 @end |
763 | 768 |
764 // A custom dummy button that is used to clear focus from the bubble's controls. | |
765 @interface DummyWindowFocusButton : NSButton | |
766 @end | |
767 | |
768 @implementation DummyWindowFocusButton | |
769 // Ignore accessibility, as this is a placeholder button. | |
770 - (BOOL)accessibilityIsIgnored { | |
771 return YES; | |
772 } | |
773 | |
774 - (id)accessibilityAttributeValue:(NSString*)attribute { | |
775 return @[]; | |
776 } | |
777 | |
778 - (BOOL)canBecomeKeyView { | |
779 return false; | |
780 } | |
781 | |
782 @end | |
783 | |
784 @interface ProfileChooserController () | 769 @interface ProfileChooserController () |
785 // Builds the profile chooser view. | 770 // Builds the profile chooser view. |
786 - (NSView*)buildProfileChooserView; | 771 - (NSView*)buildProfileChooserView; |
787 | 772 |
788 // Builds a tutorial card with a title label using |titleMessage|, a content | 773 // Builds a tutorial card with a title label using |titleMessage|, a content |
789 // label using |contentMessage|, a link using |linkMessage|, and a button using | 774 // label using |contentMessage|, a link using |linkMessage|, and a button using |
790 // |buttonMessage|. If |stackButton| is YES, places the button above the link. | 775 // |buttonMessage|. If |stackButton| is YES, places the button above the link. |
791 // Otherwise places both on the same row with the link left aligned and button | 776 // Otherwise places both on the same row with the link left aligned and button |
792 // right aligned. On click, the link would execute |linkAction|, and the button | 777 // right aligned. On click, the link would execute |linkAction|, and the button |
793 // would execute |buttonAction|. It sets |tutorialMode_| to the given |mode|. | 778 // would execute |buttonAction|. It sets |tutorialMode_| to the given |mode|. |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 case profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER: | 1113 case profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER: |
1129 case profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT: | 1114 case profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT: |
1130 subView = [self buildProfileChooserView]; | 1115 subView = [self buildProfileChooserView]; |
1131 break; | 1116 break; |
1132 } | 1117 } |
1133 | 1118 |
1134 // Clears tutorial mode for all non-profile-chooser views. | 1119 // Clears tutorial mode for all non-profile-chooser views. |
1135 if (viewMode_ != profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER) | 1120 if (viewMode_ != profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER) |
1136 tutorialMode_ = profiles::TUTORIAL_MODE_NONE; | 1121 tutorialMode_ = profiles::TUTORIAL_MODE_NONE; |
1137 | 1122 |
1138 // Add a dummy, empty element so that we don't initially display any | |
1139 // focus rings. | |
1140 NSButton* dummyFocusButton = | |
1141 [[[DummyWindowFocusButton alloc] initWithFrame:NSZeroRect] autorelease]; | |
1142 [dummyFocusButton setNextKeyView:subView]; | |
1143 [[self window] makeFirstResponder:dummyFocusButton]; | |
1144 | |
1145 [contentView addSubview:subView]; | 1123 [contentView addSubview:subView]; |
1146 [contentView addSubview:dummyFocusButton]; | |
1147 SetWindowSize([self window], | 1124 SetWindowSize([self window], |
1148 NSMakeSize(NSWidth([subView frame]), NSHeight([subView frame]))); | 1125 NSMakeSize(NSWidth([subView frame]), NSHeight([subView frame]))); |
1149 } | 1126 } |
1150 | 1127 |
1151 - (NSView*)buildProfileChooserView { | 1128 - (NSView*)buildProfileChooserView { |
1152 base::scoped_nsobject<NSView> container( | 1129 base::scoped_nsobject<NSView> container( |
1153 [[NSView alloc] initWithFrame:NSZeroRect]); | 1130 [[NSView alloc] initWithFrame:NSZeroRect]); |
1154 | 1131 |
1155 NSView* tutorialView = nil; | 1132 NSView* tutorialView = nil; |
1156 NSView* currentProfileView = nil; | 1133 NSView* currentProfileView = nil; |
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1680 guestItem.active = true; | 1657 guestItem.active = true; |
1681 guestItem.name = base::SysNSStringToUTF16( | 1658 guestItem.name = base::SysNSStringToUTF16( |
1682 l10n_util::GetNSString(IDS_PROFILES_GUEST_PROFILE_NAME)); | 1659 l10n_util::GetNSString(IDS_PROFILES_GUEST_PROFILE_NAME)); |
1683 | 1660 |
1684 return [self createCurrentProfileView:guestItem]; | 1661 return [self createCurrentProfileView:guestItem]; |
1685 } | 1662 } |
1686 | 1663 |
1687 - (NSButton*)createOtherProfileView:(int)itemIndex { | 1664 - (NSButton*)createOtherProfileView:(int)itemIndex { |
1688 const AvatarMenu::Item& item = avatarMenu_->GetItemAt(itemIndex); | 1665 const AvatarMenu::Item& item = avatarMenu_->GetItemAt(itemIndex); |
1689 | 1666 |
1690 NSRect rect = NSMakeRect( | 1667 NSRect rect = NSMakeRect(0, 0, kFixedMenuWidth, kBlueButtonHeight); |
1691 0, 0, kFixedMenuWidth, kBlueButtonHeight + kSmallVerticalSpacing); | |
1692 base::scoped_nsobject<BackgroundColorHoverButton> profileButton( | 1668 base::scoped_nsobject<BackgroundColorHoverButton> profileButton( |
1693 [[BackgroundColorHoverButton alloc] | 1669 [[BackgroundColorHoverButton alloc] |
1694 initWithFrame:rect | 1670 initWithFrame:rect |
1695 imageTitleSpacing:kImageTitleSpacing | 1671 imageTitleSpacing:kImageTitleSpacing |
1696 backgroundColor:GetDialogBackgroundColor()]); | 1672 backgroundColor:GetDialogBackgroundColor()]); |
1697 [profileButton setTitle:base::SysUTF16ToNSString(item.name)]; | 1673 [profileButton setTitle:base::SysUTF16ToNSString(item.name)]; |
1698 [profileButton setDefaultImage:CreateProfileImage( | 1674 [profileButton setDefaultImage:CreateProfileImage( |
1699 item.icon, kSmallImageSide).ToNSImage()]; | 1675 item.icon, kSmallImageSide).ToNSImage()]; |
1700 [profileButton setImagePosition:NSImageLeft]; | 1676 [profileButton setImagePosition:NSImageLeft]; |
1701 [profileButton setAlignment:NSLeftTextAlignment]; | 1677 [profileButton setAlignment:NSLeftTextAlignment]; |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2178 } | 2154 } |
2179 | 2155 |
2180 - (bool)shouldShowGoIncognito { | 2156 - (bool)shouldShowGoIncognito { |
2181 bool incognitoAvailable = | 2157 bool incognitoAvailable = |
2182 IncognitoModePrefs::GetAvailability(browser_->profile()->GetPrefs()) != | 2158 IncognitoModePrefs::GetAvailability(browser_->profile()->GetPrefs()) != |
2183 IncognitoModePrefs::DISABLED; | 2159 IncognitoModePrefs::DISABLED; |
2184 return incognitoAvailable && !browser_->profile()->IsGuestSession(); | 2160 return incognitoAvailable && !browser_->profile()->IsGuestSession(); |
2185 } | 2161 } |
2186 | 2162 |
2187 @end | 2163 @end |
OLD | NEW |