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

Side by Side Diff: chrome/browser/ui/views/profiles/profile_chooser_view.cc

Issue 249813002: [Win] Redesign the avatar bubble UI (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 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
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 #include "chrome/browser/ui/views/profiles/profile_chooser_view.h" 5 #include "chrome/browser/ui/views/profiles/profile_chooser_view.h"
6 6
7 #include "base/prefs/pref_service.h" 7 #include "base/prefs/pref_service.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/lifetime/application_lifetime.h" 10 #include "chrome/browser/lifetime/application_lifetime.h"
(...skipping 16 matching lines...) Expand all
27 #include "components/signin/core/browser/profile_oauth2_token_service.h" 27 #include "components/signin/core/browser/profile_oauth2_token_service.h"
28 #include "components/signin/core/browser/signin_manager.h" 28 #include "components/signin/core/browser/signin_manager.h"
29 #include "components/signin/core/common/profile_management_switches.h" 29 #include "components/signin/core/common/profile_management_switches.h"
30 #include "grit/chromium_strings.h" 30 #include "grit/chromium_strings.h"
31 #include "grit/generated_resources.h" 31 #include "grit/generated_resources.h"
32 #include "grit/theme_resources.h" 32 #include "grit/theme_resources.h"
33 #include "third_party/skia/include/core/SkColor.h" 33 #include "third_party/skia/include/core/SkColor.h"
34 #include "ui/base/l10n/l10n_util.h" 34 #include "ui/base/l10n/l10n_util.h"
35 #include "ui/base/resource/resource_bundle.h" 35 #include "ui/base/resource/resource_bundle.h"
36 #include "ui/gfx/canvas.h" 36 #include "ui/gfx/canvas.h"
37 #include "ui/gfx/image/canvas_image_source.h"
37 #include "ui/gfx/image/image.h" 38 #include "ui/gfx/image/image.h"
38 #include "ui/gfx/image/image_skia.h" 39 #include "ui/gfx/image/image_skia.h"
39 #include "ui/gfx/text_elider.h" 40 #include "ui/gfx/text_elider.h"
40 #include "ui/native_theme/native_theme.h" 41 #include "ui/native_theme/native_theme.h"
41 #include "ui/views/controls/button/blue_button.h" 42 #include "ui/views/controls/button/blue_button.h"
42 #include "ui/views/controls/button/image_button.h" 43 #include "ui/views/controls/button/image_button.h"
43 #include "ui/views/controls/button/label_button.h" 44 #include "ui/views/controls/button/label_button.h"
44 #include "ui/views/controls/button/menu_button.h" 45 #include "ui/views/controls/button/menu_button.h"
45 #include "ui/views/controls/label.h" 46 #include "ui/views/controls/label.h"
46 #include "ui/views/controls/link.h" 47 #include "ui/views/controls/link.h"
47 #include "ui/views/controls/separator.h" 48 #include "ui/views/controls/separator.h"
48 #include "ui/views/controls/styled_label.h" 49 #include "ui/views/controls/styled_label.h"
49 #include "ui/views/controls/textfield/textfield.h" 50 #include "ui/views/controls/textfield/textfield.h"
50 #include "ui/views/controls/webview/webview.h" 51 #include "ui/views/controls/webview/webview.h"
51 #include "ui/views/layout/grid_layout.h" 52 #include "ui/views/layout/grid_layout.h"
52 #include "ui/views/layout/layout_constants.h" 53 #include "ui/views/layout/layout_constants.h"
53 #include "ui/views/widget/widget.h" 54 #include "ui/views/widget/widget.h"
54 55
55 namespace { 56 namespace {
56 57
57 // Helpers -------------------------------------------------------------------- 58 // Helpers --------------------------------------------------------------------
58 59
59 const int kFixedMenuWidth = 250; 60 const int kFixedMenuWidth = 250;
60 const int kButtonHeight = 29; 61 const int kButtonHeight = 29;
61 const int kProfileAvatarTutorialShowMax = 5; 62 const int kProfileAvatarTutorialShowMax = 5;
62 const int kFixedGaiaViewHeight = 400; 63 const int kFixedGaiaViewHeight = 400;
63 const int kFixedGaiaViewWidth = 360; 64 const int kFixedGaiaViewWidth = 360;
64 const int kFixedAccountRemovalViewWidth = 280; 65 const int kFixedAccountRemovalViewWidth = 280;
66 const int kLargeImageSide = 88;
65 67
66 // Creates a GridLayout with a single column. This ensures that all the child 68 // Creates a GridLayout with a single column. This ensures that all the child
67 // views added get auto-expanded to fill the full width of the bubble. 69 // views added get auto-expanded to fill the full width of the bubble.
68 views::GridLayout* CreateSingleColumnLayout(views::View* view, int width) { 70 views::GridLayout* CreateSingleColumnLayout(views::View* view, int width) {
69 views::GridLayout* layout = new views::GridLayout(view); 71 views::GridLayout* layout = new views::GridLayout(view);
70 view->SetLayoutManager(layout); 72 view->SetLayoutManager(layout);
71 73
72 views::ColumnSet* columns = layout->AddColumnSet(0); 74 views::ColumnSet* columns = layout->AddColumnSet(0);
73 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 75 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0,
74 views::GridLayout::FIXED, width, width); 76 views::GridLayout::FIXED, width, width);
(...skipping 16 matching lines...) Expand all
91 93
92 views::Link* CreateLink(const base::string16& link_text, 94 views::Link* CreateLink(const base::string16& link_text,
93 views::LinkListener* listener) { 95 views::LinkListener* listener) {
94 views::Link* link_button = new views::Link(link_text); 96 views::Link* link_button = new views::Link(link_text);
95 link_button->SetHorizontalAlignment(gfx::ALIGN_LEFT); 97 link_button->SetHorizontalAlignment(gfx::ALIGN_LEFT);
96 link_button->SetUnderline(false); 98 link_button->SetUnderline(false);
97 link_button->set_listener(listener); 99 link_button->set_listener(listener);
98 return link_button; 100 return link_button;
99 } 101 }
100 102
103 class BlankImageSource : public gfx::CanvasImageSource {
sky 2014/04/23 20:40:53 Why do you need this? Can't you either set a null
noms (inactive) 2014/04/24 14:29:23 The placeholder image needs to have the same size
sky 2014/04/24 16:27:45 https://code.google.com/p/chromium/codesearch#chro
noms (inactive) 2014/04/24 17:06:57 AH, that makes sense. Thanks! Done. On 2014/04/24
104 public:
105 explicit BlankImageSource(const gfx::Size& size_in_dip)
106 : CanvasImageSource(size_in_dip, /*is_opaque =*/ false) {
107 }
108 virtual ~BlankImageSource() {}
109
110 private:
111 // gfx::CanvasImageSource overrides:
112 virtual void Draw(gfx::Canvas* canvas) OVERRIDE {
113 canvas->DrawColor(SkColorSetARGB(0, 0, 0, 0));
114 }
115
116 DISALLOW_COPY_AND_ASSIGN(BlankImageSource);
117 };
101 118
102 // BackgroundColorHoverButton ------------------------------------------------- 119 // BackgroundColorHoverButton -------------------------------------------------
103 120
104 // A custom button that allows for setting a background color when hovered over. 121 // A custom button that allows for setting a background color when hovered over.
105 class BackgroundColorHoverButton : public views::LabelButton { 122 class BackgroundColorHoverButton : public views::LabelButton {
106 public: 123 public:
107 BackgroundColorHoverButton(views::ButtonListener* listener, 124 BackgroundColorHoverButton(views::ButtonListener* listener,
108 const base::string16& text, 125 const base::string16& text,
109 const gfx::ImageSkia& normal_icon, 126 const gfx::ImageSkia& normal_icon,
110 const gfx::ImageSkia& hover_icon); 127 const gfx::ImageSkia& hover_icon);
(...skipping 18 matching lines...) Expand all
129 SetImage(STATE_NORMAL, normal_icon); 146 SetImage(STATE_NORMAL, normal_icon);
130 SetImage(STATE_HOVERED, hover_icon); 147 SetImage(STATE_HOVERED, hover_icon);
131 SetImage(STATE_PRESSED, hover_icon); 148 SetImage(STATE_PRESSED, hover_icon);
132 } 149 }
133 150
134 BackgroundColorHoverButton::~BackgroundColorHoverButton() {} 151 BackgroundColorHoverButton::~BackgroundColorHoverButton() {}
135 152
136 void BackgroundColorHoverButton::OnPaint(gfx::Canvas* canvas) { 153 void BackgroundColorHoverButton::OnPaint(gfx::Canvas* canvas) {
137 if ((state() == STATE_PRESSED) || (state() == STATE_HOVERED) || HasFocus()) { 154 if ((state() == STATE_PRESSED) || (state() == STATE_HOVERED) || HasFocus()) {
138 canvas->DrawColor(GetNativeTheme()->GetSystemColor( 155 canvas->DrawColor(GetNativeTheme()->GetSystemColor(
139 ui::NativeTheme::kColorId_MenuSeparatorColor)); 156 ui::NativeTheme::kColorId_ButtonHoverBackgroundColor));
140 } 157 }
141 LabelButton::OnPaint(canvas); 158 LabelButton::OnPaint(canvas);
142 } 159 }
143 160
144 } // namespace 161 } // namespace
145 162
146 163
147 // EditableProfilePhoto ------------------------------------------------- 164 // EditableProfilePhoto -------------------------------------------------
148 165
149 // A custom Image control that shows a "change" button when moused over. 166 // A custom Image control that shows a "change" button when moused over.
150 class EditableProfilePhoto : public views::ImageView { 167 class EditableProfilePhoto : public views::ImageView {
151 public: 168 public:
152 EditableProfilePhoto(views::ButtonListener* listener, 169 EditableProfilePhoto(views::ButtonListener* listener,
153 const gfx::Image& icon, 170 const gfx::Image& icon,
154 bool is_editing_allowed) 171 bool is_editing_allowed,
172 const gfx::Rect& bounds)
155 : views::ImageView(), 173 : views::ImageView(),
156 change_photo_button_(NULL) { 174 change_photo_button_(NULL) {
157 const int kLargeImageSide = 64;
158 gfx::Image image = profiles::GetSizedAvatarIcon( 175 gfx::Image image = profiles::GetSizedAvatarIcon(
159 icon, true, 176 icon, true,
160 kLargeImageSide + profiles::kAvatarIconPadding, 177 kLargeImageSide + profiles::kAvatarIconPadding,
161 kLargeImageSide + profiles::kAvatarIconPadding); 178 kLargeImageSide + profiles::kAvatarIconPadding);
162 SetImage(image.ToImageSkia()); 179 SetImage(image.ToImageSkia());
180 SetBoundsRect(bounds);
163 181
164 if (!is_editing_allowed) 182 if (!is_editing_allowed)
165 return; 183 return;
166 184
167 set_notify_enter_exit_on_child(true); 185 set_notify_enter_exit_on_child(true);
168 186
169 // Button overlay that appears when hovering over the image. 187 // Button overlay that appears when hovering over the image.
170 change_photo_button_ = new views::LabelButton(listener, 188 change_photo_button_ = new views::LabelButton(listener,
171 l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_CHANGE_PHOTO_BUTTON)); 189 l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_CHANGE_PHOTO_BUTTON));
172 change_photo_button_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 190 change_photo_button_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
173 change_photo_button_->SetBorder(views::Border::NullBorder()); 191 change_photo_button_->SetBorder(views::Border::NullBorder());
174 const SkColor color = SK_ColorWHITE; 192 const SkColor color = SK_ColorWHITE;
175 change_photo_button_->SetTextColor(views::Button::STATE_NORMAL, color); 193 change_photo_button_->SetTextColor(views::Button::STATE_NORMAL, color);
176 change_photo_button_->SetTextColor(views::Button::STATE_HOVERED, color); 194 change_photo_button_->SetTextColor(views::Button::STATE_HOVERED, color);
177 195
178 const SkColor kBackgroundColor = SkColorSetARGB(125, 0, 0, 0); 196 const SkColor kBackgroundColor = SkColorSetARGB(125, 0, 0, 0);
179 change_photo_button_->set_background( 197 change_photo_button_->set_background(
180 views::Background::CreateSolidBackground(kBackgroundColor)); 198 views::Background::CreateSolidBackground(kBackgroundColor));
181 // Need to take into account the border padding on the avatar. 199 // Need to take into account the border padding on the avatar.
182 const int kOverlayHeight = 20; 200 const int kOverlayHeight = 20;
183 change_photo_button_->SetBounds( 201 change_photo_button_->SetBounds(
184 profiles::kAvatarIconPadding, 202 bounds.origin().x(),
185 kLargeImageSide - kOverlayHeight, 203 bounds.origin().y() + kLargeImageSide - kOverlayHeight,
186 kLargeImageSide - profiles::kAvatarIconPadding, 204 kLargeImageSide,
187 kOverlayHeight); 205 kOverlayHeight);
188 change_photo_button_->SetVisible(false); 206 change_photo_button_->SetVisible(false);
189 AddChildView(change_photo_button_); 207 AddChildView(change_photo_button_);
190 } 208 }
191 209
192 views::LabelButton* change_photo_button() { return change_photo_button_; } 210 views::LabelButton* change_photo_button() { return change_photo_button_; }
193 211
194 private: 212 private:
195 // views::View: 213 // views::View:
196 virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { 214 virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE {
(...skipping 22 matching lines...) Expand all
219 public: 237 public:
220 EditableProfileName(views::TextfieldController* controller, 238 EditableProfileName(views::TextfieldController* controller,
221 const base::string16& text, 239 const base::string16& text,
222 bool is_editing_allowed) 240 bool is_editing_allowed)
223 : views::LabelButton(this, text), 241 : views::LabelButton(this, text),
224 profile_name_textfield_(NULL) { 242 profile_name_textfield_(NULL) {
225 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 243 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
226 const gfx::FontList& medium_font_list = 244 const gfx::FontList& medium_font_list =
227 rb->GetFontList(ui::ResourceBundle::MediumFont); 245 rb->GetFontList(ui::ResourceBundle::MediumFont);
228 SetFontList(medium_font_list); 246 SetFontList(medium_font_list);
229 SetBorder(views::Border::NullBorder()); 247 SetHorizontalAlignment(gfx::ALIGN_CENTER);
230 248
231 if (!is_editing_allowed) 249 if (!is_editing_allowed)
232 return; 250 return;
233 251
234 SetImage(STATE_HOVERED, 252 // Show an "edit" pencil icon when hovering over. In the default state,
235 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_EDIT_HOVER)); 253 // we need to create an empty placeholder of the correct size, so that
254 // the text doesn't jump around when the hovered icon appears.
255 gfx::ImageSkia hover_image =
256 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_EDIT_HOVER);
257 SetImage(STATE_NORMAL, gfx::ImageSkia(
258 new BlankImageSource(hover_image.size()),
259 hover_image.size()));
260 SetImage(STATE_HOVERED, hover_image);
236 SetImage(STATE_PRESSED, 261 SetImage(STATE_PRESSED,
237 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_EDIT_PRESSED)); 262 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_EDIT_PRESSED));
263 // To center the text, we need to offest it by the width of the icon we
264 // are adding. We need to also add a small top/bottom padding to account
265 // for the textfield's border.
266 SetBorder(views::Border::CreateEmptyBorder(2, hover_image.width(), 2, 0));
238 267
239 // Textfield that overlaps the button. 268 // Textfield that overlaps the button.
240 profile_name_textfield_ = new views::Textfield(); 269 profile_name_textfield_ = new views::Textfield();
241 profile_name_textfield_->set_controller(controller); 270 profile_name_textfield_->set_controller(controller);
242 profile_name_textfield_->SetFontList(medium_font_list); 271 profile_name_textfield_->SetFontList(medium_font_list);
272 profile_name_textfield_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
273
243 profile_name_textfield_->SetVisible(false); 274 profile_name_textfield_->SetVisible(false);
244 AddChildView(profile_name_textfield_); 275 AddChildView(profile_name_textfield_);
245 } 276 }
246 277
247 views::Textfield* profile_name_textfield() { 278 views::Textfield* profile_name_textfield() {
248 return profile_name_textfield_; 279 return profile_name_textfield_;
249 } 280 }
250 281
251 // Hide the editable textfield to show the profile name button instead. 282 // Hide the editable textfield to show the profile name button instead.
252 void ShowReadOnlyView() { 283 void ShowReadOnlyView() {
(...skipping 20 matching lines...) Expand all
273 // part of the new profile name typed in the textfield. 304 // part of the new profile name typed in the textfield.
274 return false; 305 return false;
275 } 306 }
276 307
277 virtual void Layout() OVERRIDE { 308 virtual void Layout() OVERRIDE {
278 if (profile_name_textfield_) 309 if (profile_name_textfield_)
279 profile_name_textfield_->SetBounds(0, 0, width(), height()); 310 profile_name_textfield_->SetBounds(0, 0, width(), height());
280 // This layout trick keeps the text left-aligned and the icon right-aligned. 311 // This layout trick keeps the text left-aligned and the icon right-aligned.
281 SetHorizontalAlignment(gfx::ALIGN_RIGHT); 312 SetHorizontalAlignment(gfx::ALIGN_RIGHT);
282 views::LabelButton::Layout(); 313 views::LabelButton::Layout();
283 label()->SetHorizontalAlignment(gfx::ALIGN_LEFT); 314 label()->SetHorizontalAlignment(gfx::ALIGN_CENTER);
284 } 315 }
285 316
286 // Button that is shown when hovering over the image view. Can be NULL if 317 // Textfield that is shown when editing the profile name. Can be NULL if
287 // the profile name isn't allowed to be edited (e.g. for guest profiles). 318 // the profile name isn't allowed to be edited (e.g. for guest profiles).
288 views::Textfield* profile_name_textfield_; 319 views::Textfield* profile_name_textfield_;
289 320
290 DISALLOW_COPY_AND_ASSIGN(EditableProfileName); 321 DISALLOW_COPY_AND_ASSIGN(EditableProfileName);
291 }; 322 };
292 323
293 // A title card with one back button right aligned and one label center aligned. 324 // A title card with one back button right aligned and one label center aligned.
294 class TitleCard : public views::View { 325 class TitleCard : public views::View {
295 public: 326 public:
296 TitleCard(int message_id, views::ButtonListener* listener, 327 TitleCard(int message_id, views::ButtonListener* listener,
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 ProfileOAuth2TokenServiceFactory::GetForProfile(browser_->profile()); 439 ProfileOAuth2TokenServiceFactory::GetForProfile(browser_->profile());
409 if (oauth2_token_service) 440 if (oauth2_token_service)
410 oauth2_token_service->RemoveObserver(this); 441 oauth2_token_service->RemoveObserver(this);
411 } 442 }
412 443
413 void ProfileChooserView::ResetView() { 444 void ProfileChooserView::ResetView() {
414 manage_accounts_link_ = NULL; 445 manage_accounts_link_ = NULL;
415 signin_current_profile_link_ = NULL; 446 signin_current_profile_link_ = NULL;
416 users_button_ = NULL; 447 users_button_ = NULL;
417 lock_button_ = NULL; 448 lock_button_ = NULL;
418 add_account_button_ = NULL; 449 add_account_link_ = NULL;
419 current_profile_photo_ = NULL; 450 current_profile_photo_ = NULL;
420 current_profile_name_ = NULL; 451 current_profile_name_ = NULL;
421 tutorial_ok_button_ = NULL; 452 tutorial_ok_button_ = NULL;
422 tutorial_learn_more_link_ = NULL; 453 tutorial_learn_more_link_ = NULL;
423 tutorial_enable_new_profile_management_button_ = NULL; 454 tutorial_enable_new_profile_management_button_ = NULL;
424 account_removal_cancel_button_ = NULL; 455 account_removal_cancel_button_ = NULL;
425 gaia_signin_cancel_button_ = NULL; 456 gaia_signin_cancel_button_ = NULL;
426 open_other_profile_indexes_map_.clear(); 457 open_other_profile_indexes_map_.clear();
427 current_profile_accounts_map_.clear(); 458 current_profile_accounts_map_.clear();
428 tutorial_showing_ = false; 459 tutorial_showing_ = false;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 // Disable button after clicking so that it doesn't get clicked twice and 540 // Disable button after clicking so that it doesn't get clicked twice and
510 // start a second action... which can crash Chrome. But don't disable if it 541 // start a second action... which can crash Chrome. But don't disable if it
511 // has no parent (like in tests) because that will also crash. 542 // has no parent (like in tests) because that will also crash.
512 if (sender->parent()) 543 if (sender->parent())
513 sender->SetEnabled(false); 544 sender->SetEnabled(false);
514 545
515 if (sender == users_button_) { 546 if (sender == users_button_) {
516 profiles::ShowUserManagerMaybeWithTutorial(browser_->profile()); 547 profiles::ShowUserManagerMaybeWithTutorial(browser_->profile());
517 } else if (sender == lock_button_) { 548 } else if (sender == lock_button_) {
518 profiles::LockProfile(browser_->profile()); 549 profiles::LockProfile(browser_->profile());
519 } else if (sender == add_account_button_) {
520 ShowView(BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT, avatar_menu_.get());
521 } else if (sender == tutorial_ok_button_) { 550 } else if (sender == tutorial_ok_button_) {
522 // If the user manually dismissed the tutorial, never show it again by 551 // If the user manually dismissed the tutorial, never show it again by
523 // setting the number of times shown to the maximum plus 1, so that later we 552 // setting the number of times shown to the maximum plus 1, so that later we
524 // could distinguish between the dismiss case and the case when the tutorial 553 // could distinguish between the dismiss case and the case when the tutorial
525 // is indeed shown for the maximum number of times. 554 // is indeed shown for the maximum number of times.
526 browser_->profile()->GetPrefs()->SetInteger( 555 browser_->profile()->GetPrefs()->SetInteger(
527 prefs::kProfileAvatarTutorialShown, kProfileAvatarTutorialShowMax + 1); 556 prefs::kProfileAvatarTutorialShown, kProfileAvatarTutorialShowMax + 1);
528 ShowView(BUBBLE_VIEW_MODE_PROFILE_CHOOSER, avatar_menu_.get()); 557 ShowView(BUBBLE_VIEW_MODE_PROFILE_CHOOSER, avatar_menu_.get());
529 } else if (sender == tutorial_enable_new_profile_management_button_) { 558 } else if (sender == tutorial_enable_new_profile_management_button_) {
530 profiles::EnableNewProfileManagementPreview(); 559 profiles::EnableNewProfileManagementPreview();
531 } else if (sender == remove_account_and_relaunch_button_) { 560 } else if (sender == remove_account_and_relaunch_button_) {
532 RemoveAccount(); 561 RemoveAccount();
533 } else if (sender == account_removal_cancel_button_) { 562 } else if (sender == account_removal_cancel_button_) {
534 account_id_to_remove_.clear(); 563 account_id_to_remove_.clear();
535 ShowView(BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get()); 564 ShowView(BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get());
536 } else if (sender == gaia_signin_cancel_button_) { 565 } else if (sender == gaia_signin_cancel_button_) {
537 std::string primary_account = 566 std::string primary_account =
538 SigninManagerFactory::GetForProfile(browser_->profile())-> 567 SigninManagerFactory::GetForProfile(browser_->profile())->
539 GetAuthenticatedUsername(); 568 GetAuthenticatedUsername();
540 ShowView(primary_account.empty() ? BUBBLE_VIEW_MODE_PROFILE_CHOOSER : 569 ShowView(primary_account.empty() ? BUBBLE_VIEW_MODE_PROFILE_CHOOSER :
541 BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, 570 BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT,
542 avatar_menu_.get()); 571 avatar_menu_.get());
543 } else if (current_profile_photo_ && 572 } else if (current_profile_photo_ &&
544 sender == current_profile_photo_->change_photo_button()) { 573 sender == current_profile_photo_->change_photo_button()) {
545 avatar_menu_->EditProfile(avatar_menu_->GetActiveProfileIndex()); 574 avatar_menu_->EditProfile(avatar_menu_->GetActiveProfileIndex());
575 } else if (sender == signin_current_profile_link_) {
576 ShowView(BUBBLE_VIEW_MODE_GAIA_SIGNIN, avatar_menu_.get());
546 } else { 577 } else {
547 // One of the "other profiles" buttons was pressed. 578 // Either one of the "other profiles", or one of the profile accounts
548 ButtonIndexes::const_iterator match = 579 // buttons was pressed.
580 ButtonIndexes::const_iterator profile_match =
549 open_other_profile_indexes_map_.find(sender); 581 open_other_profile_indexes_map_.find(sender);
550 DCHECK(match != open_other_profile_indexes_map_.end()); 582 if (profile_match != open_other_profile_indexes_map_.end()) {
551 avatar_menu_->SwitchToProfile( 583 avatar_menu_->SwitchToProfile(
552 match->second, 584 profile_match->second,
553 ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW, 585 ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW,
554 ProfileMetrics::SWITCH_PROFILE_ICON); 586 ProfileMetrics::SWITCH_PROFILE_ICON);
587 } else {
588 // This was a profile accounts button.
589 AccountButtonIndexes::const_iterator account_match =
590 current_profile_accounts_map_.find(sender);
591 DCHECK(account_match != current_profile_accounts_map_.end());
592 account_id_to_remove_ = account_match->second;
593 ShowView(BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL, avatar_menu_.get());
594 }
555 } 595 }
556 } 596 }
557 597
558 void ProfileChooserView::OnMenuButtonClicked(views::View* source,
559 const gfx::Point& point) {
560 AccountButtonIndexes::const_iterator match =
561 current_profile_accounts_map_.find(source);
562 DCHECK(match != current_profile_accounts_map_.end());
563 account_id_to_remove_ = match->second;
564 ShowView(BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL, avatar_menu_.get());
565 }
566
567 void ProfileChooserView::RemoveAccount() { 598 void ProfileChooserView::RemoveAccount() {
568 DCHECK(!account_id_to_remove_.empty()); 599 DCHECK(!account_id_to_remove_.empty());
569 MutableProfileOAuth2TokenService* oauth2_token_service = 600 MutableProfileOAuth2TokenService* oauth2_token_service =
570 ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile( 601 ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile(
571 browser_->profile()); 602 browser_->profile());
572 if (oauth2_token_service) 603 if (oauth2_token_service)
573 oauth2_token_service->RevokeCredentials(account_id_to_remove_); 604 oauth2_token_service->RevokeCredentials(account_id_to_remove_);
574 account_id_to_remove_.clear(); 605 account_id_to_remove_.clear();
575 606
576 chrome::AttemptRestart(); 607 chrome::AttemptRestart();
577 } 608 }
578 609
579 void ProfileChooserView::LinkClicked(views::Link* sender, int event_flags) { 610 void ProfileChooserView::LinkClicked(views::Link* sender, int event_flags) {
580 if (sender == manage_accounts_link_) { 611 if (sender == manage_accounts_link_) {
581 // ShowView() will DCHECK if this view is displayed for non signed-in users. 612 // This link can either mean show/hide the account management view,
582 ShowView(BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get()); 613 // depending on which view it is displayed. ShowView() will DCHECK if
583 } else if (sender == tutorial_learn_more_link_) { 614 // the account management view is displayed for non signed-in users.
615 ShowView(
616 view_mode_ == BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT ?
617 BUBBLE_VIEW_MODE_PROFILE_CHOOSER :
618 BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT,
619 avatar_menu_.get());
620 } else if (sender == add_account_link_) {
621 ShowView(BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT, avatar_menu_.get());
622 } else {
623 DCHECK(sender == tutorial_learn_more_link_);
584 // TODO(guohui): update |learn_more_url| once it is decided. 624 // TODO(guohui): update |learn_more_url| once it is decided.
585 const GURL lear_more_url("https://support.google.com/chrome/?hl=en#to"); 625 const GURL lear_more_url("https://support.google.com/chrome/?hl=en#to");
586 chrome::NavigateParams params( 626 chrome::NavigateParams params(
587 browser_->profile(), 627 browser_->profile(),
588 lear_more_url, 628 lear_more_url,
589 content::PAGE_TRANSITION_LINK); 629 content::PAGE_TRANSITION_LINK);
590 params.disposition = NEW_FOREGROUND_TAB; 630 params.disposition = NEW_FOREGROUND_TAB;
591 chrome::Navigate(&params); 631 chrome::Navigate(&params);
592 } else {
593 DCHECK(sender == signin_current_profile_link_);
594 ShowView(BUBBLE_VIEW_MODE_GAIA_SIGNIN, avatar_menu_.get());
595 } 632 }
596 } 633 }
597 634
598 void ProfileChooserView::StyledLabelLinkClicked( 635 void ProfileChooserView::StyledLabelLinkClicked(
599 const gfx::Range& range, int event_flags) { 636 const gfx::Range& range, int event_flags) {
600 chrome::ShowSettings(browser_); 637 chrome::ShowSettings(browser_);
601 } 638 }
602 639
603 bool ProfileChooserView::HandleKeyEvent(views::Textfield* sender, 640 bool ProfileChooserView::HandleKeyEvent(views::Textfield* sender,
604 const ui::KeyEvent& key_event) { 641 const ui::KeyEvent& key_event) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 // Separate items into active and alternatives. 676 // Separate items into active and alternatives.
640 Indexes other_profiles; 677 Indexes other_profiles;
641 views::View* tutorial_view = NULL; 678 views::View* tutorial_view = NULL;
642 views::View* current_profile_view = NULL; 679 views::View* current_profile_view = NULL;
643 views::View* current_profile_accounts = NULL; 680 views::View* current_profile_accounts = NULL;
644 views::View* option_buttons_view = NULL; 681 views::View* option_buttons_view = NULL;
645 for (size_t i = 0; i < avatar_menu->GetNumberOfItems(); ++i) { 682 for (size_t i = 0; i < avatar_menu->GetNumberOfItems(); ++i) {
646 const AvatarMenu::Item& item = avatar_menu->GetItemAt(i); 683 const AvatarMenu::Item& item = avatar_menu->GetItemAt(i);
647 if (item.active) { 684 if (item.active) {
648 option_buttons_view = CreateOptionsView(item.signed_in); 685 option_buttons_view = CreateOptionsView(item.signed_in);
686 current_profile_view = CreateCurrentProfileView(item, false);
649 if (view_mode_ == BUBBLE_VIEW_MODE_PROFILE_CHOOSER) { 687 if (view_mode_ == BUBBLE_VIEW_MODE_PROFILE_CHOOSER) {
650 tutorial_view = switches::IsNewProfileManagement() ? 688 tutorial_view = switches::IsNewProfileManagement() ?
651 CreatePreviewEnabledTutorialView(item, tutorial_shown) : 689 CreatePreviewEnabledTutorialView(item, tutorial_shown) :
652 CreateNewProfileManagementPreviewView(); 690 CreateNewProfileManagementPreviewView();
653 current_profile_view = CreateCurrentProfileView(item, false);
654 } else { 691 } else {
655 current_profile_view = CreateCurrentProfileEditableView(item);
656 current_profile_accounts = CreateCurrentProfileAccountsView(item); 692 current_profile_accounts = CreateCurrentProfileAccountsView(item);
657 } 693 }
658 } else { 694 } else {
659 other_profiles.push_back(i); 695 other_profiles.push_back(i);
660 } 696 }
661 } 697 }
662 698
663 if (tutorial_view) { 699 if (tutorial_view) {
664 layout->StartRow(1, 0); 700 layout->StartRow(1, 0);
665 layout->AddView(tutorial_view); 701 layout->AddView(tutorial_view);
(...skipping 16 matching lines...) Expand all
682 DCHECK(current_profile_accounts); 718 DCHECK(current_profile_accounts);
683 layout->StartRow(0, 0); 719 layout->StartRow(0, 0);
684 layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 720 layout->AddView(new views::Separator(views::Separator::HORIZONTAL));
685 layout->StartRow(1, 0); 721 layout->StartRow(1, 0);
686 layout->AddView(current_profile_accounts); 722 layout->AddView(current_profile_accounts);
687 } 723 }
688 724
689 layout->StartRow(0, 0); 725 layout->StartRow(0, 0);
690 layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 726 layout->AddView(new views::Separator(views::Separator::HORIZONTAL));
691 727
692 // Action buttons. 728 // Option buttons. Only available with the new profile management flag.
693 layout->StartRow(0, 0); 729 if (switches::IsNewProfileManagement()) {
694 layout->AddView(option_buttons_view); 730 layout->StartRow(0, 0);
731 layout->AddView(option_buttons_view);
732 }
695 733
696 return view; 734 return view;
697 } 735 }
698 736
699 views::View* ProfileChooserView::CreatePreviewEnabledTutorialView( 737 views::View* ProfileChooserView::CreatePreviewEnabledTutorialView(
700 const AvatarMenu::Item& current_avatar_item, 738 const AvatarMenu::Item& current_avatar_item,
701 bool tutorial_shown) { 739 bool tutorial_shown) {
702 if (!switches::IsNewProfileManagementPreviewEnabled()) 740 if (!switches::IsNewProfileManagementPreviewEnabled())
703 return NULL; 741 return NULL;
704 742
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 layout_with_caret->AddView(view); 853 layout_with_caret->AddView(view);
816 layout_with_caret->StartRow(1, 0); 854 layout_with_caret->StartRow(1, 0);
817 layout_with_caret->AddView(padded_caret_view); 855 layout_with_caret->AddView(padded_caret_view);
818 return view_with_caret; 856 return view_with_caret;
819 } 857 }
820 858
821 views::View* ProfileChooserView::CreateCurrentProfileView( 859 views::View* ProfileChooserView::CreateCurrentProfileView(
822 const AvatarMenu::Item& avatar_item, 860 const AvatarMenu::Item& avatar_item,
823 bool is_guest) { 861 bool is_guest) {
824 views::View* view = new views::View(); 862 views::View* view = new views::View();
825 views::GridLayout* layout = CreateDoubleColumnLayout(view); 863 int column_width = kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew;
864 views::GridLayout* layout = CreateSingleColumnLayout(view, column_width);
826 layout->SetInsets(views::kButtonVEdgeMarginNew, 865 layout->SetInsets(views::kButtonVEdgeMarginNew,
827 views::kButtonHEdgeMarginNew, 866 views::kButtonHEdgeMarginNew,
828 views::kButtonVEdgeMarginNew, 867 views::kRelatedControlVerticalSpacing,
829 views::kButtonHEdgeMarginNew); 868 views::kButtonHEdgeMarginNew);
830 869
831 current_profile_photo_ = 870 // Profile icon, centered.
832 new EditableProfilePhoto(this, avatar_item.icon, !is_guest); 871 float x_offset = (column_width - kLargeImageSide) / 2;
833 view->SetBoundsRect(current_profile_photo_->bounds()); 872 current_profile_photo_ = new EditableProfilePhoto(
873 this, avatar_item.icon, !is_guest,
874 gfx::Rect(x_offset, 0, kLargeImageSide, kLargeImageSide));
875 layout->StartRow(1, 0);
876 layout->AddView(current_profile_photo_);
877
878 // Profile name, centered.
834 current_profile_name_ = new EditableProfileName( 879 current_profile_name_ = new EditableProfileName(
835 this, profiles::GetAvatarNameForProfile(browser_->profile()), !is_guest); 880 this, profiles::GetAvatarNameForProfile(browser_->profile()), !is_guest);
836 layout->StartRow(1, 0); 881 layout->StartRow(1, 0);
837 layout->AddView(current_profile_photo_, 1, 3);
838 layout->AddView(current_profile_name_); 882 layout->AddView(current_profile_name_);
839 883
840 if (is_guest) { 884 if (is_guest)
841 layout->StartRow(1, 0); 885 return view;
842 layout->SkipColumns(1); 886
843 layout->StartRow(1, 0); 887 // The available links depend on the type of profile that is active.
844 layout->SkipColumns(1); 888 layout->StartRow(1, 0);
845 } else if (avatar_item.signed_in) { 889 if (avatar_item.signed_in) {
846 manage_accounts_link_ = CreateLink( 890 if (switches::IsNewProfileManagement()) {
847 l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_MANAGE_ACCOUNTS_BUTTON), 891 base::string16 link_title = l10n_util::GetStringUTF16(
848 this); 892 view_mode_ == BUBBLE_VIEW_MODE_PROFILE_CHOOSER ?
849 layout->StartRow(1, 0); 893 IDS_PROFILES_PROFILE_MANAGE_ACCOUNTS_BUTTON :
850 layout->SkipColumns(1); 894 IDS_PROFILES_PROFILE_HIDE_MANAGE_ACCOUNTS_BUTTON);
851 layout->AddView(manage_accounts_link_); 895 manage_accounts_link_ = CreateLink(link_title, this);
852 layout->StartRow(1, 0); 896 manage_accounts_link_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
853 layout->SkipColumns(1); 897 layout->AddView(manage_accounts_link_);
898 } else {
899 views::Label* email_label = new views::Label(avatar_item.sync_state);
900 email_label->SetHorizontalAlignment(gfx::ALIGN_CENTER);
901 layout->AddView(email_label);
902 }
854 } else { 903 } else {
855 signin_current_profile_link_ = CreateLink( 904 signin_current_profile_link_ = new views::BlueButton(
856 l10n_util::GetStringFUTF16( 905 this, l10n_util::GetStringFUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL,
857 IDS_SYNC_START_SYNC_BUTTON_LABEL, 906 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)));
858 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)),
859 this);
860 layout->StartRow(1, 0);
861 layout->SkipColumns(1);
862 layout->AddView(signin_current_profile_link_); 907 layout->AddView(signin_current_profile_link_);
863 layout->StartRow(1, 0);
864 layout->SkipColumns(1);
865 } 908 }
866 909
867 return view; 910 return view;
868 } 911 }
869 912
870 views::View* ProfileChooserView::CreateCurrentProfileEditableView(
871 const AvatarMenu::Item& avatar_item) {
872 DCHECK(avatar_item.signed_in);
873 views::View* view = new views::View();
874 views::GridLayout* layout = CreateDoubleColumnLayout(view);
875 layout->SetInsets(views::kButtonVEdgeMarginNew,
876 views::kButtonHEdgeMarginNew,
877 views::kButtonVEdgeMarginNew,
878 views::kButtonHEdgeMarginNew);
879
880 current_profile_photo_ =
881 new EditableProfilePhoto(this, avatar_item.icon, true);
882 view->SetBoundsRect(current_profile_photo_->bounds());
883 current_profile_name_ = new EditableProfileName(
884 this, profiles::GetAvatarNameForProfile(browser_->profile()), true);
885
886 layout->StartRow(1, 0);
887 layout->AddView(current_profile_photo_, 1, 3);
888 layout->AddView(current_profile_name_);
889
890 layout->StartRow(1, 0);
891 layout->SkipColumns(1);
892
893 layout->StartRow(1, 0);
894 layout->SkipColumns(1);
895 return view;
896 }
897
898 views::View* ProfileChooserView::CreateGuestProfileView() { 913 views::View* ProfileChooserView::CreateGuestProfileView() {
899 gfx::Image guest_icon = 914 gfx::Image guest_icon =
900 ui::ResourceBundle::GetSharedInstance().GetImageNamed( 915 ui::ResourceBundle::GetSharedInstance().GetImageNamed(
901 profiles::GetPlaceholderAvatarIconResourceID()); 916 profiles::GetPlaceholderAvatarIconResourceID());
902 AvatarMenu::Item guest_avatar_item(0, 0, guest_icon); 917 AvatarMenu::Item guest_avatar_item(0, 0, guest_icon);
903 guest_avatar_item.active = true; 918 guest_avatar_item.active = true;
904 guest_avatar_item.name = l10n_util::GetStringUTF16( 919 guest_avatar_item.name = l10n_util::GetStringUTF16(
905 IDS_PROFILES_GUEST_PROFILE_NAME); 920 IDS_PROFILES_GUEST_PROFILE_NAME);
906 guest_avatar_item.signed_in = false; 921 guest_avatar_item.signed_in = false;
907 922
908 return CreateCurrentProfileView(guest_avatar_item, true); 923 return CreateCurrentProfileView(guest_avatar_item, true);
909 } 924 }
910 925
911 views::View* ProfileChooserView::CreateOtherProfilesView( 926 views::View* ProfileChooserView::CreateOtherProfilesView(
912 const Indexes& avatars_to_show) { 927 const Indexes& avatars_to_show) {
913 views::View* view = new views::View(); 928 views::View* view = new views::View();
914 views::GridLayout* layout = CreateSingleColumnLayout( 929 views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth);
915 view, kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew); 930
916 layout->SetInsets(0, views::kButtonHEdgeMarginNew,
917 views::kButtonVEdgeMarginNew, views::kButtonHEdgeMarginNew);
918 int num_avatars_to_show = avatars_to_show.size(); 931 int num_avatars_to_show = avatars_to_show.size();
919 for (int i = 0; i < num_avatars_to_show; ++i) { 932 for (int i = 0; i < num_avatars_to_show; ++i) {
920 const size_t index = avatars_to_show[i]; 933 const size_t index = avatars_to_show[i];
921 const AvatarMenu::Item& item = avatar_menu_->GetItemAt(index); 934 const AvatarMenu::Item& item = avatar_menu_->GetItemAt(index);
922 const int kSmallImageSide = 32; 935 const int kSmallImageSide = 32;
923 936
924 gfx::Image image = profiles::GetSizedAvatarIcon( 937 gfx::Image image = profiles::GetSizedAvatarIcon(
925 item.icon, true, 938 item.icon, true,
926 kSmallImageSide + profiles::kAvatarIconPadding, 939 kSmallImageSide + profiles::kAvatarIconPadding,
927 kSmallImageSide + profiles::kAvatarIconPadding); 940 kSmallImageSide + profiles::kAvatarIconPadding);
928 941
929 views::LabelButton* button = new views::LabelButton(this, item.name); 942 views::LabelButton* button = new BackgroundColorHoverButton(
943 this,
944 item.name,
945 *image.ToImageSkia(),
946 *image.ToImageSkia());
947 button->set_min_size(gfx::Size(
948 0, kButtonHeight + views::kRelatedControlVerticalSpacing));
949
930 open_other_profile_indexes_map_[button] = index; 950 open_other_profile_indexes_map_[button] = index;
931 button->SetImage(views::Button::STATE_NORMAL, *image.ToImageSkia());
932 button->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
933 ui::ResourceBundle::MediumFont));
934 button->SetBorder(views::Border::NullBorder());
935 951
936 layout->StartRow(1, 0); 952 layout->StartRow(1, 0);
953 layout->AddView(new views::Separator(views::Separator::HORIZONTAL));
954 layout->StartRow(1, 0);
937 layout->AddView(button); 955 layout->AddView(button);
938
939 // The last avatar in the list does not need any bottom padding.
940 if (i < num_avatars_to_show - 1)
941 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
942 } 956 }
943 957
944 return view; 958 return view;
945 } 959 }
946 960
947 views::View* ProfileChooserView::CreateOptionsView(bool enable_lock) { 961 views::View* ProfileChooserView::CreateOptionsView(bool enable_lock) {
948 views::View* view = new views::View(); 962 views::View* view = new views::View();
949 views::GridLayout* layout; 963 views::GridLayout* layout;
950 964
951 // Only signed-in users have the ability to lock. 965 // Only signed-in users have the ability to lock.
952 if (enable_lock) { 966 if (enable_lock) {
953 layout = new views::GridLayout(view); 967 layout = new views::GridLayout(view);
954 views::ColumnSet* columns = layout->AddColumnSet(0); 968 views::ColumnSet* columns = layout->AddColumnSet(0);
955 int width_of_lock_button = 969 int width_of_lock_button =
956 2 * views::kUnrelatedControlLargeHorizontalSpacing + 12; 970 2 * views::kUnrelatedControlLargeHorizontalSpacing + 12;
957 int width_of_users_button = kFixedMenuWidth - width_of_lock_button; 971 int width_of_users_button = kFixedMenuWidth - width_of_lock_button;
958 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 972 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0,
959 views::GridLayout::FIXED, width_of_users_button, 973 views::GridLayout::FIXED, width_of_users_button,
960 width_of_users_button); 974 width_of_users_button);
961 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 975 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0,
962 views::GridLayout::FIXED, width_of_lock_button, 976 views::GridLayout::FIXED, width_of_lock_button,
963 width_of_lock_button); 977 width_of_lock_button);
964 view->SetLayoutManager(layout); 978 view->SetLayoutManager(layout);
965 } else { 979 } else {
966 layout = CreateSingleColumnLayout(view, kFixedMenuWidth); 980 layout = CreateSingleColumnLayout(view, kFixedMenuWidth);
967 } 981 }
968 982
969 // The horizontal padding will be set by each button individually, so that
970 // in the hovered state the button spans the entire parent view.
971 layout->SetInsets(views::kRelatedControlVerticalSpacing, 0,
972 views::kRelatedControlVerticalSpacing, 0);
973
974 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 983 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
975 users_button_ = new BackgroundColorHoverButton( 984 users_button_ = new BackgroundColorHoverButton(
976 this, 985 this,
977 l10n_util::GetStringFUTF16(IDS_PROFILES_NOT_YOU_BUTTON, 986 l10n_util::GetStringFUTF16(IDS_PROFILES_NOT_YOU_BUTTON,
978 profiles::GetAvatarNameForProfile(browser_->profile())), 987 profiles::GetAvatarNameForProfile(browser_->profile())),
979 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_AVATAR), 988 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_AVATAR),
980 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_AVATAR)); 989 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_AVATAR));
990 users_button_->set_min_size(gfx::Size(
991 0, kButtonHeight + views::kRelatedControlVerticalSpacing));
981 992
982 layout->StartRow(1, 0); 993 layout->StartRow(1, 0);
983 layout->AddView(users_button_); 994 layout->AddView(users_button_);
984 995
985 if (enable_lock) { 996 if (enable_lock) {
986 lock_button_ = new BackgroundColorHoverButton( 997 lock_button_ = new BackgroundColorHoverButton(
987 this, 998 this,
988 base::string16(), 999 base::string16(),
989 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_LOCK), 1000 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_LOCK),
990 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_LOCK)); 1001 *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_LOCK));
1002 lock_button_->set_min_size(gfx::Size(
1003 0, kButtonHeight + views::kRelatedControlVerticalSpacing));
991 layout->AddView(lock_button_); 1004 layout->AddView(lock_button_);
992 } 1005 }
993 return view; 1006 return view;
994 } 1007 }
995 1008
996 views::View* ProfileChooserView::CreateCurrentProfileAccountsView( 1009 views::View* ProfileChooserView::CreateCurrentProfileAccountsView(
997 const AvatarMenu::Item& avatar_item) { 1010 const AvatarMenu::Item& avatar_item) {
998 DCHECK(avatar_item.signed_in); 1011 DCHECK(avatar_item.signed_in);
999 views::View* view = new views::View(); 1012 views::View* view = new views::View();
1000 int column_width = kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew; 1013 view->set_background(views::Background::CreateSolidBackground(
1001 views::GridLayout* layout = CreateSingleColumnLayout(view, column_width); 1014 profiles::kAvatarBubbleAccountsBackgroundColor));
1002 layout->SetInsets(views::kButtonVEdgeMarginNew, 1015 views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth);
1003 views::kButtonHEdgeMarginNew,
1004 views::kButtonVEdgeMarginNew,
1005 views::kButtonHEdgeMarginNew);
1006 1016
1007 Profile* profile = browser_->profile(); 1017 Profile* profile = browser_->profile();
1008 std::string primary_account = 1018 std::string primary_account =
1009 SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedUsername(); 1019 SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedUsername();
1010 DCHECK(!primary_account.empty()); 1020 DCHECK(!primary_account.empty());
1011 std::vector<std::string>accounts = 1021 std::vector<std::string>accounts =
1012 profiles::GetSecondaryAccountsForProfile(profile, primary_account); 1022 profiles::GetSecondaryAccountsForProfile(profile, primary_account);
1013 1023
1014 // The primary account should always be listed first. 1024 // The primary account should always be listed first.
1015 // TODO(rogerta): we still need to further differentiate the primary account 1025 // TODO(rogerta): we still need to further differentiate the primary account
1016 // from the others in the UI, so more work is likely required here: 1026 // from the others in the UI, so more work is likely required here:
1017 // crbug.com/311124. 1027 // crbug.com/311124.
1018 CreateAccountButton(layout, primary_account, true, column_width); 1028 CreateAccountButton(layout, primary_account, true, kFixedMenuWidth);
1019 for (size_t i = 0; i < accounts.size(); ++i) 1029 for (size_t i = 0; i < accounts.size(); ++i)
1020 CreateAccountButton(layout, accounts[i], false, column_width); 1030 CreateAccountButton(layout, accounts[i], false, kFixedMenuWidth);
1021 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 1031 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1022 1032
1023 add_account_button_ = new views::BlueButton( 1033 add_account_link_ = CreateLink(l10n_util::GetStringFUTF16(
1024 this, 1034 IDS_PROFILES_PROFILE_ADD_ACCOUNT_BUTTON, avatar_item.name), this);
1025 l10n_util::GetStringFUTF16(IDS_PROFILES_PROFILE_ADD_ACCOUNT_BUTTON, 1035 add_account_link_->SetBorder(views::Border::CreateEmptyBorder(
1026 avatar_item.name)); 1036 0, views::kButtonVEdgeMarginNew,
1037 views::kRelatedControlVerticalSpacing, 0));
1027 layout->StartRow(1, 0); 1038 layout->StartRow(1, 0);
1028 layout->AddView(add_account_button_); 1039 layout->AddView(add_account_link_);
1029 return view; 1040 return view;
1030 } 1041 }
1031 1042
1032 void ProfileChooserView::CreateAccountButton(views::GridLayout* layout, 1043 void ProfileChooserView::CreateAccountButton(views::GridLayout* layout,
1033 const std::string& account, 1044 const std::string& account,
1034 bool is_primary_account, 1045 bool is_primary_account,
1035 int width) { 1046 int width) {
1036 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 1047 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
1037 const gfx::ImageSkia* menu_marker = 1048 const gfx::ImageSkia* menu_marker =
1038 rb->GetImageNamed(IDR_CLOSE_1).ToImageSkia(); 1049 rb->GetImageNamed(IDR_CLOSE_1).ToImageSkia();
1039 // Use a MenuButtonListener and not a regular ButtonListener to be 1050
1040 // able to distinguish between the unnamed "other profile" buttons and the 1051 views::LabelButton* email_button = new BackgroundColorHoverButton(
1041 // unnamed "multiple accounts" buttons. 1052 this,
1042 views::MenuButton* email_button = new views::MenuButton(
1043 NULL,
1044 gfx::ElideEmail(base::UTF8ToUTF16(account), 1053 gfx::ElideEmail(base::UTF8ToUTF16(account),
1045 rb->GetFontList(ui::ResourceBundle::BaseFont), 1054 rb->GetFontList(ui::ResourceBundle::BaseFont),
1046 width - menu_marker->width()), 1055 width - menu_marker->width()),
1047 this, 1056 gfx::ImageSkia(),
1048 true /* show_menu_marker */); 1057 gfx::ImageSkia());
1049 email_button->SetBorder(views::Border::CreateEmptyBorder(0, 0, 0, 0));
1050 email_button->set_menu_marker(menu_marker);
1051 if (!is_primary_account)
1052 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1053 layout->StartRow(1, 0); 1058 layout->StartRow(1, 0);
1054 layout->AddView(email_button); 1059 layout->AddView(email_button);
1055 1060
1056 // Save the original email address, as the button text could be elided. 1061 // Save the original email address, as the button text could be elided.
1057 current_profile_accounts_map_[email_button] = account; 1062 current_profile_accounts_map_[email_button] = account;
1058 } 1063 }
1059 1064
1060 views::View* ProfileChooserView::CreateGaiaSigninView( 1065 views::View* ProfileChooserView::CreateGaiaSigninView(
1061 bool add_secondary_account) { 1066 bool add_secondary_account) {
1062 views::View* view = new views::View(); 1067 views::View* view = new views::View();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 1173
1169 views::View* ProfileChooserView::CreateNewProfileManagementPreviewView() { 1174 views::View* ProfileChooserView::CreateNewProfileManagementPreviewView() {
1170 return CreateTutorialView( 1175 return CreateTutorialView(
1171 l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_TUTORIAL_TITLE), 1176 l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_TUTORIAL_TITLE),
1172 l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_TUTORIAL_CONTENT_TEXT), 1177 l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_TUTORIAL_CONTENT_TEXT),
1173 l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_TUTORIAL_LEARN_MORE), 1178 l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_TUTORIAL_LEARN_MORE),
1174 l10n_util::GetStringUTF16(IDS_PROFILES_TUTORIAL_TRY_BUTTON), 1179 l10n_util::GetStringUTF16(IDS_PROFILES_TUTORIAL_TRY_BUTTON),
1175 &tutorial_learn_more_link_, 1180 &tutorial_learn_more_link_,
1176 &tutorial_enable_new_profile_management_button_); 1181 &tutorial_enable_new_profile_management_button_);
1177 } 1182 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/profiles/profile_chooser_view.h ('k') | ui/views/controls/textfield/textfield.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698