OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/system/user/user_view.h" | 5 #include "ash/system/user/user_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "ash/common/session/session_state_delegate.h" | 10 #include "ash/common/session/session_state_delegate.h" |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 | 148 |
149 gfx::Size AddUserView::GetPreferredSize() const { | 149 gfx::Size AddUserView::GetPreferredSize() const { |
150 return owner_->bounds().size(); | 150 return owner_->bounds().size(); |
151 } | 151 } |
152 | 152 |
153 void AddUserView::AddContent() { | 153 void AddUserView::AddContent() { |
154 SetLayoutManager(new views::FillLayout()); | 154 SetLayoutManager(new views::FillLayout()); |
155 set_background(views::Background::CreateSolidBackground(kBackgroundColor)); | 155 set_background(views::Background::CreateSolidBackground(kBackgroundColor)); |
156 | 156 |
157 add_user_ = new views::View; | 157 add_user_ = new views::View; |
158 add_user_->SetBorder(views::Border::CreateEmptyBorder( | 158 add_user_->SetBorder( |
159 0, kTrayUserTileHoverBorderInset, 0, 0)); | 159 views::Border::CreateEmptyBorder(0, kTrayUserTileHoverBorderInset, 0, 0)); |
160 | 160 |
161 add_user_->SetLayoutManager(new views::BoxLayout( | 161 add_user_->SetLayoutManager(new views::BoxLayout( |
162 views::BoxLayout::kHorizontal, 0, 0, kTrayPopupPaddingBetweenItems)); | 162 views::BoxLayout::kHorizontal, 0, 0, kTrayPopupPaddingBetweenItems)); |
163 AddChildViewAt(add_user_, 0); | 163 AddChildViewAt(add_user_, 0); |
164 | 164 |
165 // Add the [+] icon which is also the anchor for messages. | 165 // Add the [+] icon which is also the anchor for messages. |
166 RoundedImageView* icon = new RoundedImageView(kTrayAvatarCornerRadius, true); | 166 RoundedImageView* icon = new RoundedImageView(kTrayAvatarCornerRadius, true); |
167 anchor_ = icon; | 167 anchor_ = icon; |
168 icon->SetImage(*ui::ResourceBundle::GetSharedInstance() | 168 icon->SetImage(*ui::ResourceBundle::GetSharedInstance() |
169 .GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER) | 169 .GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER) |
(...skipping 19 matching lines...) Expand all Loading... |
189 add_user_enabled_(true), | 189 add_user_enabled_(true), |
190 focus_manager_(NULL) { | 190 focus_manager_(NULL) { |
191 CHECK_NE(LoginStatus::NOT_LOGGED_IN, login); | 191 CHECK_NE(LoginStatus::NOT_LOGGED_IN, login); |
192 if (!index) { | 192 if (!index) { |
193 // Only the logged in user will have a background. All other users will have | 193 // Only the logged in user will have a background. All other users will have |
194 // to allow the TrayPopupContainer highlighting the menu line. | 194 // to allow the TrayPopupContainer highlighting the menu line. |
195 set_background(views::Background::CreateSolidBackground( | 195 set_background(views::Background::CreateSolidBackground( |
196 login == LoginStatus::PUBLIC ? kPublicAccountBackgroundColor | 196 login == LoginStatus::PUBLIC ? kPublicAccountBackgroundColor |
197 : kBackgroundColor)); | 197 : kBackgroundColor)); |
198 } | 198 } |
199 SetLayoutManager(new views::BoxLayout( | 199 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, |
200 views::BoxLayout::kHorizontal, 0, 0, kTrayPopupPaddingBetweenItems)); | 200 kTrayPopupPaddingBetweenItems)); |
201 // The logout button must be added before the user card so that the user card | 201 // The logout button must be added before the user card so that the user card |
202 // can correctly calculate the remaining available width. | 202 // can correctly calculate the remaining available width. |
203 // Note that only the current multiprofile user gets a button. | 203 // Note that only the current multiprofile user gets a button. |
204 if (!user_index_) | 204 if (!user_index_) |
205 AddLogoutButton(login); | 205 AddLogoutButton(login); |
206 AddUserCard(login); | 206 AddUserCard(login); |
207 } | 207 } |
208 | 208 |
209 UserView::~UserView() { | 209 UserView::~UserView() { |
210 RemoveAddUserMenuOption(); | 210 RemoveAddUserMenuOption(); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 void UserView::AddLogoutButton(LoginStatus login) { | 331 void UserView::AddLogoutButton(LoginStatus login) { |
332 const base::string16 title = | 332 const base::string16 title = |
333 user::GetLocalizedSignOutStringForStatus(login, true); | 333 user::GetLocalizedSignOutStringForStatus(login, true); |
334 auto* logout_button = new TrayPopupLabelButton(this, title); | 334 auto* logout_button = new TrayPopupLabelButton(this, title); |
335 logout_button->SetAccessibleName(title); | 335 logout_button->SetAccessibleName(title); |
336 logout_button_ = logout_button; | 336 logout_button_ = logout_button; |
337 // In public account mode, the logout button border has a custom color. | 337 // In public account mode, the logout button border has a custom color. |
338 if (login == LoginStatus::PUBLIC) { | 338 if (login == LoginStatus::PUBLIC) { |
339 std::unique_ptr<TrayPopupLabelButtonBorder> border( | 339 std::unique_ptr<TrayPopupLabelButtonBorder> border( |
340 new TrayPopupLabelButtonBorder()); | 340 new TrayPopupLabelButtonBorder()); |
341 border->SetPainter(false, | 341 border->SetPainter(false, views::Button::STATE_NORMAL, |
342 views::Button::STATE_NORMAL, | |
343 views::Painter::CreateImageGridPainter( | 342 views::Painter::CreateImageGridPainter( |
344 kPublicAccountLogoutButtonBorderImagesNormal)); | 343 kPublicAccountLogoutButtonBorderImagesNormal)); |
345 border->SetPainter(false, | 344 border->SetPainter(false, views::Button::STATE_HOVERED, |
346 views::Button::STATE_HOVERED, | |
347 views::Painter::CreateImageGridPainter( | 345 views::Painter::CreateImageGridPainter( |
348 kPublicAccountLogoutButtonBorderImagesHovered)); | 346 kPublicAccountLogoutButtonBorderImagesHovered)); |
349 border->SetPainter(false, | 347 border->SetPainter(false, views::Button::STATE_PRESSED, |
350 views::Button::STATE_PRESSED, | |
351 views::Painter::CreateImageGridPainter( | 348 views::Painter::CreateImageGridPainter( |
352 kPublicAccountLogoutButtonBorderImagesHovered)); | 349 kPublicAccountLogoutButtonBorderImagesHovered)); |
353 logout_button_->SetBorder(std::move(border)); | 350 logout_button_->SetBorder(std::move(border)); |
354 } | 351 } |
355 AddChildView(logout_button_); | 352 AddChildView(logout_button_); |
356 } | 353 } |
357 | 354 |
358 void UserView::AddUserCard(LoginStatus login) { | 355 void UserView::AddUserCard(LoginStatus login) { |
359 // Add padding around the panel. | 356 // Add padding around the panel. |
360 SetBorder(views::Border::CreateEmptyBorder(kTrayPopupUserCardVerticalPadding, | 357 SetBorder(views::Border::CreateEmptyBorder( |
361 kTrayPopupPaddingHorizontal, | 358 kTrayPopupUserCardVerticalPadding, kTrayPopupPaddingHorizontal, |
362 kTrayPopupUserCardVerticalPadding, | 359 kTrayPopupUserCardVerticalPadding, kTrayPopupPaddingHorizontal)); |
363 kTrayPopupPaddingHorizontal)); | |
364 | 360 |
365 views::TrayBubbleView* bubble_view = | 361 views::TrayBubbleView* bubble_view = |
366 owner_->system_tray()->GetSystemBubble()->bubble_view(); | 362 owner_->system_tray()->GetSystemBubble()->bubble_view(); |
367 int max_card_width = | 363 int max_card_width = |
368 bubble_view->GetMaximumSize().width() - | 364 bubble_view->GetMaximumSize().width() - |
369 (2 * kTrayPopupPaddingHorizontal + kTrayPopupPaddingBetweenItems); | 365 (2 * kTrayPopupPaddingHorizontal + kTrayPopupPaddingBetweenItems); |
370 if (logout_button_) | 366 if (logout_button_) |
371 max_card_width -= logout_button_->GetPreferredSize().width(); | 367 max_card_width -= logout_button_->GetPreferredSize().width(); |
372 user_card_view_ = new UserCardView(login, max_card_width, user_index_); | 368 user_card_view_ = new UserCardView(login, max_card_width, user_index_); |
373 // The entry is clickable when no system modal dialog is open and the multi | 369 // The entry is clickable when no system modal dialog is open and the multi |
374 // profile option is active. | 370 // profile option is active. |
375 bool clickable = !WmShell::Get()->IsSystemModalWindowOpen() && | 371 bool clickable = !WmShell::Get()->IsSystemModalWindowOpen() && |
376 IsMultiProfileSupportedAndUserActive(); | 372 IsMultiProfileSupportedAndUserActive(); |
377 if (clickable) { | 373 if (clickable) { |
378 // To allow the border to start before the icon, reduce the size before and | 374 // To allow the border to start before the icon, reduce the size before and |
379 // add an inset to the icon to get the spacing. | 375 // add an inset to the icon to get the spacing. |
380 if (!user_index_) { | 376 if (!user_index_) { |
381 SetBorder(views::Border::CreateEmptyBorder( | 377 SetBorder(views::Border::CreateEmptyBorder( |
382 kTrayPopupUserCardVerticalPadding, | 378 kTrayPopupUserCardVerticalPadding, |
383 kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset, | 379 kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset, |
384 kTrayPopupUserCardVerticalPadding, | 380 kTrayPopupUserCardVerticalPadding, kTrayPopupPaddingHorizontal)); |
385 kTrayPopupPaddingHorizontal)); | |
386 user_card_view_->SetBorder(views::Border::CreateEmptyBorder( | 381 user_card_view_->SetBorder(views::Border::CreateEmptyBorder( |
387 0, kTrayUserTileHoverBorderInset, 0, 0)); | 382 0, kTrayUserTileHoverBorderInset, 0, 0)); |
388 } | 383 } |
389 gfx::Insets insets = gfx::Insets(1, 1, 1, 1); | 384 gfx::Insets insets = gfx::Insets(1, 1, 1, 1); |
390 views::View* contents_view = user_card_view_; | 385 views::View* contents_view = user_card_view_; |
391 if (user_index_) { | 386 if (user_index_) { |
392 // Since the activation border needs to be drawn around the tile, we | 387 // Since the activation border needs to be drawn around the tile, we |
393 // have to put the tile into another view which fills the menu panel, | 388 // have to put the tile into another view which fills the menu panel, |
394 // but keeping the offsets of the content. | 389 // but keeping the offsets of the content. |
395 contents_view = new views::View(); | 390 contents_view = new views::View(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 | 446 |
452 AddUserView* add_user_view = | 447 AddUserView* add_user_view = |
453 new AddUserView(static_cast<ButtonFromView*>(user_card_view_)); | 448 new AddUserView(static_cast<ButtonFromView*>(user_card_view_)); |
454 | 449 |
455 const SessionStateDelegate* delegate = | 450 const SessionStateDelegate* delegate = |
456 WmShell::Get()->GetSessionStateDelegate(); | 451 WmShell::Get()->GetSessionStateDelegate(); |
457 | 452 |
458 SessionStateDelegate::AddUserError add_user_error; | 453 SessionStateDelegate::AddUserError add_user_error; |
459 add_user_enabled_ = delegate->CanAddUserToMultiProfile(&add_user_error); | 454 add_user_enabled_ = delegate->CanAddUserToMultiProfile(&add_user_error); |
460 | 455 |
461 ButtonFromView* button = new ButtonFromView(add_user_view, | 456 ButtonFromView* button = |
462 add_user_enabled_ ? this : NULL, | 457 new ButtonFromView(add_user_view, add_user_enabled_ ? this : NULL, |
463 add_user_enabled_, | 458 add_user_enabled_, gfx::Insets(1, 1, 1, 1)); |
464 gfx::Insets(1, 1, 1, 1)); | |
465 button->SetAccessibleName( | 459 button->SetAccessibleName( |
466 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); | 460 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); |
467 button->ForceBorderVisible(true); | 461 button->ForceBorderVisible(true); |
468 add_menu_option_->SetContentsView(button); | 462 add_menu_option_->SetContentsView(button); |
469 | 463 |
470 if (add_user_enabled_) { | 464 if (add_user_enabled_) { |
471 // We activate the entry automatically if invoked with focus. | 465 // We activate the entry automatically if invoked with focus. |
472 if (user_card_view_->HasFocus()) { | 466 if (user_card_view_->HasFocus()) { |
473 button->GetFocusManager()->SetFocusedView(button); | 467 button->GetFocusManager()->SetFocusedView(button); |
474 user_card_view_->GetFocusManager()->SetFocusedView(button); | 468 user_card_view_->GetFocusManager()->SetFocusedView(button); |
(...skipping 10 matching lines...) Expand all Loading... |
485 break; | 479 break; |
486 case SessionStateDelegate::ADD_USER_ERROR_OUT_OF_USERS: | 480 case SessionStateDelegate::ADD_USER_ERROR_OUT_OF_USERS: |
487 message_id = IDS_ASH_STATUS_TRAY_MESSAGE_OUT_OF_USERS; | 481 message_id = IDS_ASH_STATUS_TRAY_MESSAGE_OUT_OF_USERS; |
488 break; | 482 break; |
489 default: | 483 default: |
490 NOTREACHED() << "Unknown adding user error " << add_user_error; | 484 NOTREACHED() << "Unknown adding user error " << add_user_error; |
491 } | 485 } |
492 | 486 |
493 popup_message_.reset(new PopupMessage( | 487 popup_message_.reset(new PopupMessage( |
494 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER), | 488 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER), |
495 bundle.GetLocalizedString(message_id), | 489 bundle.GetLocalizedString(message_id), PopupMessage::ICON_WARNING, |
496 PopupMessage::ICON_WARNING, | 490 add_user_view->anchor(), views::BubbleBorder::TOP_LEFT, |
497 add_user_view->anchor(), | |
498 views::BubbleBorder::TOP_LEFT, | |
499 gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0), | 491 gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0), |
500 2 * kPopupMessageOffset)); | 492 2 * kPopupMessageOffset)); |
501 } | 493 } |
502 // Find the screen area which encloses both elements and sets then a mouse | 494 // Find the screen area which encloses both elements and sets then a mouse |
503 // watcher which will close the "menu". | 495 // watcher which will close the "menu". |
504 gfx::Rect area = user_card_view_->GetBoundsInScreen(); | 496 gfx::Rect area = user_card_view_->GetBoundsInScreen(); |
505 area.set_height(2 * area.height()); | 497 area.set_height(2 * area.height()); |
506 mouse_watcher_.reset( | 498 mouse_watcher_.reset( |
507 new views::MouseWatcher(new UserViewMouseWatcherHost(area), this)); | 499 new views::MouseWatcher(new UserViewMouseWatcherHost(area), this)); |
508 mouse_watcher_->Start(); | 500 mouse_watcher_->Start(); |
(...skipping 11 matching lines...) Expand all Loading... |
520 focus_manager_ = NULL; | 512 focus_manager_ = NULL; |
521 if (user_card_view_->GetFocusManager()) | 513 if (user_card_view_->GetFocusManager()) |
522 user_card_view_->GetFocusManager()->ClearFocus(); | 514 user_card_view_->GetFocusManager()->ClearFocus(); |
523 popup_message_.reset(); | 515 popup_message_.reset(); |
524 mouse_watcher_.reset(); | 516 mouse_watcher_.reset(); |
525 add_menu_option_.reset(); | 517 add_menu_option_.reset(); |
526 } | 518 } |
527 | 519 |
528 } // namespace tray | 520 } // namespace tray |
529 } // namespace ash | 521 } // namespace ash |
OLD | NEW |