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..cdab61cd0c7951749862b5d8bc29ca23e9dfad78 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,15 @@ bool IsProfileChooser(profiles::BubbleViewMode mode) { |
mode == profiles::BUBBLE_VIEW_MODE_FAST_PROFILE_CHOOSER; |
} |
+int GetFixedMenuWidth() { |
+ return switches::IsMaterialDesignUserMenu() ? 240 : 250; |
+} |
+ |
+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 +278,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 +317,35 @@ 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) { |
+ photo_overlay_(nullptr), |
+ profile_(profile) { |
gfx::Image image = profiles::GetSizedAvatarIcon( |
- icon, true, kLargeImageSide, kLargeImageSide); |
+ 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,25 +360,92 @@ 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 profile badge icons when |
+ // new versions of them are ready, which be inverted as silhouettes. Also, |
+ // remove the code below for painting the background for the badges as |
+ // they won't be necessary. |
+ 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(GetNativeTheme()->GetSystemColor( |
+ ui::NativeTheme::kColorId_BubbleBackground)); |
+ 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); |
+ } |
+ } |
+ |
+ static int icon_image_side() { |
+ return switches::IsMaterialDesignUserMenu() ? kMdImageSide |
+ : kLargeImageSide; |
+ } |
+ |
+ static int badge_spacing() { |
+ // The space between the right/bottom edge of the profile badge and the |
+ // right/bottom edge of the profile icon. |
+ return switches::IsMaterialDesignUserMenu() ? 4 : 0; |
} |
private: |
@@ -382,6 +476,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 +490,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 +538,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 +588,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_; |
@@ -563,57 +668,6 @@ class TitleCard : public views::View { |
DISALLOW_COPY_AND_ASSIGN(TitleCard); |
}; |
-// 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), |
- id_(id), |
- icon_size_(icon_size) {} |
- |
- ~ProfileBadge() override {} |
- |
- // CanvasImageSource: |
- void Draw(gfx::Canvas* canvas) override { |
- const SkISize size = canvas->sk_canvas()->getBaseLayerSize(); |
- gfx::Rect bounds(0, 0, size.width(), size.height()); |
- |
- SkPaint paint; |
- paint.setAntiAlias(true); |
- paint.setColor(SK_ColorWHITE); |
- canvas->DrawCircle(bounds.CenterPoint(), size.width() / 2, paint); |
- |
- paint.setColor(SkColorSetRGB(0xAF, 0xD9, 0xFC)); |
- canvas->DrawCircle(bounds.CenterPoint(), |
- size.width() / 2 - kProfileBadgeWhitePadding, paint); |
- |
- int offset = (kProfileBadgeSize - icon_size_) / 2; |
- canvas->Translate(gfx::Vector2d(offset, offset)); |
- gfx::PaintVectorIcon(canvas, id_, icon_size_, SkColorSetRGB(0, 0x66, 0xff)); |
- } |
- |
- private: |
- const gfx::VectorIconId id_; |
- const size_t icon_size_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ProfileBadge); |
-}; |
- |
-gfx::ImageSkia CreateBadgeForProfile(Profile* profile) { |
- ProfileBadge* badge = |
- profile->IsChild() |
- ? new ProfileBadge(gfx::VectorIconId::ACCOUNT_CHILD_INVERT, 26) |
- : new ProfileBadge(gfx::VectorIconId::SUPERVISOR_ACCOUNT, 20); |
- |
- return gfx::ImageSkia(badge, badge->size()); |
-} |
- |
// ProfileChooserView --------------------------------------------------------- |
// static |
@@ -698,7 +752,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 +899,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 +946,7 @@ bool ProfileChooserView::AcceleratorPressed( |
} |
views::View* ProfileChooserView::GetInitiallyFocusedView() { |
- return signin_current_profile_link_; |
+ return signin_current_profile_button_; |
} |
int ProfileChooserView::GetDialogButtons() const { |
@@ -968,7 +1022,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 +1160,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 +1200,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 +1235,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 +1311,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 +1414,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 +1424,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 +1500,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 +1516,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 - EditableProfilePhoto::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 +1612,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 +1653,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 +1760,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 +1789,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 +1807,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); |