Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm

Issue 2171473002: Bringing back fast user switching on Mac material design user menu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" 5 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h"
6 6
7 #import <Carbon/Carbon.h> // kVK_Return. 7 #import <Carbon/Carbon.h> // kVK_Return.
8 #import <Cocoa/Cocoa.h> 8 #import <Cocoa/Cocoa.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 10
(...skipping 16 matching lines...) Expand all
27 #include "chrome/browser/profiles/profile_window.h" 27 #include "chrome/browser/profiles/profile_window.h"
28 #include "chrome/browser/profiles/profiles_state.h" 28 #include "chrome/browser/profiles/profiles_state.h"
29 #include "chrome/browser/signin/chrome_signin_helper.h" 29 #include "chrome/browser/signin/chrome_signin_helper.h"
30 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 30 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
31 #include "chrome/browser/signin/signin_error_controller_factory.h" 31 #include "chrome/browser/signin/signin_error_controller_factory.h"
32 #include "chrome/browser/signin/signin_manager_factory.h" 32 #include "chrome/browser/signin/signin_manager_factory.h"
33 #include "chrome/browser/signin/signin_promo.h" 33 #include "chrome/browser/signin/signin_promo.h"
34 #include "chrome/browser/signin/signin_ui_util.h" 34 #include "chrome/browser/signin/signin_ui_util.h"
35 #include "chrome/browser/ui/browser.h" 35 #include "chrome/browser/ui/browser.h"
36 #include "chrome/browser/ui/browser_commands.h" 36 #include "chrome/browser/ui/browser_commands.h"
37 #include "chrome/browser/ui/browser_list.h"
37 #include "chrome/browser/ui/browser_window.h" 38 #include "chrome/browser/ui/browser_window.h"
38 #include "chrome/browser/ui/chrome_pages.h" 39 #include "chrome/browser/ui/chrome_pages.h"
39 #include "chrome/browser/ui/chrome_style.h" 40 #include "chrome/browser/ui/chrome_style.h"
40 #import "chrome/browser/ui/cocoa/browser_window_utils.h" 41 #import "chrome/browser/ui/cocoa/browser_window_utils.h"
41 #import "chrome/browser/ui/cocoa/info_bubble_view.h" 42 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
42 #import "chrome/browser/ui/cocoa/info_bubble_window.h" 43 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
43 #include "chrome/browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.h " 44 #include "chrome/browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.h "
44 #import "chrome/browser/ui/cocoa/profiles/user_manager_mac.h" 45 #import "chrome/browser/ui/cocoa/profiles/user_manager_mac.h"
45 #include "chrome/browser/ui/singleton_tabs.h" 46 #include "chrome/browser/ui/singleton_tabs.h"
46 #include "chrome/browser/ui/user_manager.h" 47 #include "chrome/browser/ui/user_manager.h"
(...skipping 20 matching lines...) Expand all
67 #import "ui/base/cocoa/cocoa_base_utils.h" 68 #import "ui/base/cocoa/cocoa_base_utils.h"
68 #import "ui/base/cocoa/controls/blue_label_button.h" 69 #import "ui/base/cocoa/controls/blue_label_button.h"
69 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" 70 #import "ui/base/cocoa/controls/hyperlink_button_cell.h"
70 #import "ui/base/cocoa/controls/hyperlink_text_view.h" 71 #import "ui/base/cocoa/controls/hyperlink_text_view.h"
71 #import "ui/base/cocoa/hover_image_button.h" 72 #import "ui/base/cocoa/hover_image_button.h"
72 #include "ui/base/cocoa/window_size_constants.h" 73 #include "ui/base/cocoa/window_size_constants.h"
73 #include "ui/base/l10n/l10n_util.h" 74 #include "ui/base/l10n/l10n_util.h"
74 #include "ui/base/l10n/l10n_util_mac.h" 75 #include "ui/base/l10n/l10n_util_mac.h"
75 #include "ui/base/resource/resource_bundle.h" 76 #include "ui/base/resource/resource_bundle.h"
76 #include "ui/events/keycodes/keyboard_codes.h" 77 #include "ui/events/keycodes/keyboard_codes.h"
78 #include "ui/gfx/color_palette.h"
77 #include "ui/gfx/image/image.h" 79 #include "ui/gfx/image/image.h"
80 #include "ui/gfx/image/image_skia_util_mac.h"
81 #include "ui/gfx/paint_vector_icon.h"
78 #include "ui/gfx/text_elider.h" 82 #include "ui/gfx/text_elider.h"
83 #include "ui/gfx/vector_icons_public.h"
79 #include "ui/native_theme/common_theme.h" 84 #include "ui/native_theme/common_theme.h"
80 #include "ui/native_theme/native_theme.h" 85 #include "ui/native_theme/native_theme.h"
81 #include "ui/native_theme/native_theme_mac.h" 86 #include "ui/native_theme/native_theme_mac.h"
82 87
83 namespace { 88 namespace {
84 89
85 // Constants taken from the Windows/Views implementation at: 90 // Constants taken from the Windows/Views implementation at:
86 // chrome/browser/ui/views/profile_chooser_view.cc 91 // chrome/browser/ui/views/profile_chooser_view.cc
87 const int kLargeImageSide = 88; 92 const int kLargeImageSide = 88;
88 const int kSmallImageSide = 32; 93 const int kSmallImageSide = 32;
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 }; 425 };
421 426
422 // Custom button cell that adds a left padding before the button image, and 427 // Custom button cell that adds a left padding before the button image, and
423 // a custom spacing between the button image and title. 428 // a custom spacing between the button image and title.
424 @interface CustomPaddingImageButtonCell : NSButtonCell { 429 @interface CustomPaddingImageButtonCell : NSButtonCell {
425 @private 430 @private
426 // Padding added to the left margin of the button. 431 // Padding added to the left margin of the button.
427 int leftMarginSpacing_; 432 int leftMarginSpacing_;
428 // Spacing between the cell image and title. 433 // Spacing between the cell image and title.
429 int imageTitleSpacing_; 434 int imageTitleSpacing_;
435 // Padding added to the right margin of the button.
436 int rightMarginSpacing_;
430 } 437 }
431 438
432 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing 439 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing
433 imageTitleSpacing:(int)imageTitleSpacing; 440 imageTitleSpacing:(int)imageTitleSpacing;
441
442 - (void)addRightMarginSpacing:(int)rightMarginSpacing;
434 @end 443 @end
435 444
436 @implementation CustomPaddingImageButtonCell 445 @implementation CustomPaddingImageButtonCell
437 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing 446 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing
438 imageTitleSpacing:(int)imageTitleSpacing { 447 imageTitleSpacing:(int)imageTitleSpacing {
439 if ((self = [super init])) { 448 if ((self = [super init])) {
440 leftMarginSpacing_ = leftMarginSpacing; 449 leftMarginSpacing_ = leftMarginSpacing;
441 imageTitleSpacing_ = imageTitleSpacing; 450 imageTitleSpacing_ = imageTitleSpacing;
442 } 451 }
443 return self; 452 return self;
444 } 453 }
445 454
455 - (void)addRightMarginSpacing:(int)rightMarginSpacing {
groby-ooo-7-16 2016/07/20 20:54:22 nit: setRightMargingSpacing seems more appropriate
Jane 2016/07/20 22:03:46 Done.
456 rightMarginSpacing_ = rightMarginSpacing;
457 }
458
446 - (NSRect)drawTitle:(NSAttributedString*)title 459 - (NSRect)drawTitle:(NSAttributedString*)title
447 withFrame:(NSRect)frame 460 withFrame:(NSRect)frame
448 inView:(NSView*)controlView { 461 inView:(NSView*)controlView {
449 NSRect marginRect; 462 NSRect marginRect;
450 NSDivideRect(frame, &marginRect, &frame, leftMarginSpacing_, NSMinXEdge); 463 NSDivideRect(frame, &marginRect, &frame, leftMarginSpacing_, NSMinXEdge);
451 464
452 // The title frame origin isn't aware of the left margin spacing added 465 // The title frame origin isn't aware of the left margin spacing added
453 // in -drawImage, so it must be added when drawing the title as well. 466 // in -drawImage, so it must be added when drawing the title as well.
454 if ([self imagePosition] == NSImageLeft) 467 if ([self imagePosition] == NSImageLeft)
455 NSDivideRect(frame, &marginRect, &frame, imageTitleSpacing_, NSMinXEdge); 468 NSDivideRect(frame, &marginRect, &frame, imageTitleSpacing_, NSMinXEdge);
456 469
470 if (rightMarginSpacing_ > 0)
471 NSDivideRect(frame, &marginRect, &frame, rightMarginSpacing_, NSMaxXEdge);
groby-ooo-7-16 2016/07/20 20:54:22 You can probably skip the ">0" test.
Jane 2016/07/20 22:03:46 Done.
472
457 return [super drawTitle:title withFrame:frame inView:controlView]; 473 return [super drawTitle:title withFrame:frame inView:controlView];
458 } 474 }
459 475
460 - (void)drawImage:(NSImage*)image 476 - (void)drawImage:(NSImage*)image
461 withFrame:(NSRect)frame 477 withFrame:(NSRect)frame
462 inView:(NSView*)controlView { 478 inView:(NSView*)controlView {
463 if ([self imagePosition] == NSImageLeft) 479 if ([self imagePosition] == NSImageLeft)
464 frame.origin.x = leftMarginSpacing_; 480 frame.origin.x = leftMarginSpacing_;
465 [super drawImage:image withFrame:frame inView:controlView]; 481 [super drawImage:image withFrame:frame inView:controlView];
466 } 482 }
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 } 806 }
791 807
792 @end 808 @end
793 809
794 // A custom button that allows for setting a background color when hovered over. 810 // A custom button that allows for setting a background color when hovered over.
795 @interface BackgroundColorHoverButton : HoverImageButton { 811 @interface BackgroundColorHoverButton : HoverImageButton {
796 @private 812 @private
797 base::scoped_nsobject<NSColor> backgroundColor_; 813 base::scoped_nsobject<NSColor> backgroundColor_;
798 base::scoped_nsobject<NSColor> hoverColor_; 814 base::scoped_nsobject<NSColor> hoverColor_;
799 } 815 }
816
817 - (void)addRightMarginSpacing:(int)rightMarginSpacing;
800 @end 818 @end
801 819
802 @implementation BackgroundColorHoverButton 820 @implementation BackgroundColorHoverButton
803 821
804 - (id)initWithFrame:(NSRect)frameRect 822 - (id)initWithFrame:(NSRect)frameRect
805 imageTitleSpacing:(int)imageTitleSpacing 823 imageTitleSpacing:(int)imageTitleSpacing
806 backgroundColor:(NSColor*)backgroundColor { 824 backgroundColor:(NSColor*)backgroundColor {
807 if ((self = [super initWithFrame:frameRect])) { 825 if ((self = [super initWithFrame:frameRect])) {
808 backgroundColor_.reset([backgroundColor retain]); 826 backgroundColor_.reset([backgroundColor retain]);
809 // Use a color from Aura, since this button is not trying to look like a 827 // Use a color from Aura, since this button is not trying to look like a
810 // native control. 828 // native control.
811 SkColor hoverColor = ui::GetAuraColor( 829 SkColor hoverColor = ui::GetAuraColor(
812 ui::NativeTheme::kColorId_ButtonHoverBackgroundColor, nullptr); 830 ui::NativeTheme::kColorId_ButtonHoverBackgroundColor, nullptr);
813 hoverColor_.reset([skia::SkColorToSRGBNSColor(hoverColor) retain]); 831 hoverColor_.reset([skia::SkColorToSRGBNSColor(hoverColor) retain]);
814 832
815 [self setBordered:NO]; 833 [self setBordered:NO];
816 [self setFont:[NSFont labelFontOfSize:kTextFontSize]]; 834 [self setFont:[NSFont labelFontOfSize:kTextFontSize]];
817 [self setButtonType:NSMomentaryChangeButton]; 835 [self setButtonType:NSMomentaryChangeButton];
818 836
819 base::scoped_nsobject<CustomPaddingImageButtonCell> cell( 837 base::scoped_nsobject<CustomPaddingImageButtonCell> cell(
820 [[CustomPaddingImageButtonCell alloc] 838 [[CustomPaddingImageButtonCell alloc]
821 initWithLeftMarginSpacing:kHorizontalSpacing 839 initWithLeftMarginSpacing:kHorizontalSpacing
822 imageTitleSpacing:imageTitleSpacing]); 840 imageTitleSpacing:imageTitleSpacing]);
823 [cell setLineBreakMode:NSLineBreakByTruncatingTail]; 841 [cell setLineBreakMode:NSLineBreakByTruncatingTail];
824 [self setCell:cell.get()]; 842 [self setCell:cell.get()];
825 } 843 }
826 return self; 844 return self;
827 } 845 }
828 846
847 - (void)addRightMarginSpacing:(int)rightMarginSpacing {
848 [[self cell] addRightMarginSpacing:rightMarginSpacing];
849 }
850
829 - (void)drawRect:(NSRect)dirtyRect { 851 - (void)drawRect:(NSRect)dirtyRect {
830 if ([self isEnabled]) { 852 if ([self isEnabled]) {
831 bool isHighlighted = ([self hoverState] != kHoverStateNone); 853 bool isHighlighted = ([self hoverState] != kHoverStateNone);
832 NSColor* backgroundColor = isHighlighted ? hoverColor_ : backgroundColor_; 854 NSColor* backgroundColor = isHighlighted ? hoverColor_ : backgroundColor_;
833 [[self cell] setBackgroundColor:backgroundColor]; 855 [[self cell] setBackgroundColor:backgroundColor];
834 } 856 }
835 [super drawRect:dirtyRect]; 857 [super drawRect:dirtyRect];
836 } 858 }
837 859
838 -(void)keyDown:(NSEvent*)event { 860 -(void)keyDown:(NSEvent*)event {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 } 914 }
893 915
894 @end 916 @end
895 917
896 @interface ProfileChooserController () 918 @interface ProfileChooserController ()
897 // Adds an horizontal separator to |container| at |yOffset| and returns the 919 // Adds an horizontal separator to |container| at |yOffset| and returns the
898 // yOffset corresponding to after the separator. 920 // yOffset corresponding to after the separator.
899 - (CGFloat)addSeparatorToContainer:(NSView*)container 921 - (CGFloat)addSeparatorToContainer:(NSView*)container
900 atYOffset:(CGFloat)yOffset; 922 atYOffset:(CGFloat)yOffset;
901 923
902 // Builds the right-click profile switcher. 924 // Builds the fast user switcher view. In the current user menu, this is
903 - (void)buildFastUserSwitcherViewWithProfiles:(NSMutableArray*)otherProfiles 925 // triggered by right-clicking the avatar button; in the material design user
904 atYOffset:(CGFloat)yOffset 926 // menu, this appears as part of the user menu. Returns the yOffset
905 inContainer:(NSView*)container; 927 // corresponding to after the profile switcher buttons.
928 - (CGFloat)buildFastUserSwitcherViewWithProfiles:(NSMutableArray*)otherProfiles
929 atYOffset:(CGFloat)yOffset
930 inContainer:(NSView*)container;
906 931
907 // Builds the regular profile chooser view. 932 // Builds the regular profile chooser view.
908 - (void)buildProfileChooserViewWithProfileView:(NSView*)currentProfileView 933 - (void)buildProfileChooserViewWithProfileView:(NSView*)currentProfileView
909 tutorialView:(NSView*)tutorialView 934 tutorialView:(NSView*)tutorialView
935 otherProfiles:(NSMutableArray*)otherProfiles
910 atYOffset:(CGFloat)yOffset 936 atYOffset:(CGFloat)yOffset
911 inContainer:(NSView*)container 937 inContainer:(NSView*)container
912 displayLock:(bool)displayLock; 938 displayLock:(bool)displayLock;
913 939
914 // Builds the profile chooser view. 940 // Builds the profile chooser view.
915 - (NSView*)buildProfileChooserView; 941 - (NSView*)buildProfileChooserView;
916 942
917 - (NSView*)buildTutorialViewIfNeededForItem:(const AvatarMenu::Item&)item; 943 - (NSView*)buildTutorialViewIfNeededForItem:(const AvatarMenu::Item&)item;
918 944
919 // Builds a tutorial card with a title label using |titleMessage|, a content 945 // Builds a tutorial card with a title label using |titleMessage|, a content
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 rect:(NSRect)rect; 986 rect:(NSRect)rect;
961 987
962 // Creates the disclaimer text for supervised users, telling them that the 988 // Creates the disclaimer text for supervised users, telling them that the
963 // manager can view their history etc. 989 // manager can view their history etc.
964 - (NSView*)createSupervisedUserDisclaimerView; 990 - (NSView*)createSupervisedUserDisclaimerView;
965 991
966 // Creates a main profile card for the guest user. 992 // Creates a main profile card for the guest user.
967 - (NSView*)createGuestProfileView; 993 - (NSView*)createGuestProfileView;
968 994
969 // Creates an item for the profile |itemIndex| that is used in the fast profile 995 // Creates an item for the profile |itemIndex| that is used in the fast profile
970 // switcher in the middle of the bubble. 996 // switcher view.
971 - (NSButton*)createOtherProfileView:(int)itemIndex; 997 - (NSButton*)createOtherProfileView:(int)itemIndex;
972 998
973 // Creates the "Not you" and Lock option buttons. 999 // Creates the following option buttons: lock profile, go incognito, and switch
1000 // user/exit guest.
974 - (NSView*)createOptionsViewWithRect:(NSRect)rect 1001 - (NSView*)createOptionsViewWithRect:(NSRect)rect
975 displayLock:(BOOL)displayLock; 1002 displayLock:(BOOL)displayLock;
1003 // For material design user menu, creates the following option buttons: lock
1004 // profile/close all windows, switch user/exit guest, and open guest profile.
1005 - (NSView*)createMaterialDesignOptionsViewWithRect:(NSRect)rect
1006 displayLock:(BOOL)displayLock;
976 1007
977 // Creates the account management view for the active profile. 1008 // Creates the account management view for the active profile.
978 - (NSView*)createCurrentProfileAccountsView:(NSRect)rect; 1009 - (NSView*)createCurrentProfileAccountsView:(NSRect)rect;
979 1010
980 // Creates the list of accounts for the active profile. 1011 // Creates the list of accounts for the active profile.
981 - (NSView*)createAccountsListWithRect:(NSRect)rect; 1012 - (NSView*)createAccountsListWithRect:(NSRect)rect;
982 1013
983 // Creates the Gaia sign-in/add account view. 1014 // Creates the Gaia sign-in/add account view.
984 - (NSView*)buildGaiaEmbeddedView; 1015 - (NSView*)buildGaiaEmbeddedView;
985 1016
986 // Creates the account removal view. 1017 // Creates the account removal view.
987 - (NSView*)buildAccountRemovalView; 1018 - (NSView*)buildAccountRemovalView;
988 1019
989 // Create a view that shows various options for an upgrade user who is not 1020 // Create a view that shows various options for an upgrade user who is not
990 // the same person as the currently signed in user. 1021 // the same person as the currently signed in user.
991 - (NSView*)buildSwitchUserView; 1022 - (NSView*)buildSwitchUserView;
992 1023
993 // Creates a button with |text| and |action|, optionally with an icon given by 1024 // Creates a button with |text| and |action|, optionally with an icon given by
994 // |imageResourceId|. 1025 // |imageResourceId| or |image|.
995 - (NSButton*)hoverButtonWithRect:(NSRect)rect 1026 - (NSButton*)hoverButtonWithRect:(NSRect)rect
996 text:(NSString*)text 1027 text:(NSString*)text
997 imageResourceId:(int)imageResourceId 1028 imageResourceId:(int)imageResourceId
998 action:(SEL)action; 1029 action:(SEL)action;
1030 - (NSButton*)hoverButtonWithRect:(NSRect)rect
1031 text:(NSString*)text
1032 image:(NSImage*)image
1033 action:(SEL)action;
999 - (BackgroundColorHoverButton*)hoverButtonWithRect:(NSRect)rect 1034 - (BackgroundColorHoverButton*)hoverButtonWithRect:(NSRect)rect
1000 text:(NSString*)text 1035 text:(NSString*)text
1001 action:(SEL)action; 1036 action:(SEL)action;
1002 1037
1003 // Creates a generic link button with |title| and an |action| positioned at 1038 // Creates a generic link button with |title| and an |action| positioned at
1004 // |frameOrigin|. 1039 // |frameOrigin|.
1005 - (NSButton*)linkButtonWithTitle:(NSString*)title 1040 - (NSButton*)linkButtonWithTitle:(NSString*)title
1006 frameOrigin:(NSPoint)frameOrigin 1041 frameOrigin:(NSPoint)frameOrigin
1007 action:(SEL)action; 1042 action:(SEL)action;
1008 1043
(...skipping 24 matching lines...) Expand all
1033 } 1068 }
1034 1069
1035 - (IBAction)switchToProfile:(id)sender { 1070 - (IBAction)switchToProfile:(id)sender {
1036 // Check the event flags to see if a new window should be created. 1071 // Check the event flags to see if a new window should be created.
1037 bool alwaysCreate = ui::WindowOpenDispositionFromNSEvent( 1072 bool alwaysCreate = ui::WindowOpenDispositionFromNSEvent(
1038 [NSApp currentEvent]) == NEW_WINDOW; 1073 [NSApp currentEvent]) == NEW_WINDOW;
1039 avatarMenu_->SwitchToProfile([sender tag], alwaysCreate, 1074 avatarMenu_->SwitchToProfile([sender tag], alwaysCreate,
1040 ProfileMetrics::SWITCH_PROFILE_ICON); 1075 ProfileMetrics::SWITCH_PROFILE_ICON);
1041 } 1076 }
1042 1077
1078 - (IBAction)switchToGuest:(id)sender {
1079 PrefService* service = g_browser_process->local_state();
groby-ooo-7-16 2016/07/20 20:54:22 Curious - why go through the global process, inste
Jane 2016/07/20 22:03:46 It doesn't seem like profile()->GetPrefs() have th
groby-ooo-7-16 2016/07/21 00:01:46 Ah, nevermind, my brain misfired - kBrowserGuestMo
1080 DCHECK(service);
1081 DCHECK(service->GetBoolean(prefs::kBrowserGuestModeEnabled));
1082 profiles::SwitchToGuestProfile(ProfileManager::CreateCallback());
1083 }
1084
1043 - (IBAction)showUserManager:(id)sender { 1085 - (IBAction)showUserManager:(id)sender {
1044 UserManager::Show(base::FilePath(), 1086 UserManager::Show(base::FilePath(),
1045 profiles::USER_MANAGER_NO_TUTORIAL, 1087 profiles::USER_MANAGER_NO_TUTORIAL,
1046 profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION); 1088 profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
1047 [self postActionPerformed: 1089 [self postActionPerformed:
1048 ProfileMetrics::PROFILE_DESKTOP_MENU_OPEN_USER_MANAGER]; 1090 ProfileMetrics::PROFILE_DESKTOP_MENU_OPEN_USER_MANAGER];
1049 } 1091 }
1050 1092
1051 - (IBAction)exitGuest:(id)sender { 1093 - (IBAction)exitGuest:(id)sender {
1052 DCHECK(browser_->profile()->IsGuestSession()); 1094 DCHECK(browser_->profile()->IsGuestSession());
1053 UserManager::Show(base::FilePath(), 1095 UserManager::Show(base::FilePath(),
1054 profiles::USER_MANAGER_NO_TUTORIAL, 1096 profiles::USER_MANAGER_NO_TUTORIAL,
1055 profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION); 1097 profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
1056 profiles::CloseGuestProfileWindows(); 1098 profiles::CloseGuestProfileWindows();
1057 } 1099 }
1058 1100
1101 - (IBAction)closeAllWindows:(id)sender {
1102 profiles::CloseProfileWindows(browser_->profile());
1103 }
1104
1059 - (IBAction)goIncognito:(id)sender { 1105 - (IBAction)goIncognito:(id)sender {
1060 DCHECK([self shouldShowGoIncognito]); 1106 DCHECK([self shouldShowGoIncognito]);
1061 chrome::NewIncognitoWindow(browser_); 1107 chrome::NewIncognitoWindow(browser_);
1062 [self postActionPerformed: 1108 [self postActionPerformed:
1063 ProfileMetrics::PROFILE_DESKTOP_MENU_GO_INCOGNITO]; 1109 ProfileMetrics::PROFILE_DESKTOP_MENU_GO_INCOGNITO];
1064 } 1110 }
1065 1111
1066 - (IBAction)showAccountManagement:(id)sender { 1112 - (IBAction)showAccountManagement:(id)sender {
1067 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; 1113 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT];
1068 } 1114 }
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 NSBox* separator = 1378 NSBox* separator =
1333 [self horizontalSeparatorWithFrame:NSMakeRect(0, yOffset, 1379 [self horizontalSeparatorWithFrame:NSMakeRect(0, yOffset,
1334 GetFixedMenuWidth(), 0)]; 1380 GetFixedMenuWidth(), 0)];
1335 [container addSubview:separator]; 1381 [container addSubview:separator];
1336 return NSMaxY([separator frame]); 1382 return NSMaxY([separator frame]);
1337 } 1383 }
1338 1384
1339 // Builds the fast user switcher view in |container| at |yOffset| and populates 1385 // Builds the fast user switcher view in |container| at |yOffset| and populates
1340 // it with the entries for every profile in |otherProfiles|. Returns the new 1386 // it with the entries for every profile in |otherProfiles|. Returns the new
1341 // yOffset after adding the elements. 1387 // yOffset after adding the elements.
1342 - (void)buildFastUserSwitcherViewWithProfiles:(NSMutableArray*)otherProfiles 1388 - (CGFloat)buildFastUserSwitcherViewWithProfiles:(NSMutableArray*)otherProfiles
groby-ooo-7-16 2016/07/20 20:54:22 Is there any reason this needs to be a mutable arr
Jane 2016/07/20 22:03:46 I think it's because this array needs the dynamic
groby-ooo-7-16 2016/07/21 00:01:46 You need that only at construction time, though. T
Jane 2016/07/21 13:49:52 Done. Ah, I see what you mean! I changed it to be
1343 atYOffset:(CGFloat)yOffset 1389 atYOffset:(CGFloat)yOffset
1344 inContainer:(NSView*)container { 1390 inContainer:(NSView*)container {
1345 // Other profiles switcher. The profiles have already been sorted 1391 // Other profiles switcher. The profiles have already been sorted
1346 // by their y-coordinate, so they can be added in the existing order. 1392 // by their y-coordinate, so they can be added in the existing order.
1347 for (NSView* otherProfileView in otherProfiles) { 1393 for (NSView* otherProfileView in otherProfiles) {
1348 [otherProfileView setFrameOrigin:NSMakePoint(0, yOffset)]; 1394 [otherProfileView setFrameOrigin:NSMakePoint(0, yOffset)];
1349 [container addSubview:otherProfileView]; 1395 [container addSubview:otherProfileView];
1350 yOffset = NSMaxY([otherProfileView frame]); 1396 yOffset = NSMaxY([otherProfileView frame]);
1351 1397
1352 yOffset = [self addSeparatorToContainer:container atYOffset: yOffset]; 1398 if (!switches::IsMaterialDesignUserMenu())
1399 yOffset = [self addSeparatorToContainer:container atYOffset:yOffset];
1353 } 1400 }
1354 1401
1355 [container setFrameSize:NSMakeSize(GetFixedMenuWidth(), yOffset)]; 1402 [container setFrameSize:NSMakeSize(GetFixedMenuWidth(), yOffset)];
1403 return yOffset;
1356 } 1404 }
1357 1405
1358 - (void)buildProfileChooserViewWithProfileView:(NSView*)currentProfileView 1406 - (void)buildProfileChooserViewWithProfileView:(NSView*)currentProfileView
1359 tutorialView:(NSView*)tutorialView 1407 tutorialView:(NSView*)tutorialView
1408 otherProfiles:(NSMutableArray*)otherProfiles
1360 atYOffset:(CGFloat)yOffset 1409 atYOffset:(CGFloat)yOffset
1361 inContainer:(NSView*)container 1410 inContainer:(NSView*)container
1362 displayLock:(bool)displayLock { 1411 displayLock:(bool)displayLock {
1412 if (switches::IsMaterialDesignUserMenu())
1413 yOffset += kRelatedControllVerticalSpacing;
1414
1363 // Option buttons. 1415 // Option buttons.
1364 NSRect rect = NSMakeRect(0, yOffset, GetFixedMenuWidth(), 0); 1416 NSRect rect = NSMakeRect(0, yOffset, GetFixedMenuWidth(), 0);
1365 NSView* optionsView = [self createOptionsViewWithRect:rect 1417 NSView* optionsView =
1366 displayLock:displayLock]; 1418 switches::IsMaterialDesignUserMenu()
1419 ? [self createMaterialDesignOptionsViewWithRect:rect
1420 displayLock:displayLock]
1421 : [self createOptionsViewWithRect:rect displayLock:displayLock];
1367 [container addSubview:optionsView]; 1422 [container addSubview:optionsView];
1368 rect.origin.y = NSMaxY([optionsView frame]); 1423 rect.origin.y = NSMaxY([optionsView frame]);
1424 yOffset = rect.origin.y;
1425
1426 // For material design user menu, add the fast user switching buttons.
1427 if (switches::IsMaterialDesignUserMenu()) {
1428 yOffset = [self buildFastUserSwitcherViewWithProfiles:otherProfiles
1429 atYOffset:yOffset
1430 inContainer:container];
1431 yOffset += kRelatedControllVerticalSpacing;
1432 rect.origin.y = yOffset;
1433 }
1369 1434
1370 NSBox* separator = [self horizontalSeparatorWithFrame:rect]; 1435 NSBox* separator = [self horizontalSeparatorWithFrame:rect];
1371 [container addSubview:separator]; 1436 [container addSubview:separator];
1372 yOffset = NSMaxY([separator frame]); 1437 yOffset = NSMaxY([separator frame]);
1373 1438
1374 // For supervised users, add the disclaimer text. 1439 // For supervised users, add the disclaimer text.
1375 if (browser_->profile()->IsSupervised()) { 1440 if (browser_->profile()->IsSupervised()) {
1376 yOffset += switches::IsMaterialDesignUserMenu() ? kVerticalSpacing 1441 yOffset += switches::IsMaterialDesignUserMenu() ? kVerticalSpacing
1377 : kSmallVerticalSpacing; 1442 : kSmallVerticalSpacing;
1378 NSView* disclaimerContainer = [self createSupervisedUserDisclaimerView]; 1443 NSView* disclaimerContainer = [self createSupervisedUserDisclaimerView];
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1458 } 1523 }
1459 if (!currentProfileView) // Guest windows don't have an active profile. 1524 if (!currentProfileView) // Guest windows don't have an active profile.
1460 currentProfileView = [self createGuestProfileView]; 1525 currentProfileView = [self createGuestProfileView];
1461 1526
1462 // |yOffset| is the next position at which to draw in |container| 1527 // |yOffset| is the next position at which to draw in |container|
1463 // coordinates. Add a pixel offset so that the bottom option buttons don't 1528 // coordinates. Add a pixel offset so that the bottom option buttons don't
1464 // overlap the bubble's rounded corners. 1529 // overlap the bubble's rounded corners.
1465 CGFloat yOffset = 1; 1530 CGFloat yOffset = 1;
1466 1531
1467 if (isFastProfileChooser) { 1532 if (isFastProfileChooser) {
1468 [self buildFastUserSwitcherViewWithProfiles:otherProfiles.get() 1533 if (!switches::IsMaterialDesignUserMenu()) {
1469 atYOffset:yOffset 1534 [self buildFastUserSwitcherViewWithProfiles:otherProfiles.get()
1470 inContainer:container.get()]; 1535 atYOffset:yOffset
1536 inContainer:container.get()];
groby-ooo-7-16 2016/07/20 20:54:22 No reason for .get(), I think.
Jane 2016/07/20 22:03:46 Done. I'm assuming all the .get()'s here? (What is
groby-ooo-7-16 2016/07/21 00:01:46 get() is usually used if the types don't match exa
Jane 2016/07/21 13:49:52 Ah, I see! Now that I modified these two methods t
1537 }
1471 } else { 1538 } else {
1472 [self buildProfileChooserViewWithProfileView:currentProfileView 1539 [self buildProfileChooserViewWithProfileView:currentProfileView
1473 tutorialView:tutorialView 1540 tutorialView:tutorialView
1541 otherProfiles:otherProfiles.get()
groby-ooo-7-16 2016/07/20 20:54:22 see above
Jane 2016/07/20 22:03:46 Done.
1474 atYOffset:yOffset 1542 atYOffset:yOffset
1475 inContainer:container.get() 1543 inContainer:container.get()
1476 displayLock:displayLock]; 1544 displayLock:displayLock];
1477 } 1545 }
1478 1546
1479 return container.autorelease(); 1547 return container.autorelease();
1480 } 1548 }
1481 1549
1482 - (NSView*)buildSigninConfirmationView { 1550 - (NSView*)buildSigninConfirmationView {
1483 ProfileMetrics::LogProfileNewAvatarMenuSignin( 1551 ProfileMetrics::LogProfileNewAvatarMenuSignin(
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
2075 return switches::IsMaterialDesignUserMenu() 2143 return switches::IsMaterialDesignUserMenu()
2076 ? [self createMaterialDesignCurrentProfileView:guestItem] 2144 ? [self createMaterialDesignCurrentProfileView:guestItem]
2077 : [self createCurrentProfileView:guestItem]; 2145 : [self createCurrentProfileView:guestItem];
2078 } 2146 }
2079 2147
2080 - (NSButton*)createOtherProfileView:(int)itemIndex { 2148 - (NSButton*)createOtherProfileView:(int)itemIndex {
2081 const AvatarMenu::Item& item = avatarMenu_->GetItemAt(itemIndex); 2149 const AvatarMenu::Item& item = avatarMenu_->GetItemAt(itemIndex);
2082 2150
2083 NSRect rect = NSMakeRect(0, 0, GetFixedMenuWidth(), 2151 NSRect rect = NSMakeRect(0, 0, GetFixedMenuWidth(),
2084 kBlueButtonHeight + kSmallVerticalSpacing); 2152 kBlueButtonHeight + kSmallVerticalSpacing);
2153 const int imageTitleSpacing = switches::IsMaterialDesignUserMenu()
2154 ? kHorizontalSpacing
2155 : kImageTitleSpacing;
2085 base::scoped_nsobject<BackgroundColorHoverButton> profileButton( 2156 base::scoped_nsobject<BackgroundColorHoverButton> profileButton(
2086 [[BackgroundColorHoverButton alloc] 2157 [[BackgroundColorHoverButton alloc]
2087 initWithFrame:rect 2158 initWithFrame:rect
2088 imageTitleSpacing:kImageTitleSpacing 2159 imageTitleSpacing:imageTitleSpacing
2089 backgroundColor:GetDialogBackgroundColor()]); 2160 backgroundColor:GetDialogBackgroundColor()]);
2161 if (switches::IsMaterialDesignUserMenu())
2162 [profileButton addRightMarginSpacing:kHorizontalSpacing];
2090 2163
2091 NSString* title = base::SysUTF16ToNSString( 2164 NSString* title = base::SysUTF16ToNSString(
2092 profiles::GetProfileSwitcherTextForItem(item)); 2165 profiles::GetProfileSwitcherTextForItem(item));
2093 [profileButton setTitle:title]; 2166 [profileButton setTitle:title];
2094 2167
2095 // Use the low-res, small default avatars in the fast user switcher, like 2168 CGFloat availableWidth;
2096 // we do in the menu bar. 2169 if (switches::IsMaterialDesignUserMenu()) {
2097 gfx::Image itemIcon; 2170 int iconImageSide = 18;
2098 AvatarMenu::GetImageForMenuButton(item.profile_path, &itemIcon); 2171 [profileButton setDefaultImage:CreateProfileImage(item.icon, iconImageSide,
2172 profiles::SHAPE_CIRCLE)];
2173 availableWidth = rect.size.width - iconImageSide - imageTitleSpacing -
2174 2 * kHorizontalSpacing;
2175 } else {
2176 // Use the low-res, small default avatars in the fast user switcher, like
2177 // we do in the menu bar.
2178 gfx::Image itemIcon;
2179 AvatarMenu::GetImageForMenuButton(item.profile_path, &itemIcon);
2180 [profileButton setDefaultImage:CreateProfileImage(itemIcon, kSmallImageSide,
2181 profiles::SHAPE_SQUARE)];
2182 availableWidth = rect.size.width - kSmallImageSide - imageTitleSpacing -
2183 kHorizontalSpacing;
2184 }
2099 2185
2100 [profileButton setDefaultImage:CreateProfileImage(itemIcon, kSmallImageSide,
2101 profiles::SHAPE_SQUARE)];
2102 [profileButton setImagePosition:NSImageLeft]; 2186 [profileButton setImagePosition:NSImageLeft];
2103 [profileButton setAlignment:NSLeftTextAlignment]; 2187 [profileButton setAlignment:NSLeftTextAlignment];
2104 [profileButton setBordered:NO]; 2188 [profileButton setBordered:NO];
2105 [profileButton setTag:itemIndex]; 2189 [profileButton setTag:itemIndex];
2106 [profileButton setTarget:self]; 2190 [profileButton setTarget:self];
2107 [profileButton setAction:@selector(switchToProfile:)]; 2191 [profileButton setAction:@selector(switchToProfile:)];
2108 2192
2109 NSSize textSize = [[profileButton title] sizeWithAttributes:@{ 2193 NSSize textSize = [[profileButton title] sizeWithAttributes:@{
2110 NSFontAttributeName : [profileButton font] 2194 NSFontAttributeName : [profileButton font]
2111 }]; 2195 }];
2112 2196
2113 CGFloat availableWidth = rect.size.width - kSmallImageSide -
2114 kImageTitleSpacing - kHorizontalSpacing;
2115
2116 if (std::ceil(textSize.width) > availableWidth) 2197 if (std::ceil(textSize.width) > availableWidth)
2117 [profileButton setToolTip:[profileButton title]]; 2198 [profileButton setToolTip:[profileButton title]];
2118 2199
2119 return profileButton.autorelease(); 2200 return profileButton.autorelease();
2120 } 2201 }
2121 2202
2122 - (NSView*)createOptionsViewWithRect:(NSRect)rect 2203 - (NSView*)createOptionsViewWithRect:(NSRect)rect
2123 displayLock:(BOOL)displayLock { 2204 displayLock:(BOOL)displayLock {
2124 NSRect viewRect = NSMakeRect(0, 0, 2205 NSRect viewRect = NSMakeRect(0, 0,
2125 rect.size.width, 2206 rect.size.width,
2126 kBlueButtonHeight + kSmallVerticalSpacing); 2207 kBlueButtonHeight + kSmallVerticalSpacing);
2127 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]); 2208 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]);
2128 2209
2129 if (displayLock) { 2210 if (displayLock) {
2130 NSButton* lockButton = 2211 NSButton* lockButton =
2131 [self hoverButtonWithRect:viewRect 2212 [self hoverButtonWithRect:viewRect
2132 text:l10n_util::GetNSString( 2213 text:l10n_util::GetNSString(
2133 IDS_PROFILES_PROFILE_SIGNOUT_BUTTON) 2214 IDS_PROFILES_PROFILE_SIGNOUT_BUTTON)
2134 imageResourceId:IDR_ICON_PROFILES_MENU_LOCK 2215 imageResourceId:IDR_ICON_PROFILES_MENU_LOCK
2135 action:@selector(lockProfile:)]; 2216 action:@selector(lockProfile:)];
2136 [container addSubview:lockButton]; 2217 [container addSubview:lockButton];
2137 viewRect.origin.y = NSMaxY([lockButton frame]); 2218 viewRect.origin.y = NSMaxY([lockButton frame]);
2138 2219
2139 NSBox* separator = [self horizontalSeparatorWithFrame:viewRect]; 2220 NSBox* separator = [self horizontalSeparatorWithFrame:viewRect];
2140 [container addSubview:separator]; 2221 [container addSubview:separator];
2141 viewRect.origin.y = NSMaxY([separator frame]); 2222 viewRect.origin.y = NSMaxY([separator frame]);
2142 } 2223 }
2143 2224
2144 if (!switches::IsMaterialDesignUserMenu() && [self shouldShowGoIncognito]) { 2225 if ([self shouldShowGoIncognito]) {
2145 NSButton* goIncognitoButton = 2226 NSButton* goIncognitoButton =
2146 [self hoverButtonWithRect:viewRect 2227 [self hoverButtonWithRect:viewRect
2147 text:l10n_util::GetNSString( 2228 text:l10n_util::GetNSString(
2148 IDS_PROFILES_GO_INCOGNITO_BUTTON) 2229 IDS_PROFILES_GO_INCOGNITO_BUTTON)
2149 imageResourceId:IDR_ICON_PROFILES_MENU_INCOGNITO 2230 imageResourceId:IDR_ICON_PROFILES_MENU_INCOGNITO
2150 action:@selector(goIncognito:)]; 2231 action:@selector(goIncognito:)];
2151 viewRect.origin.y = NSMaxY([goIncognitoButton frame]); 2232 viewRect.origin.y = NSMaxY([goIncognitoButton frame]);
2152 [container addSubview:goIncognitoButton]; 2233 [container addSubview:goIncognitoButton];
2153 2234
2154 NSBox* separator = [self horizontalSeparatorWithFrame:viewRect]; 2235 NSBox* separator = [self horizontalSeparatorWithFrame:viewRect];
2155 [container addSubview:separator]; 2236 [container addSubview:separator];
2156 viewRect.origin.y = NSMaxY([separator frame]); 2237 viewRect.origin.y = NSMaxY([separator frame]);
2157 } 2238 }
2158 2239
2159 NSString* text = isGuestSession_ ? 2240 NSString* text = isGuestSession_ ?
2160 l10n_util::GetNSString(IDS_PROFILES_EXIT_GUEST) : 2241 l10n_util::GetNSString(IDS_PROFILES_EXIT_GUEST) :
2161 l10n_util::GetNSString(IDS_PROFILES_SWITCH_USERS_BUTTON); 2242 l10n_util::GetNSString(IDS_PROFILES_SWITCH_USERS_BUTTON);
2162 if (!isGuestSession_ && switches::IsMaterialDesignUserMenu()) {
2163 text = l10n_util::GetNSString(IDS_PROFILES_MANAGE_USERS_BUTTON);
2164 }
2165 NSButton* switchUsersButton = 2243 NSButton* switchUsersButton =
2166 [self hoverButtonWithRect:viewRect 2244 [self hoverButtonWithRect:viewRect
2167 text:text 2245 text:text
2168 imageResourceId:IDR_ICON_PROFILES_MENU_AVATAR 2246 imageResourceId:IDR_ICON_PROFILES_MENU_AVATAR
2169 action:isGuestSession_? @selector(exitGuest:) : 2247 action:isGuestSession_? @selector(exitGuest:) :
2170 @selector(showUserManager:)]; 2248 @selector(showUserManager:)];
2171 viewRect.origin.y = NSMaxY([switchUsersButton frame]); 2249 viewRect.origin.y = NSMaxY([switchUsersButton frame]);
2172 [container addSubview:switchUsersButton]; 2250 [container addSubview:switchUsersButton];
2173 2251
2174 [container setFrameSize:NSMakeSize(rect.size.width, viewRect.origin.y)]; 2252 [container setFrameSize:NSMakeSize(rect.size.width, viewRect.origin.y)];
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 2287
2210 NSView* accountEmails = [self createAccountsListWithRect:NSMakeRect( 2288 NSView* accountEmails = [self createAccountsListWithRect:NSMakeRect(
2211 0, rect.origin.y, rect.size.width, kAccountButtonHeight)]; 2289 0, rect.origin.y, rect.size.width, kAccountButtonHeight)];
2212 [container addSubview:accountEmails]; 2290 [container addSubview:accountEmails];
2213 2291
2214 [container setFrameSize:NSMakeSize(rect.size.width, 2292 [container setFrameSize:NSMakeSize(rect.size.width,
2215 NSMaxY([accountEmails frame]))]; 2293 NSMaxY([accountEmails frame]))];
2216 return container.autorelease(); 2294 return container.autorelease();
2217 } 2295 }
2218 2296
2297 - (NSView*)createMaterialDesignOptionsViewWithRect:(NSRect)rect
groby-ooo-7-16 2016/07/20 20:54:22 Traditionally, this would be named create...WithFr
Jane 2016/07/20 22:03:46 Done. But there are soo many methods called create
groby-ooo-7-16 2016/07/21 00:01:46 I know - that's why I said the ship has sailed for
2298 displayLock:(BOOL)displayLock {
groby-ooo-7-16 2016/07/20 20:54:22 showLock: instead of displayLock: is usually the c
Jane 2016/07/20 22:03:46 Done. I went ahead to change all the displayLock -
2299 NSRect viewRect = NSMakeRect(0, 0, rect.size.width,
2300 kBlueButtonHeight + kSmallVerticalSpacing);
2301 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]);
2302 const int material_icon_size = 20;
2303
2304 // Create a lock profile button when supervised users exist; otherwise, create
2305 // a button that closes all of the current profile's windows if more than one
2306 // is open.
2307 if (displayLock) {
2308 NSButton* lockButton =
2309 [self hoverButtonWithRect:viewRect
2310 text:l10n_util::GetNSString(
2311 IDS_PROFILES_PROFILE_SIGNOUT_BUTTON)
2312 image:NSImageFromImageSkia(gfx::CreateVectorIcon(
2313 gfx::VectorIconId::LOCK,
2314 material_icon_size, gfx::kChromeIconGrey))
2315 action:@selector(lockProfile:)];
2316 [container addSubview:lockButton];
2317 viewRect.origin.y = NSMaxY([lockButton frame]);
2318 } else if (!isGuestSession_) {
2319 int num_browsers = 0;
2320 for (auto* browser : *BrowserList::GetInstance()) {
2321 if (browser->profile()->GetOriginalProfile() ==
2322 browser_->profile()->GetOriginalProfile())
groby-ooo-7-16 2016/07/20 20:54:22 nit: can you hoist the rhs into a separate variabl
Jane 2016/07/20 22:03:46 Done.
2323 num_browsers++;
2324 }
2325 if (num_browsers > 1) {
2326 NSButton* closeAllWindowsButton = [self
2327 hoverButtonWithRect:viewRect
2328 text:l10n_util::GetNSString(
2329 IDS_PROFILES_CLOSE_ALL_WINDOWS_BUTTON)
2330 image:NSImageFromImageSkia(gfx::CreateVectorIcon(
2331 gfx::VectorIconId::CLOSE_ALL,
2332 material_icon_size, gfx::kChromeIconGrey))
2333 action:@selector(closeAllWindows:)];
2334 [container addSubview:closeAllWindowsButton];
2335 viewRect.origin.y = NSMaxY([closeAllWindowsButton frame]);
2336 }
2337 }
2338
2339 // Create a manage users/exit guest button.
2340 NSString* text =
2341 isGuestSession_
2342 ? l10n_util::GetNSString(IDS_PROFILES_EXIT_GUEST)
2343 : l10n_util::GetNSString(IDS_PROFILES_MANAGE_USERS_BUTTON);
2344 NSImage* icon = NSImageFromImageSkia(
2345 gfx::CreateVectorIcon(isGuestSession_ ? gfx::VectorIconId::CLOSE_ALL
2346 : gfx::VectorIconId::SETTINGS,
2347 material_icon_size, gfx::kChromeIconGrey));
2348 SEL action =
2349 isGuestSession_ ? @selector(exitGuest:) : @selector(showUserManager:);
2350 NSButton* manageUsersButton =
2351 [self hoverButtonWithRect:viewRect text:text image:icon action:action];
2352 viewRect.origin.y = NSMaxY([manageUsersButton frame]);
2353 [container addSubview:manageUsersButton];
2354
2355 // Create a guest profile button.
2356 if (!isGuestSession_) {
2357 PrefService* service = g_browser_process->local_state();
groby-ooo-7-16 2016/07/20 20:54:22 See above question re: getting the prefs from |bro
Jane 2016/07/20 22:03:46 See above.
2358 DCHECK(service);
2359 if (service->GetBoolean(prefs::kBrowserGuestModeEnabled)) {
2360 NSButton* guestProfileButton = [self
2361 hoverButtonWithRect:viewRect
2362 text:l10n_util::GetNSString(
2363 IDS_PROFILES_GUEST_PROFILE_NAME)
2364 image:NSImageFromImageSkia(gfx::CreateVectorIcon(
2365 gfx::VectorIconId::ACCOUNT_CIRCLE,
2366 material_icon_size, gfx::kChromeIconGrey))
2367 action:@selector(switchToGuest:)];
2368 viewRect.origin.y = NSMaxY([guestProfileButton frame]);
2369 [container addSubview:guestProfileButton];
2370 }
2371 }
2372
2373 [container setFrameSize:NSMakeSize(rect.size.width, viewRect.origin.y)];
2374 return container.autorelease();
2375 }
2376
2219 - (NSView*)createAccountsListWithRect:(NSRect)rect { 2377 - (NSView*)createAccountsListWithRect:(NSRect)rect {
2220 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]); 2378 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]);
2221 currentProfileAccounts_.clear(); 2379 currentProfileAccounts_.clear();
2222 2380
2223 Profile* profile = browser_->profile(); 2381 Profile* profile = browser_->profile();
2224 std::string primaryAccount = 2382 std::string primaryAccount =
2225 SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedAccountId(); 2383 SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedAccountId();
2226 DCHECK(!primaryAccount.empty()); 2384 DCHECK(!primaryAccount.empty());
2227 std::vector<std::string>accounts = 2385 std::vector<std::string>accounts =
2228 profiles::GetSecondaryAccountsForProfile(profile, primaryAccount); 2386 profiles::GetSecondaryAccountsForProfile(profile, primaryAccount);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
2458 clickedOnLink:(id)link 2616 clickedOnLink:(id)link
2459 atIndex:(NSUInteger)charIndex { 2617 atIndex:(NSUInteger)charIndex {
2460 chrome::ShowSettings(browser_); 2618 chrome::ShowSettings(browser_);
2461 return YES; 2619 return YES;
2462 } 2620 }
2463 2621
2464 - (NSButton*)hoverButtonWithRect:(NSRect)rect 2622 - (NSButton*)hoverButtonWithRect:(NSRect)rect
2465 text:(NSString*)text 2623 text:(NSString*)text
2466 imageResourceId:(int)imageResourceId 2624 imageResourceId:(int)imageResourceId
2467 action:(SEL)action { 2625 action:(SEL)action {
2626 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
groby-ooo-7-16 2016/07/20 20:54:22 nit: Reference please.
Jane 2016/07/20 22:03:46 Done.
2627 NSImage* image = rb->GetNativeImageNamed(imageResourceId).ToNSImage();
2628 return [self hoverButtonWithRect:rect text:text image:image action:action];
2629 }
2630
2631 - (NSButton*)hoverButtonWithRect:(NSRect)rect
2632 text:(NSString*)text
2633 image:(NSImage*)image
2634 action:(SEL)action {
2468 BackgroundColorHoverButton* button = 2635 BackgroundColorHoverButton* button =
2469 [self hoverButtonWithRect:rect text:text action:action]; 2636 [self hoverButtonWithRect:rect text:text action:action];
2470 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
2471 NSImage* image = rb->GetNativeImageNamed(imageResourceId).ToNSImage();
2472 [button setDefaultImage:image]; 2637 [button setDefaultImage:image];
2473 [button setHoverImage:image]; 2638 [button setHoverImage:image];
2474 [button setPressedImage:image]; 2639 [button setPressedImage:image];
2475 [button setImagePosition:NSImageLeft]; 2640 [button setImagePosition:NSImageLeft];
2476 2641
2477 return button; 2642 return button;
2478 } 2643 }
2479 2644
2480 - (BackgroundColorHoverButton*)hoverButtonWithRect:(NSRect)rect 2645 - (BackgroundColorHoverButton*)hoverButtonWithRect:(NSRect)rect
2481 text:(NSString*)text 2646 text:(NSString*)text
2482 action:(SEL)action { 2647 action:(SEL)action {
2483 base::scoped_nsobject<BackgroundColorHoverButton> button( 2648 base::scoped_nsobject<BackgroundColorHoverButton> button(
2484 [[BackgroundColorHoverButton alloc] 2649 [[BackgroundColorHoverButton alloc]
2485 initWithFrame:rect 2650 initWithFrame:rect
2486 imageTitleSpacing:kImageTitleSpacing 2651 imageTitleSpacing:switches::IsMaterialDesignUserMenu()
2652 ? (kHorizontalSpacing - 2.0)
groby-ooo-7-16 2016/07/20 20:54:22 Why -2.0? (Please leave a comment explaining magic
Jane 2016/07/20 22:03:46 Done. Is this clear, and is this too long of a com
groby-ooo-7-16 2016/07/21 00:01:46 It's a bit long - but not exceedingly so. If you c
2653 : kImageTitleSpacing
2487 backgroundColor:GetDialogBackgroundColor()]); 2654 backgroundColor:GetDialogBackgroundColor()]);
2488 2655
2489 [button setTitle:text]; 2656 [button setTitle:text];
2490 [button setAlignment:NSLeftTextAlignment]; 2657 [button setAlignment:NSLeftTextAlignment];
2491 [button setBordered:NO]; 2658 [button setBordered:NO];
2492 [button setTarget:self]; 2659 [button setTarget:self];
2493 [button setAction:action]; 2660 [button setAction:action];
2494 2661
2495 return button.autorelease(); 2662 return button.autorelease();
2496 } 2663 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2582 } 2749 }
2583 2750
2584 - (bool)shouldShowGoIncognito { 2751 - (bool)shouldShowGoIncognito {
2585 bool incognitoAvailable = 2752 bool incognitoAvailable =
2586 IncognitoModePrefs::GetAvailability(browser_->profile()->GetPrefs()) != 2753 IncognitoModePrefs::GetAvailability(browser_->profile()->GetPrefs()) !=
2587 IncognitoModePrefs::DISABLED; 2754 IncognitoModePrefs::DISABLED;
2588 return incognitoAvailable && !browser_->profile()->IsGuestSession(); 2755 return incognitoAvailable && !browser_->profile()->IsGuestSession();
2589 } 2756 }
2590 2757
2591 @end 2758 @end
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698