Chromium Code Reviews| Index: chrome/browser/ui/views/profiles/profile_chooser_view.cc |
| diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc |
| index aa3ade501c117ea8100156af170511de9164aa20..f2d692b580a074eb3bc60b40395a62eec64cb460 100644 |
| --- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc |
| +++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc |
| @@ -50,6 +50,7 @@ |
| #include "ui/base/material_design/material_design_controller.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/compositor/clip_recorder.h" |
| +#include "ui/compositor/paint_recorder.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/color_palette.h" |
| #include "ui/gfx/image/canvas_image_source.h" |
| @@ -84,13 +85,17 @@ namespace { |
| // Helpers -------------------------------------------------------------------- |
| -const int kFixedMenuWidth = 250; |
| const int kButtonHeight = 32; |
| const int kPasswordCombinedFixedGaiaViewWidth = 360; |
| const int kFixedGaiaViewWidth = 448; |
| const int kFixedAccountRemovalViewWidth = 280; |
| const int kFixedSwitchUserViewWidth = 320; |
| const int kLargeImageSide = 88; |
| +const int kMdImageSide = 40; |
| + |
| +// Spacing between the edge of the material design user menu and the |
| +// top/bottom or left/right of the menu items. |
| +const int kMaterialMenuEdgeMargin = 16; |
| const int kVerticalSpacing = 16; |
| @@ -101,6 +106,11 @@ bool IsProfileChooser(profiles::BubbleViewMode mode) { |
| mode == profiles::BUBBLE_VIEW_MODE_FAST_PROFILE_CHOOSER; |
| } |
| +int GetProfileBadgeSize() { |
| + return switches::IsMaterialDesignUserMenu() ? 24 : 30; |
| +} |
| + |
| +// DEPRECATED: New user menu components should use views::BoxLayout instead. |
| // Creates a GridLayout with a single column. This ensures that all the child |
| // views added get auto-expanded to fill the full width of the bubble. |
| views::GridLayout* CreateSingleColumnLayout(views::View* view, int width) { |
| @@ -264,14 +274,17 @@ void HostView::ViewHierarchyChanged( |
| // RightAlignedIconLabelButton ------------------------------------------------- |
| -// A custom LabelButton that has a centered text and right aligned icon. |
| +// A custom LabelButton that has a left-aligned text and right aligned icon. |
| +// For non-material-design user menu, it has centered text instead. |
| class RightAlignedIconLabelButton : public views::LabelButton { |
| public: |
| RightAlignedIconLabelButton(views::ButtonListener* listener, |
| const base::string16& text) |
| : views::LabelButton(listener, text) { |
| SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| - label()->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| + label()->SetHorizontalAlignment(switches::IsMaterialDesignUserMenu() |
| + ? gfx::ALIGN_LEFT |
| + : gfx::ALIGN_CENTER); |
| } |
| protected: |
| @@ -300,25 +313,34 @@ class RightAlignedIconLabelButton : public views::LabelButton { |
| // EditableProfilePhoto ------------------------------------------------- |
| +const size_t kProfileBadgeWhitePadding = 2; |
| + |
| // A custom Image control that shows a "change" button when moused over. |
| class EditableProfilePhoto : public views::LabelButton { |
| public: |
| EditableProfilePhoto(views::ButtonListener* listener, |
| const gfx::Image& icon, |
| bool is_editing_allowed, |
| - const gfx::Rect& bounds) |
| + Profile* profile) |
| : views::LabelButton(listener, base::string16()), |
| - photo_overlay_(NULL) { |
| - gfx::Image image = profiles::GetSizedAvatarIcon( |
| - icon, true, kLargeImageSide, kLargeImageSide); |
| + photo_overlay_(nullptr), |
| + profile_(profile) { |
| + gfx::Image image = profiles::GetSizedAvatarIcon(icon, true, icon_image_side, |
| + icon_image_side); |
| SetImage(views::LabelButton::STATE_NORMAL, *image.ToImageSkia()); |
| SetBorder(views::Border::NullBorder()); |
| - SetBoundsRect(bounds); |
| + if (switches::IsMaterialDesignUserMenu()) { |
| + SetMinSize(gfx::Size(GetPreferredSize().width() + badge_spacing, |
| + GetPreferredSize().height() + badge_spacing + |
| + views::kRelatedControlSmallVerticalSpacing)); |
| + } else { |
| + SetSize(GetPreferredSize()); |
| + } |
| // Calculate the circular mask that will be used to display the photo. |
| - circular_mask_.addCircle(SkIntToScalar(bounds.width() / 2), |
| - SkIntToScalar(bounds.height() / 2), |
| - SkIntToScalar(bounds.width() / 2)); |
| + circular_mask_.addCircle(SkIntToScalar(icon_image_side / 2), |
| + SkIntToScalar(icon_image_side / 2) + badge_spacing, |
| + SkIntToScalar(icon_image_side / 2)); |
| if (!is_editing_allowed) { |
| SetEnabled(false); |
| @@ -333,27 +355,84 @@ class EditableProfilePhoto : public views::LabelButton { |
| const SkColor kBackgroundColor = SkColorSetARGB(65, 255, 255, 255); |
| photo_overlay_->set_background( |
| views::Background::CreateSolidBackground(kBackgroundColor)); |
| - photo_overlay_->SetImage(gfx::CreateVectorIcon( |
| - gfx::VectorIconId::PHOTO_CAMERA, 48u, SkColorSetRGB(0x33, 0x33, 0x33))); |
| + photo_overlay_->SetImage( |
| + gfx::CreateVectorIcon(gfx::VectorIconId::PHOTO_CAMERA, |
| + switches::IsMaterialDesignUserMenu() ? 22u : 48u, |
| + SkColorSetRGB(0x33, 0x33, 0x33))); |
| - photo_overlay_->SetSize(bounds.size()); |
| + photo_overlay_->SetSize(gfx::Size(icon_image_side, icon_image_side)); |
| + photo_overlay_->SetY(badge_spacing); |
| photo_overlay_->SetVisible(false); |
| AddChildView(photo_overlay_); |
| } |
| void OnPaint(gfx::Canvas* canvas) override { |
| + canvas->Save(); |
| // Display the profile picture as a circle. |
| canvas->ClipPath(circular_mask_, true); |
| views::LabelButton::OnPaint(canvas); |
| + canvas->Restore(); |
| } |
| void PaintChildren(const ui::PaintContext& context) override { |
| // Display any children (the "change photo" overlay) as a circle. |
| - ui::ClipRecorder clip_recorder(context); |
| - clip_recorder.ClipPathWithAntiAliasing(circular_mask_); |
| - View::PaintChildren(context); |
| + { |
| + ui::ClipRecorder clip_recorder(context); |
| + clip_recorder.ClipPathWithAntiAliasing(circular_mask_); |
| + View::PaintChildren(context); |
| + } |
| + |
| + ui::PaintRecorder paint_recorder( |
| + context, gfx::Size(GetProfileBadgeSize(), GetProfileBadgeSize())); |
| + gfx::Canvas* canvas = paint_recorder.canvas(); |
| + if (profile_->IsSupervised()) { |
| + gfx::VectorIconId icon_id; |
| + size_t icon_size; |
| + // TODO(janeliulwq): Replace the following two icons when new versions of |
| + // them are ready, which be inverted as silhouettes. |
|
Evan Stade
2016/06/30 13:32:38
can you elaborate a little on this TODO? Some indi
Jane
2016/06/30 14:06:30
Done.
|
| + if (profile_->IsChild()) { |
| + icon_id = gfx::VectorIconId::ACCOUNT_CHILD_INVERT; |
| + icon_size = switches::IsMaterialDesignUserMenu() ? 21 : 26; |
| + } else { |
| + icon_id = gfx::VectorIconId::SUPERVISOR_ACCOUNT; |
| + icon_size = switches::IsMaterialDesignUserMenu() ? 16 : 20; |
| + } |
| + gfx::Rect bounds(0, 0, GetProfileBadgeSize(), GetProfileBadgeSize()); |
| + |
| + int badge_offset = |
| + icon_image_side + badge_spacing - GetProfileBadgeSize(); |
| + gfx::Vector2d badge_offset_vector = gfx::Vector2d( |
| + badge_offset, |
| + badge_offset + (switches::IsMaterialDesignUserMenu() |
| + ? views::kRelatedControlSmallVerticalSpacing |
| + : 0)); |
| + gfx::Point center_point = bounds.CenterPoint() + badge_offset_vector; |
| + |
| + SkPaint paint; |
| + paint.setAntiAlias(true); |
| + paint.setColor(SK_ColorWHITE); |
|
Evan Stade
2016/06/30 13:32:38
I liked the idea you had of using the theme's bubb
Jane
2016/06/30 14:06:30
Done.
|
| + canvas->DrawCircle(center_point, GetProfileBadgeSize() / 2, paint); |
| + |
| + if (!switches::IsMaterialDesignUserMenu()) { |
| + paint.setColor(SkColorSetRGB(0xaf, 0xd9, 0xfc)); |
| + canvas->DrawCircle( |
| + center_point, GetProfileBadgeSize() / 2 - kProfileBadgeWhitePadding, |
| + paint); |
| + } |
| + |
| + int offset = (GetProfileBadgeSize() - icon_size) / 2; |
| + canvas->Translate(badge_offset_vector + gfx::Vector2d(offset, offset)); |
| + const SkColor badge_color = switches::IsMaterialDesignUserMenu() |
| + ? gfx::kChromeIconGrey |
| + : SkColorSetRGB(0, 0x66, 0xff); |
| + gfx::PaintVectorIcon(canvas, icon_id, icon_size, badge_color); |
| + } |
| } |
| + int icon_image_side = |
| + switches::IsMaterialDesignUserMenu() ? kMdImageSide : kLargeImageSide; |
| + int badge_spacing = switches::IsMaterialDesignUserMenu() ? 4 : 0; |
|
Evan Stade
2016/06/30 13:32:38
these both need to be static functions rather than
Jane
2016/06/30 14:06:29
Done.
|
| + |
| private: |
| // views::CustomButton: |
| void StateChanged() override { |
| @@ -382,6 +461,8 @@ class EditableProfilePhoto : public views::LabelButton { |
| // the photo isn't allowed to be edited (e.g. for guest profiles). |
| views::ImageView* photo_overlay_; |
| + Profile* profile_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(EditableProfilePhoto); |
| }; |
| @@ -394,22 +475,37 @@ class EditableProfileName : public views::View, |
| EditableProfileName(views::TextfieldController* controller, |
| const base::string16& text, |
| bool is_editing_allowed) |
| - : button_(nullptr), label_(nullptr), profile_name_textfield_(nullptr) { |
| + : button_(nullptr), profile_name_textfield_(nullptr) { |
| SetLayoutManager( |
| new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
| const gfx::FontList& medium_font_list = |
| rb->GetFontList(ui::ResourceBundle::MediumFont); |
| + const gfx::Insets textfield_border_insets = |
| + views::Textfield().border()->GetInsets(); |
| if (!is_editing_allowed) { |
| - label_ = new views::Label(text); |
| - label_->SetBorder(views::Border::CreateEmptyBorder(2, 0, 2, 0)); |
| - label_->SetFontList(medium_font_list); |
| - AddChildView(label_); |
| + views::Label* name_label = new views::Label(text); |
| + name_label->SetBorder( |
| + views::Border::CreateEmptyBorder(textfield_border_insets)); |
| + name_label->SetFontList(medium_font_list); |
| + if (switches::IsMaterialDesignUserMenu()) |
| + name_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + AddChildView(name_label); |
| return; |
| } |
| + profile_name_textfield_ = new views::Textfield(); |
| + // Textfield that overlaps the button. |
| + profile_name_textfield_->set_controller(controller); |
| + profile_name_textfield_->SetFontList(medium_font_list); |
| + profile_name_textfield_->SetHorizontalAlignment( |
| + switches::IsMaterialDesignUserMenu() ? gfx::ALIGN_LEFT |
| + : gfx::ALIGN_CENTER); |
| + profile_name_textfield_->SetVisible(false); |
| + AddChildView(profile_name_textfield_); |
| + |
| button_ = new RightAlignedIconLabelButton(this, text); |
| button_->SetFontList(medium_font_list); |
| // Show an "edit" pencil icon when hovering over. In the default state, |
| @@ -427,21 +523,19 @@ class EditableProfileName : public views::View, |
| gfx::CreateVectorIcon( |
| gfx::VectorIconId::MODE_EDIT, kIconSize, |
| SkColorSetRGB(0x20, 0x20, 0x20))); |
| - // To center the text, we need to offest it by the width of the icon we |
| - // are adding and its padding. We need to also add a small top/bottom |
| - // padding to account for the textfield's border. |
| - const int kIconTextLabelButtonSpacing = 5; |
| - button_->SetBorder(views::Border::CreateEmptyBorder( |
| - 2, kIconSize + kIconTextLabelButtonSpacing, 2, 0)); |
| + // We need to add a left padding as well as a small top/bottom padding |
| + // to the text to account for the textfield's border. |
| + if (switches::IsMaterialDesignUserMenu()) { |
| + button_->SetBorder(views::Border::CreateEmptyBorder( |
| + textfield_border_insets + |
| + gfx::Insets(0, profile_name_textfield_->GetInsets().left(), 0, 0))); |
| + } else { |
| + const int kIconTextLabelButtonSpacing = 5; |
| + button_->SetBorder(views::Border::CreateEmptyBorder( |
| + textfield_border_insets + |
| + gfx::Insets(0, kIconSize + kIconTextLabelButtonSpacing, 0, 0))); |
| + } |
| AddChildView(button_); |
| - |
| - profile_name_textfield_ = new views::Textfield(); |
| - // Textfield that overlaps the button. |
| - profile_name_textfield_->set_controller(controller); |
| - profile_name_textfield_->SetFontList(medium_font_list); |
| - profile_name_textfield_->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| - profile_name_textfield_->SetVisible(false); |
| - AddChildView(profile_name_textfield_); |
| } |
| views::Textfield* profile_name_textfield() { |
| @@ -479,10 +573,6 @@ class EditableProfileName : public views::View, |
| // edited. |
| RightAlignedIconLabelButton* button_; |
| - // The label which shows when the profile name cannot be edited (e.g. for |
| - // supervised user). Can be NULL if the profile name is allowed to be edited. |
| - views::Label* label_; |
| - |
| // Textfield that is shown when editing the profile name. Can be NULL if |
| // the profile name isn't allowed to be edited (e.g. for guest profiles). |
| views::Textfield* profile_name_textfield_; |
| @@ -565,15 +655,13 @@ class TitleCard : public views::View { |
| // ProfileBadge -------------------------------------------------------- |
| -const size_t kProfileBadgeSize = 30; |
| -const size_t kProfileBadgeWhitePadding = 2; |
| - |
| // Draws a white circle, then a light blue circle, then a dark blue icon. |
| class ProfileBadge : public gfx::CanvasImageSource { |
| public: |
| ProfileBadge(gfx::VectorIconId id, size_t icon_size) |
| - : CanvasImageSource(gfx::Size(kProfileBadgeSize, kProfileBadgeSize), |
| - false), |
| + : CanvasImageSource( |
| + gfx::Size(GetProfileBadgeSize(), GetProfileBadgeSize()), |
| + false), |
| id_(id), |
| icon_size_(icon_size) {} |
| @@ -593,7 +681,7 @@ class ProfileBadge : public gfx::CanvasImageSource { |
| canvas->DrawCircle(bounds.CenterPoint(), |
| size.width() / 2 - kProfileBadgeWhitePadding, paint); |
| - int offset = (kProfileBadgeSize - icon_size_) / 2; |
| + int offset = (GetProfileBadgeSize() - icon_size_) / 2; |
| canvas->Translate(gfx::Vector2d(offset, offset)); |
| gfx::PaintVectorIcon(canvas, id_, icon_size_, SkColorSetRGB(0, 0x66, 0xff)); |
| } |
| @@ -608,9 +696,10 @@ class ProfileBadge : public gfx::CanvasImageSource { |
| gfx::ImageSkia CreateBadgeForProfile(Profile* profile) { |
|
Evan Stade
2016/06/30 13:32:38
is this still being used?
Jane
2016/06/30 14:06:30
Done. Removed this and ProfileBadge class.
|
| ProfileBadge* badge = |
| profile->IsChild() |
| - ? new ProfileBadge(gfx::VectorIconId::ACCOUNT_CHILD_INVERT, 26) |
| - : new ProfileBadge(gfx::VectorIconId::SUPERVISOR_ACCOUNT, 20); |
| - |
| + ? new ProfileBadge(gfx::VectorIconId::ACCOUNT_CHILD_INVERT, |
| + switches::IsMaterialDesignUserMenu() ? 21 : 26) |
| + : new ProfileBadge(gfx::VectorIconId::SUPERVISOR_ACCOUNT, |
| + switches::IsMaterialDesignUserMenu() ? 16 : 20); |
| return gfx::ImageSkia(badge, badge->size()); |
| } |
| @@ -668,6 +757,11 @@ void ProfileChooserView::Hide() { |
| profile_bubble_->GetWidget()->Close(); |
| } |
| +// static |
| +int ProfileChooserView::GetFixedMenuWidth() { |
| + return switches::IsMaterialDesignUserMenu() ? 240 : 250; |
| +} |
| + |
| ProfileChooserView::ProfileChooserView(views::View* anchor_view, |
| Browser* browser, |
| profiles::BubbleViewMode view_mode, |
| @@ -698,7 +792,7 @@ void ProfileChooserView::ResetView() { |
| delete_account_button_map_.clear(); |
| reauth_account_button_map_.clear(); |
| manage_accounts_link_ = nullptr; |
| - signin_current_profile_link_ = nullptr; |
| + signin_current_profile_button_ = nullptr; |
| auth_error_email_button_ = nullptr; |
| current_profile_photo_ = nullptr; |
| current_profile_name_ = nullptr; |
| @@ -845,7 +939,7 @@ void ProfileChooserView::ShowView(profiles::BubbleViewMode view_to_display, |
| case profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT: |
| case profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER: |
| case profiles::BUBBLE_VIEW_MODE_FAST_PROFILE_CHOOSER: |
| - layout = CreateSingleColumnLayout(this, kFixedMenuWidth); |
| + layout = CreateSingleColumnLayout(this, GetFixedMenuWidth()); |
| sub_view = CreateProfileChooserView(avatar_menu); |
| break; |
| } |
| @@ -892,7 +986,7 @@ bool ProfileChooserView::AcceleratorPressed( |
| } |
| views::View* ProfileChooserView::GetInitiallyFocusedView() { |
| - return signin_current_profile_link_; |
| + return signin_current_profile_button_; |
| } |
| int ProfileChooserView::GetDialogButtons() const { |
| @@ -968,7 +1062,7 @@ void ProfileChooserView::ButtonPressed(views::Button* sender, |
| } else if (sender == current_profile_photo_) { |
| avatar_menu_->EditProfile(avatar_menu_->GetActiveProfileIndex()); |
| PostActionPerformed(ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_IMAGE); |
| - } else if (sender == signin_current_profile_link_) { |
| + } else if (sender == signin_current_profile_button_) { |
| ShowViewFromMode(profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN); |
| } else if (sender == add_person_button_) { |
| ProfileMetrics::LogProfileNewAvatarMenuNotYou( |
| @@ -1106,7 +1200,10 @@ void ProfileChooserView::PopulateCompleteProfileChooserView( |
| option_buttons_view = CreateOptionsView( |
| item.signed_in && profiles::IsLockAvailable(browser_->profile()), |
| avatar_menu); |
| - current_profile_view = CreateCurrentProfileView(item, false); |
| + current_profile_view = |
| + switches::IsMaterialDesignUserMenu() |
| + ? CreateMaterialDesignCurrentProfileView(item, false) |
| + : CreateCurrentProfileView(item, false); |
| if (IsProfileChooser(view_mode_)) { |
| tutorial_view = CreateTutorialViewIfNeeded(item); |
| } else { |
| @@ -1143,8 +1240,10 @@ void ProfileChooserView::PopulateCompleteProfileChooserView( |
| } |
| if (browser_->profile()->IsSupervised()) { |
| - layout->StartRow(0, 0); |
| - layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); |
| + if (!switches::IsMaterialDesignUserMenu()) { |
| + layout->StartRow(0, 0); |
| + layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); |
| + } |
| layout->StartRow(1, 0); |
| layout->AddView(CreateSupervisedUserDisclaimerView()); |
| } |
| @@ -1176,7 +1275,8 @@ void ProfileChooserView::PopulateMinimalProfileChooserView( |
| views::View* ProfileChooserView::CreateProfileChooserView( |
| AvatarMenu* avatar_menu) { |
| views::View* view = new views::View(); |
| - views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); |
| + views::GridLayout* layout = |
| + CreateSingleColumnLayout(view, GetFixedMenuWidth()); |
| if (view_mode_ == profiles::BUBBLE_VIEW_MODE_FAST_PROFILE_CHOOSER) { |
| PopulateMinimalProfileChooserView(layout, avatar_menu); |
| @@ -1251,8 +1351,8 @@ views::View* ProfileChooserView::CreateTutorialView( |
| views::View* view = new views::View(); |
| view->set_background(views::Background::CreateSolidBackground( |
| profiles::kAvatarTutorialBackgroundColor)); |
| - views::GridLayout* layout = CreateSingleColumnLayout(view, |
| - kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew); |
| + views::GridLayout* layout = CreateSingleColumnLayout( |
| + view, GetFixedMenuWidth() - 2 * views::kButtonHEdgeMarginNew); |
| // Creates a second column set for buttons and links. |
| views::ColumnSet* button_columns = layout->AddColumnSet(1); |
| button_columns->AddColumn(views::GridLayout::LEADING, |
| @@ -1354,7 +1454,7 @@ views::View* ProfileChooserView::CreateCurrentProfileView( |
| const AvatarMenu::Item& avatar_item, |
| bool is_guest) { |
| views::View* view = new views::View(); |
| - int column_width = kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew; |
| + int column_width = GetFixedMenuWidth() - 2 * views::kButtonHEdgeMarginNew; |
| views::GridLayout* layout = CreateSingleColumnLayout(view, column_width); |
| layout->SetInsets(views::kButtonVEdgeMarginNew, |
| views::kButtonHEdgeMarginNew, |
| @@ -1364,24 +1464,12 @@ views::View* ProfileChooserView::CreateCurrentProfileView( |
| // Profile icon, centered. |
| int x_offset = (column_width - kLargeImageSide) / 2; |
| current_profile_photo_ = new EditableProfilePhoto( |
| - this, avatar_item.icon, !is_guest, |
| - gfx::Rect(x_offset, 0, kLargeImageSide, kLargeImageSide)); |
| + this, avatar_item.icon, !is_guest, browser_->profile()); |
| + current_profile_photo_->SetX(x_offset); |
| SizedContainer* profile_icon_container = |
| new SizedContainer(gfx::Size(column_width, kLargeImageSide)); |
| profile_icon_container->AddChildView(current_profile_photo_); |
| - if (browser_->profile()->IsSupervised()) { |
| - views::ImageView* supervised_icon = new views::ImageView(); |
| - supervised_icon->SetImage(CreateBadgeForProfile(browser_->profile())); |
| - gfx::Size preferred_size = supervised_icon->GetPreferredSize(); |
| - gfx::Rect parent_bounds = current_profile_photo_->bounds(); |
| - supervised_icon->SetBounds( |
| - parent_bounds.right() - preferred_size.width(), |
| - parent_bounds.bottom() - preferred_size.height(), |
| - preferred_size.width(), |
| - preferred_size.height()); |
| - profile_icon_container->AddChildView(supervised_icon); |
| - } |
| layout->StartRow(1, 0); |
| layout->AddView(profile_icon_container); |
| @@ -1452,13 +1540,14 @@ views::View* ProfileChooserView::CreateCurrentProfileView( |
| layout->StartRow(1, 0); |
| layout->AddView(promo); |
| - signin_current_profile_link_ = new views::BlueButton( |
| - this, l10n_util::GetStringFUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL, |
| - l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME))); |
| + signin_current_profile_button_ = new views::BlueButton( |
| + this, l10n_util::GetStringFUTF16( |
| + IDS_SYNC_START_SYNC_BUTTON_LABEL, |
| + l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME))); |
| layout->StartRowWithPadding(1, 0, 0, |
| views::kRelatedControlVerticalSpacing); |
| layout->StartRow(1, 0); |
| - layout->AddView(signin_current_profile_link_); |
| + layout->AddView(signin_current_profile_button_); |
| content::RecordAction( |
| base::UserMetricsAction("Signin_Impression_FromAvatarBubbleSignin")); |
| } |
| @@ -1467,6 +1556,92 @@ views::View* ProfileChooserView::CreateCurrentProfileView( |
| return view; |
| } |
| +views::View* ProfileChooserView::CreateMaterialDesignCurrentProfileView( |
| + const AvatarMenu::Item& avatar_item, |
| + bool is_guest) { |
| + views::View* view = new views::View(); |
| + view->SetLayoutManager( |
| + new views::BoxLayout(views::BoxLayout::kVertical, kMaterialMenuEdgeMargin, |
| + views::kRelatedControlVerticalSpacing, |
| + views::kRelatedControlVerticalSpacing)); |
| + |
| + // Profile container for the profile photo and avatar/user name. |
| + views::View* profile_container = new views::View(); |
| + |
| + // Profile picture, left-aligned. |
| + current_profile_photo_ = new EditableProfilePhoto( |
| + this, avatar_item.icon, !is_guest, browser_->profile()); |
| + |
| + // Profile name, left-aligned to the right of profile icon. |
| + bool editing_allowed = |
| + !is_guest && !browser_->profile()->IsLegacySupervised(); |
| + current_profile_name_ = new EditableProfileName( |
| + this, profiles::GetAvatarNameForProfile(browser_->profile()->GetPath()), |
| + editing_allowed); |
| + views::View* profile_name_container = new views::View(); |
| + int name_container_v_spacing = views::kRelatedControlSmallVerticalSpacing; |
| + if (!avatar_item.signed_in) |
| + name_container_v_spacing += views::kRelatedControlVerticalSpacing; |
| + profile_name_container->SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kVertical, 0, name_container_v_spacing, 0)); |
| + profile_name_container->AddChildView(current_profile_name_); |
| + |
| + const int between_child_spacing = |
| + kMaterialMenuEdgeMargin - current_profile_photo_->badge_spacing; |
| + profile_container->SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kHorizontal, 0, |
| + views::kRelatedControlSmallVerticalSpacing, between_child_spacing)); |
| + profile_container->AddChildView(current_profile_photo_); |
| + profile_container->AddChildView(profile_name_container); |
| + view->AddChildView(profile_container); |
| + |
| + if (is_guest) |
| + return view; |
| + |
| + // The available links depend on the type of profile that is active. |
| + if (avatar_item.signed_in) { |
| + if (switches::IsEnableAccountConsistency()) { |
| + base::string16 link_title = l10n_util::GetStringUTF16( |
| + IsProfileChooser(view_mode_) |
| + ? IDS_PROFILES_PROFILE_MANAGE_ACCOUNTS_BUTTON |
| + : IDS_PROFILES_PROFILE_HIDE_MANAGE_ACCOUNTS_BUTTON); |
| + manage_accounts_link_ = CreateLink(link_title, this); |
| + manage_accounts_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + profile_name_container->AddChildView(manage_accounts_link_); |
| + } else { |
| + views::Label* email_label = new views::Label(avatar_item.username); |
| + email_label->SetElideBehavior(gfx::ELIDE_EMAIL); |
| + email_label->SetEnabled(false); |
| + email_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + profile_name_container->AddChildView(email_label); |
| + } |
| + return view; |
| + } |
| + |
| + SigninManagerBase* signin_manager = SigninManagerFactory::GetForProfile( |
| + browser_->profile()->GetOriginalProfile()); |
| + if (signin_manager->IsSigninAllowed()) { |
| + views::Label* promo = |
| + new views::Label(l10n_util::GetStringUTF16(IDS_PROFILES_SIGNIN_PROMO)); |
| + promo->SetMultiLine(true); |
| + promo->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + view->AddChildView(promo); |
| + |
| + signin_current_profile_button_ = |
| + views::MdTextButton::CreateSecondaryUiBlueButton( |
| + this, l10n_util::GetStringFUTF16( |
| + IDS_SYNC_START_SYNC_BUTTON_LABEL, |
| + l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME))); |
| + view->AddChildView(signin_current_profile_button_); |
| + content::RecordAction( |
| + base::UserMetricsAction("Signin_Impression_FromAvatarBubbleSignin")); |
| + view->SetBorder(views::Border::CreateEmptyBorder( |
| + 0, 0, views::kRelatedControlVerticalSpacing, 0)); |
| + } |
| + |
| + return view; |
| +} |
| + |
| views::View* ProfileChooserView::CreateGuestProfileView() { |
| gfx::Image guest_icon = |
| ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| @@ -1477,13 +1652,16 @@ views::View* ProfileChooserView::CreateGuestProfileView() { |
| IDS_PROFILES_GUEST_PROFILE_NAME); |
| guest_avatar_item.signed_in = false; |
| - return CreateCurrentProfileView(guest_avatar_item, true); |
| + return switches::IsMaterialDesignUserMenu() |
| + ? CreateMaterialDesignCurrentProfileView(guest_avatar_item, true) |
| + : CreateCurrentProfileView(guest_avatar_item, true); |
| } |
| views::View* ProfileChooserView::CreateOtherProfilesView( |
| const Indexes& avatars_to_show) { |
| views::View* view = new views::View(); |
| - views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); |
| + views::GridLayout* layout = |
| + CreateSingleColumnLayout(view, GetFixedMenuWidth()); |
| for (size_t index : avatars_to_show) { |
| const AvatarMenu::Item& item = avatar_menu_->GetItemAt(index); |
| @@ -1515,7 +1693,8 @@ views::View* ProfileChooserView::CreateOtherProfilesView( |
| views::View* ProfileChooserView::CreateOptionsView(bool display_lock, |
| AvatarMenu* avatar_menu) { |
| views::View* view = new views::View(); |
| - views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); |
| + views::GridLayout* layout = |
| + CreateSingleColumnLayout(view, GetFixedMenuWidth()); |
| const int kIconSize = switches::IsMaterialDesignUserMenu() ? 20 : 16; |
| if (switches::IsMaterialDesignUserMenu()) { |
| @@ -1621,11 +1800,16 @@ views::View* ProfileChooserView::CreateOptionsView(bool display_lock, |
| views::View* ProfileChooserView::CreateSupervisedUserDisclaimerView() { |
| views::View* view = new views::View(); |
| views::GridLayout* layout = CreateSingleColumnLayout( |
| - view, kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew); |
| - layout->SetInsets(views::kRelatedControlVerticalSpacing, |
| - views::kButtonHEdgeMarginNew, |
| - views::kRelatedControlVerticalSpacing, |
| - views::kButtonHEdgeMarginNew); |
| + view, GetFixedMenuWidth() - 2 * views::kButtonHEdgeMarginNew); |
| + if (switches::IsMaterialDesignUserMenu()) { |
| + layout->SetInsets(0, kMaterialMenuEdgeMargin, kMaterialMenuEdgeMargin, |
| + kMaterialMenuEdgeMargin); |
| + } else { |
| + layout->SetInsets( |
| + views::kRelatedControlVerticalSpacing, views::kButtonHEdgeMarginNew, |
| + views::kRelatedControlVerticalSpacing, views::kButtonHEdgeMarginNew); |
| + } |
| + |
| views::Label* disclaimer = new views::Label( |
| avatar_menu_->GetSupervisedUserInformation()); |
| disclaimer->SetMultiLine(true); |
| @@ -1645,7 +1829,8 @@ views::View* ProfileChooserView::CreateCurrentProfileAccountsView( |
| views::View* view = new views::View(); |
| view->set_background(views::Background::CreateSolidBackground( |
| profiles::kAvatarBubbleAccountsBackgroundColor)); |
| - views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); |
| + views::GridLayout* layout = |
| + CreateSingleColumnLayout(view, GetFixedMenuWidth()); |
| Profile* profile = browser_->profile(); |
| std::string primary_account = |
| @@ -1662,10 +1847,10 @@ views::View* ProfileChooserView::CreateCurrentProfileAccountsView( |
| // from the others in the UI, so more work is likely required here: |
| // crbug.com/311124. |
| CreateAccountButton(layout, primary_account, true, |
| - error_account_id == primary_account, kFixedMenuWidth); |
| + error_account_id == primary_account, GetFixedMenuWidth()); |
| for (size_t i = 0; i < accounts.size(); ++i) |
| CreateAccountButton(layout, accounts[i], false, |
| - error_account_id == accounts[i], kFixedMenuWidth); |
| + error_account_id == accounts[i], GetFixedMenuWidth()); |
| if (!profile->IsSupervised()) { |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |