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

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

Issue 2880033003: Apply MD style to Linux avatar buttons. (Closed)
Patch Set: rebase Created 3 years, 7 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/avatar_button.h" 5 #include "chrome/browser/ui/views/profiles/avatar_button.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "chrome/app/vector_icons/vector_icons.h" 9 #include "chrome/app/vector_icons/vector_icons.h"
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/profiles/profile_manager.h" 11 #include "chrome/browser/profiles/profile_manager.h"
12 #include "chrome/browser/profiles/profiles_state.h" 12 #include "chrome/browser/profiles/profiles_state.h"
13 #include "chrome/browser/signin/signin_manager_factory.h" 13 #include "chrome/browser/signin/signin_manager_factory.h"
14 #include "chrome/browser/themes/theme_properties.h"
14 #include "chrome/browser/themes/theme_service.h" 15 #include "chrome/browser/themes/theme_service.h"
15 #include "chrome/browser/themes/theme_service_factory.h" 16 #include "chrome/browser/themes/theme_service_factory.h"
17 #include "chrome/browser/ui/views/profiles/profile_chooser_view.h"
16 #include "chrome/grit/theme_resources.h" 18 #include "chrome/grit/theme_resources.h"
17 #include "components/signin/core/browser/signin_manager.h" 19 #include "components/signin/core/browser/signin_manager.h"
18 #include "ui/base/resource/resource_bundle.h" 20 #include "ui/base/resource/resource_bundle.h"
21 #include "ui/base/theme_provider.h"
22 #include "ui/gfx/canvas.h"
19 #include "ui/gfx/color_palette.h" 23 #include "ui/gfx/color_palette.h"
20 #include "ui/gfx/paint_vector_icon.h" 24 #include "ui/gfx/paint_vector_icon.h"
21 #include "ui/views/animation/flood_fill_ink_drop_ripple.h" 25 #include "ui/views/animation/flood_fill_ink_drop_ripple.h"
22 #include "ui/views/animation/ink_drop_impl.h" 26 #include "ui/views/animation/ink_drop_impl.h"
27 #include "ui/views/animation/ink_drop_mask.h"
23 #include "ui/views/controls/button/label_button_border.h" 28 #include "ui/views/controls/button/label_button_border.h"
24 29
25 #if defined(OS_WIN) 30 #if defined(OS_WIN)
26 #include "base/win/windows_version.h" 31 #include "base/win/windows_version.h"
27 #include "chrome/browser/ui/views/frame/minimize_button_metrics_win.h" 32 #include "chrome/browser/ui/views/frame/minimize_button_metrics_win.h"
28 #endif 33 #endif
29 34
30 namespace { 35 namespace {
31 36
32 constexpr int kLeftRightInset = 8; 37 constexpr gfx::Insets kBorderInsets(2, 8, 4, 8);
33 constexpr int kTopInset = 2;
34 constexpr int kBottomInset = 4;
35 38
36 // TODO(emx): Calculate width based on caption button [http://crbug.com/716365] 39 // TODO(emx): Calculate width based on caption button [http://crbug.com/716365]
37 constexpr int kMdButtonMinWidth = 46; 40 constexpr int kCondensibleButtonMinWidth = 46;
41 // TODO(emx): Should this be calculated based on average character width?
42 constexpr int kCondensibleButtonMaxWidth = 98;
38 43
39 std::unique_ptr<views::Border> CreateThemedBorder( 44 std::unique_ptr<views::Border> CreateThemedBorder(
40 const int normal_image_set[], 45 const int normal_image_set[],
41 const int hot_image_set[], 46 const int hot_image_set[],
42 const int pushed_image_set[]) { 47 const int pushed_image_set[]) {
43 std::unique_ptr<views::LabelButtonAssetBorder> border( 48 std::unique_ptr<views::LabelButtonAssetBorder> border(
44 new views::LabelButtonAssetBorder(views::Button::STYLE_TEXTBUTTON)); 49 new views::LabelButtonAssetBorder(views::Button::STYLE_TEXTBUTTON));
45 50
46 border->SetPainter(false, views::Button::STATE_NORMAL, 51 border->SetPainter(false, views::Button::STATE_NORMAL,
47 views::Painter::CreateImageGridPainter(normal_image_set)); 52 views::Painter::CreateImageGridPainter(normal_image_set));
48 border->SetPainter(false, views::Button::STATE_HOVERED, 53 border->SetPainter(false, views::Button::STATE_HOVERED,
49 views::Painter::CreateImageGridPainter(hot_image_set)); 54 views::Painter::CreateImageGridPainter(hot_image_set));
50 border->SetPainter(false, views::Button::STATE_PRESSED, 55 border->SetPainter(false, views::Button::STATE_PRESSED,
51 views::Painter::CreateImageGridPainter(pushed_image_set)); 56 views::Painter::CreateImageGridPainter(pushed_image_set));
52 57
53 border->set_insets( 58 border->set_insets(kBorderInsets);
54 gfx::Insets(kTopInset, kLeftRightInset, kBottomInset, kLeftRightInset));
55 59
56 return std::move(border); 60 return std::move(border);
57 } 61 }
58 62
59 std::unique_ptr<views::Border> CreateWin10NativeBorder() { 63 // This class draws the border (and background) of the avatar button for
60 return views::CreateEmptyBorder(kTopInset, kLeftRightInset, kBottomInset, 64 // "themed" browser windows, i.e. OpaqueBrowserFrameView. Currently it's only
61 kLeftRightInset); 65 // used on Linux as the shape specifically matches the Linux caption buttons.
62 } 66 // TODO(estade): make this look nice on Windows and use it there as well.
67 class AvatarButtonThemedBorder : public views::Border {
68 public:
69 AvatarButtonThemedBorder() {}
70 ~AvatarButtonThemedBorder() override {}
71
72 void Paint(const views::View& view, gfx::Canvas* canvas) override {
73 // Start with an outer dark stroke.
74 cc::PaintFlags stroke_flags;
75 stroke_flags.setStyle(cc::PaintFlags::kStroke_Style);
76 // The colors are chosen to match the assets we use for Linux.
77 stroke_flags.setColor(SkColorSetA(SK_ColorBLACK, 0x2B));
78 stroke_flags.setStrokeWidth(kStrokeWidth);
79 stroke_flags.setAntiAlias(true);
80 gfx::RectF stroke_bounds(view.GetLocalBounds());
81 stroke_bounds.Inset(gfx::InsetsF(0.5f));
82 canvas->DrawRoundRect(stroke_bounds, kCornerRadius, stroke_flags);
83
84 // There's a second, light stroke that matches the fill bounds.
85 stroke_bounds.Inset(gfx::InsetsF(kStrokeWidth));
86 stroke_flags.setColor(SkColorSetA(SK_ColorWHITE, 0x3F));
87 canvas->DrawRoundRect(stroke_bounds, kCornerRadius, stroke_flags);
88 }
89
90 gfx::Insets GetInsets() const override {
91 auto insets = views::LabelButtonAssetBorder::GetDefaultInsetsForStyle(
92 views::Button::STYLE_TEXTBUTTON);
93 return kBorderStrokeInsets +
94 gfx::Insets(0, insets.left(), 0, insets.right());
95 }
96
97 gfx::Size GetMinimumSize() const override {
98 return gfx::Size(GetInsets().width(), GetInsets().height());
99 }
100
101 static std::unique_ptr<views::InkDropMask> CreateInkDropMask(
102 const gfx::Size& size) {
103 return base::MakeUnique<views::RoundRectInkDropMask>(
104 size, kBorderStrokeInsets, kCornerRadius);
105 }
106
107 private:
108 static constexpr int kStrokeWidth = 1;
109
110 // Insets between view bounds and the interior of the strokes.
111 static constexpr gfx::Insets kBorderStrokeInsets{kStrokeWidth * 2};
112
113 // Corner radius of the roundrect.
114 static constexpr float kCornerRadius = 1;
115
116 DISALLOW_COPY_AND_ASSIGN(AvatarButtonThemedBorder);
117 };
118
119 constexpr int AvatarButtonThemedBorder::kStrokeWidth;
120 constexpr gfx::Insets AvatarButtonThemedBorder::kBorderStrokeInsets;
121 constexpr float AvatarButtonThemedBorder::kCornerRadius;
63 122
64 } // namespace 123 } // namespace
65 124
66 AvatarButton::AvatarButton(views::ButtonListener* listener, 125 AvatarButton::AvatarButton(views::ButtonListener* listener,
67 AvatarButtonStyle button_style, 126 AvatarButtonStyle button_style,
68 Profile* profile) 127 Profile* profile)
69 : LabelButton(listener, base::string16()), 128 : LabelButton(listener, base::string16()),
70 error_controller_(this, profile), 129 error_controller_(this, profile),
71 profile_(profile), 130 profile_(profile),
72 profile_observer_(this), 131 profile_observer_(this),
73 use_win10_native_button_(false) { 132 button_style_(button_style) {
74 set_notify_action(CustomButton::NOTIFY_ON_PRESS); 133 set_notify_action(CustomButton::NOTIFY_ON_PRESS);
75 set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON | 134 set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON |
76 ui::EF_RIGHT_MOUSE_BUTTON); 135 ui::EF_RIGHT_MOUSE_BUTTON);
77 set_animate_on_state_change(false); 136 set_animate_on_state_change(false);
78 SetEnabledTextColors(SK_ColorWHITE); 137 SetEnabledTextColors(SK_ColorWHITE);
79 SetTextSubpixelRenderingEnabled(false); 138 SetTextSubpixelRenderingEnabled(false);
80 SetHorizontalAlignment(gfx::ALIGN_CENTER); 139 SetHorizontalAlignment(gfx::ALIGN_CENTER);
81 140
82 profile_observer_.Add( 141 profile_observer_.Add(
83 &g_browser_process->profile_manager()->GetProfileAttributesStorage()); 142 &g_browser_process->profile_manager()->GetProfileAttributesStorage());
84 143
85 // The largest text height that fits in the button. If the font list height 144 // The largest text height that fits in the button. If the font list height
86 // is larger than this, it will be shrunk to match it. 145 // is larger than this, it will be shrunk to match it.
87 // TODO(noms): Calculate this constant algorithmically from the button's size. 146 // TODO(noms): Calculate this constant algorithmically from the button's size.
88 const int kDisplayFontHeight = 16; 147 const int kDisplayFontHeight = 16;
89 label()->SetFontList( 148 label()->SetFontList(
90 label()->font_list().DeriveWithHeightUpperBound(kDisplayFontHeight)); 149 label()->font_list().DeriveWithHeightUpperBound(kDisplayFontHeight));
91 150
92 #if defined(OS_WIN) 151 bool apply_ink_drop = IsCondensible();
93 // TODO(estade): Use MD button in other cases, too [http://crbug.com/591586] 152 #if defined(OS_LINUX)
94 if ((base::win::GetVersion() >= base::win::VERSION_WIN10) && 153 DCHECK_EQ(AvatarButtonStyle::THEMED, button_style);
95 ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme() && 154 apply_ink_drop = true;
96 button_style == AvatarButtonStyle::NATIVE) 155 #endif
97 use_win10_native_button_ = true;
98 #endif // defined(OS_WIN)
99 156
100 if (use_win10_native_button_) { 157 if (apply_ink_drop) {
101 constexpr int kMdButtonIconHeight = 16; 158 constexpr int kIconSize = 16;
102 constexpr SkColor kMdButtonIconColor = 159 constexpr SkColor kIconColor =
103 SkColorSetA(SK_ColorBLACK, static_cast<SkAlpha>(0.54 * 0xFF)); 160 SkColorSetA(SK_ColorBLACK, static_cast<SkAlpha>(0.54 * 0xFF));
104 generic_avatar_ = gfx::CreateVectorIcon( 161 generic_avatar_ =
105 kAccountCircleIcon, kMdButtonIconHeight, kMdButtonIconColor); 162 gfx::CreateVectorIcon(kAccountCircleIcon, kIconSize, kIconColor);
106 SetBorder(CreateWin10NativeBorder());
107 163
108 SetInkDropMode(InkDropMode::ON); 164 SetInkDropMode(InkDropMode::ON);
109 set_has_ink_drop_action_on_click(true);
110 SetFocusPainter(nullptr); 165 SetFocusPainter(nullptr);
166 #if defined(OS_LINUX)
167 set_ink_drop_base_color(SK_ColorWHITE);
168 SetBorder(base::MakeUnique<AvatarButtonThemedBorder>());
169 #elif defined(OS_WIN)
170 DCHECK_EQ(AvatarButtonStyle::NATIVE, button_style);
111 set_ink_drop_base_color(SK_ColorBLACK); 171 set_ink_drop_base_color(SK_ColorBLACK);
172 SetBorder(views::CreateEmptyBorder(kBorderInsets));
173 #endif // defined(OS_WIN)
174 } else if (button_style == AvatarButtonStyle::THEMED) {
175 const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_NORMAL);
176 const int kHoverImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_HOVER);
177 const int kPressedImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_PRESSED);
178 SetButtonAvatar(IDR_AVATAR_THEMED_BUTTON_AVATAR);
179 SetBorder(
180 CreateThemedBorder(kNormalImageSet, kHoverImageSet, kPressedImageSet));
181 #if defined(OS_WIN)
182 } else if (base::win::GetVersion() < base::win::VERSION_WIN8) {
183 const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_NORMAL);
184 const int kHoverImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_HOVER);
185 const int kPressedImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_PRESSED);
186 SetButtonAvatar(IDR_AVATAR_GLASS_BUTTON_AVATAR);
187 SetBorder(
188 CreateThemedBorder(kNormalImageSet, kHoverImageSet, kPressedImageSet));
189 #endif
112 } else { 190 } else {
113 if (button_style == AvatarButtonStyle::THEMED) { 191 const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_NATIVE_BUTTON_NORMAL);
114 const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_NORMAL); 192 const int kHoverImageSet[] = IMAGE_GRID(IDR_AVATAR_NATIVE_BUTTON_HOVER);
115 const int kHoverImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_HOVER); 193 const int kPressedImageSet[] = IMAGE_GRID(IDR_AVATAR_NATIVE_BUTTON_PRESSED);
116 const int kPressedImageSet[] = 194 SetButtonAvatar(IDR_AVATAR_NATIVE_BUTTON_AVATAR);
117 IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_PRESSED); 195 SetBorder(
118 SetButtonAvatar(IDR_AVATAR_THEMED_BUTTON_AVATAR); 196 CreateThemedBorder(kNormalImageSet, kHoverImageSet, kPressedImageSet));
119 SetBorder(CreateThemedBorder(kNormalImageSet, kHoverImageSet,
120 kPressedImageSet));
121 #if defined(OS_WIN)
122 } else if (base::win::GetVersion() < base::win::VERSION_WIN8) {
123 const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_NORMAL);
124 const int kHoverImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_HOVER);
125 const int kPressedImageSet[] =
126 IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_PRESSED);
127 SetButtonAvatar(IDR_AVATAR_GLASS_BUTTON_AVATAR);
128 SetBorder(CreateThemedBorder(kNormalImageSet, kHoverImageSet,
129 kPressedImageSet));
130 #endif
131 } else {
132 const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_NATIVE_BUTTON_NORMAL);
133 const int kHoverImageSet[] = IMAGE_GRID(IDR_AVATAR_NATIVE_BUTTON_HOVER);
134 const int kPressedImageSet[] =
135 IMAGE_GRID(IDR_AVATAR_NATIVE_BUTTON_PRESSED);
136 SetButtonAvatar(IDR_AVATAR_NATIVE_BUTTON_AVATAR);
137 SetBorder(CreateThemedBorder(kNormalImageSet, kHoverImageSet,
138 kPressedImageSet));
139 }
140 } 197 }
141 198
142 Update(); 199 Update();
143 SchedulePaint(); 200 SchedulePaint();
144 } 201 }
145 202
146 AvatarButton::~AvatarButton() {} 203 AvatarButton::~AvatarButton() {}
147 204
148 void AvatarButton::OnGestureEvent(ui::GestureEvent* event) { 205 void AvatarButton::OnGestureEvent(ui::GestureEvent* event) {
149 // TODO(wjmaclean): The check for ET_GESTURE_LONG_PRESS is done here since 206 // TODO(wjmaclean): The check for ET_GESTURE_LONG_PRESS is done here since
150 // no other UI button based on CustomButton appears to handle mouse 207 // no other UI button based on CustomButton appears to handle mouse
151 // right-click. If other cases are identified, it may make sense to move this 208 // right-click. If other cases are identified, it may make sense to move this
152 // check to CustomButton. 209 // check to CustomButton.
153 if (event->type() == ui::ET_GESTURE_LONG_PRESS) 210 if (event->type() == ui::ET_GESTURE_LONG_PRESS)
154 NotifyClick(*event); 211 NotifyClick(*event);
155 else 212 else
156 LabelButton::OnGestureEvent(event); 213 LabelButton::OnGestureEvent(event);
157 } 214 }
158 215
159 gfx::Size AvatarButton::GetMinimumSize() const { 216 gfx::Size AvatarButton::GetMinimumSize() const {
160 if (use_win10_native_button_) { 217 if (IsCondensible()) {
161 // Returns the size of the button when it is atop the tabstrip. Called by 218 // Returns the size of the button when it is atop the tabstrip. Called by
162 // GlassBrowserFrameView::LayoutProfileSwitcher(). 219 // GlassBrowserFrameView::LayoutProfileSwitcher().
163 // TODO(emx): Calculate the height based on the top of the new tab button. 220 // TODO(emx): Calculate the height based on the top of the new tab button.
164 return gfx::Size(kMdButtonMinWidth, 20); 221 return gfx::Size(kCondensibleButtonMinWidth, 20);
165 } 222 }
166 223
167 return LabelButton::GetMinimumSize(); 224 return LabelButton::GetMinimumSize();
168 } 225 }
169 226
170 gfx::Size AvatarButton::GetPreferredSize() const { 227 gfx::Size AvatarButton::GetPreferredSize() const {
171 gfx::Size size = LabelButton::GetPreferredSize(); 228 // TODO(estade): Calculate the height instead of hardcoding to 20 for the
229 // not-condensible case.
230 gfx::Size size(LabelButton::GetPreferredSize().width(), 20);
172 231
173 if (use_win10_native_button_) { 232 if (IsCondensible()) {
233 // Returns the normal size of the button (when it does not overlap the
234 // tabstrip).
235 size.set_width(std::min(std::max(size.width(), kCondensibleButtonMinWidth),
236 kCondensibleButtonMaxWidth));
174 #if defined(OS_WIN) 237 #if defined(OS_WIN)
175 // Returns the normal size of the button (when it does not overlap the
176 // tabstrip). Its height should match the caption button height.
177 // The minimum width is the caption button width and the maximum is fixed
178 // as per the spec in http://crbug.com/635699.
179 // TODO(emx): Should this be calculated based on average character width?
180 constexpr int kMdButtonMaxWidth = 98;
181 size.set_width(
182 std::min(std::max(size.width(), kMdButtonMinWidth), kMdButtonMaxWidth));
183 size.set_height(MinimizeButtonMetrics::GetCaptionButtonHeightInDIPs()); 238 size.set_height(MinimizeButtonMetrics::GetCaptionButtonHeightInDIPs());
184 #endif 239 #endif
185 } else {
186 size.set_height(20);
187 } 240 }
188 241
189 return size; 242 return size;
190 } 243 }
191 244
245 std::unique_ptr<views::InkDropMask> AvatarButton::CreateInkDropMask() const {
246 if (button_style_ == AvatarButtonStyle::THEMED)
247 return AvatarButtonThemedBorder::CreateInkDropMask(size());
248 return LabelButton::CreateInkDropMask();
249 }
250
192 std::unique_ptr<views::InkDropHighlight> AvatarButton::CreateInkDropHighlight() 251 std::unique_ptr<views::InkDropHighlight> AvatarButton::CreateInkDropHighlight()
193 const { 252 const {
194 auto center = gfx::RectF(GetLocalBounds()).CenterPoint(); 253 if (button_style_ == AvatarButtonStyle::THEMED)
254 return LabelButton::CreateInkDropHighlight();
255
195 auto ink_drop_highlight = base::MakeUnique<views::InkDropHighlight>( 256 auto ink_drop_highlight = base::MakeUnique<views::InkDropHighlight>(
196 size(), 0, center, GetInkDropBaseColor()); 257 size(), 0, gfx::RectF(GetLocalBounds()).CenterPoint(),
258 GetInkDropBaseColor());
197 constexpr float kInkDropHighlightOpacity = 0.08f; 259 constexpr float kInkDropHighlightOpacity = 0.08f;
198 ink_drop_highlight->set_visible_opacity(kInkDropHighlightOpacity); 260 ink_drop_highlight->set_visible_opacity(kInkDropHighlightOpacity);
199 return ink_drop_highlight; 261 return ink_drop_highlight;
200 } 262 }
201 263
264 void AvatarButton::NotifyClick(const ui::Event& event) {
265 LabelButton::NotifyClick(event);
266
267 views::Widget* bubble_widget = ProfileChooserView::GetCurrentBubbleWidget();
268 if (bubble_widget && !bubble_widget->HasObserver(this)) {
269 ProfileChooserView::GetCurrentBubbleWidget()->AddObserver(this);
270 AnimateInkDrop(views::InkDropState::ACTIVATED,
271 ui::LocatedEvent::FromIfValid(&event));
272 }
273 }
274
275 bool AvatarButton::ShouldEnterPushedState(const ui::Event& event) {
276 if (ProfileChooserView::IsShowing())
277 return false;
278
279 return LabelButton::ShouldEnterPushedState(event);
280 }
281
202 bool AvatarButton::ShouldUseFloodFillInkDrop() const { 282 bool AvatarButton::ShouldUseFloodFillInkDrop() const {
203 return true; 283 return true;
204 } 284 }
205 285
206 void AvatarButton::OnAvatarErrorChanged() { 286 void AvatarButton::OnAvatarErrorChanged() {
207 Update(); 287 Update();
208 } 288 }
209 289
210 void AvatarButton::OnProfileAdded(const base::FilePath& profile_path) { 290 void AvatarButton::OnProfileAdded(const base::FilePath& profile_path) {
211 Update(); 291 Update();
(...skipping 13 matching lines...) Expand all
225 if (profile_->GetPath() == profile_path) 305 if (profile_->GetPath() == profile_path)
226 Update(); 306 Update();
227 } 307 }
228 308
229 void AvatarButton::OnProfileSupervisedUserIdChanged( 309 void AvatarButton::OnProfileSupervisedUserIdChanged(
230 const base::FilePath& profile_path) { 310 const base::FilePath& profile_path) {
231 if (profile_->GetPath() == profile_path) 311 if (profile_->GetPath() == profile_path)
232 Update(); 312 Update();
233 } 313 }
234 314
315 void AvatarButton::OnWidgetClosing(views::Widget* widget) {
316 AnimateInkDrop(views::InkDropState::DEACTIVATED, nullptr);
317 }
318
235 void AvatarButton::Update() { 319 void AvatarButton::Update() {
236 ProfileAttributesStorage& storage = 320 ProfileAttributesStorage& storage =
237 g_browser_process->profile_manager()->GetProfileAttributesStorage(); 321 g_browser_process->profile_manager()->GetProfileAttributesStorage();
238 322
239 // If we have a single local profile, then use the generic avatar 323 // If we have a single local profile, then use the generic avatar
240 // button instead of the profile name. Never use the generic button if 324 // button instead of the profile name. Never use the generic button if
241 // the active profile is Guest. 325 // the active profile is Guest.
242 const bool use_generic_button = 326 const bool use_generic_button =
243 !profile_->IsGuestSession() && storage.GetNumberOfProfiles() == 1 && 327 !profile_->IsGuestSession() && storage.GetNumberOfProfiles() == 1 &&
244 !SigninManagerFactory::GetForProfile(profile_)->IsAuthenticated(); 328 !SigninManagerFactory::GetForProfile(profile_)->IsAuthenticated();
(...skipping 27 matching lines...) Expand all
272 const int kDefaultImageTextSpacing = 5; 356 const int kDefaultImageTextSpacing = 5;
273 SetImageLabelSpacing(use_generic_button ? 0 : kDefaultImageTextSpacing); 357 SetImageLabelSpacing(use_generic_button ? 0 : kDefaultImageTextSpacing);
274 358
275 PreferredSizeChanged(); 359 PreferredSizeChanged();
276 } 360 }
277 361
278 void AvatarButton::SetButtonAvatar(int avatar_idr) { 362 void AvatarButton::SetButtonAvatar(int avatar_idr) {
279 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 363 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
280 generic_avatar_ = *rb->GetImageNamed(avatar_idr).ToImageSkia(); 364 generic_avatar_ = *rb->GetImageNamed(avatar_idr).ToImageSkia();
281 } 365 }
366
367 // TODO(estade): all versions of this button should condense.
368 bool AvatarButton::IsCondensible() const {
369 #if defined(OS_WIN)
370 return (base::win::GetVersion() >= base::win::VERSION_WIN10) &&
371 ThemeServiceFactory::GetForProfile(profile_)->UsingSystemTheme() &&
372 button_style_ == AvatarButtonStyle::NATIVE;
373 #else
374 return false;
375 #endif
376 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698