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

Side by Side Diff: chrome/browser/ui/views/avatar_menu_bubble_view.cc

Issue 8709001: Views: Custom drawing for GAIA avatar pictures (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/avatar_menu_bubble_view.h" 5 #include "chrome/browser/ui/views/avatar_menu_bubble_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/profiles/avatar_menu_model.h" 11 #include "chrome/browser/profiles/avatar_menu_model.h"
12 #include "chrome/browser/profiles/profile_info_cache.h" 12 #include "chrome/browser/profiles/profile_info_cache.h"
13 #include "chrome/browser/profiles/profile_info_util.h"
13 #include "chrome/browser/profiles/profile_manager.h" 14 #include "chrome/browser/profiles/profile_manager.h"
14 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
15 #include "grit/generated_resources.h" 16 #include "grit/generated_resources.h"
16 #include "grit/theme_resources.h" 17 #include "grit/theme_resources.h"
17 #include "ui/base/l10n/l10n_util.h" 18 #include "ui/base/l10n/l10n_util.h"
18 #include "ui/base/resource/resource_bundle.h" 19 #include "ui/base/resource/resource_bundle.h"
19 #include "ui/gfx/canvas.h" 20 #include "ui/gfx/canvas.h"
20 #include "ui/gfx/canvas_skia.h" 21 #include "ui/gfx/canvas_skia.h"
21 #include "ui/gfx/font.h" 22 #include "ui/gfx/font.h"
22 #include "ui/gfx/image/image.h" 23 #include "ui/gfx/image/image.h"
23 #include "views/controls/button/custom_button.h" 24 #include "views/controls/button/custom_button.h"
24 #include "views/controls/button/image_button.h" 25 #include "views/controls/button/image_button.h"
25 #include "views/controls/image_view.h" 26 #include "views/controls/image_view.h"
26 #include "views/controls/label.h" 27 #include "views/controls/label.h"
27 #include "views/controls/link.h" 28 #include "views/controls/link.h"
28 #include "views/controls/separator.h" 29 #include "views/controls/separator.h"
29 30
30 namespace { 31 namespace {
31 32
32 // TODO(msw): Get color from theme/window color. 33 // TODO(msw): Get color from theme/window color.
33 const SkColor kColor = SK_ColorWHITE; 34 const SkColor kColor = SK_ColorWHITE;
34 35
35 const int kItemHeight = 44; 36 const int kItemHeight = 44;
36 const int kItemMarginY = 4; 37 const int kItemMarginY = 4;
37 const int kIconWidth = 38;
38 const int kIconMarginX = 6; 38 const int kIconMarginX = 6;
39 const int kSeparatorPaddingY = 5; 39 const int kSeparatorPaddingY = 5;
40 40
41 inline int Round(double x) { 41 inline int Round(double x) {
42 return static_cast<int>(x + 0.5); 42 return static_cast<int>(x + 0.5);
43 } 43 }
44 44
45 gfx::Rect GetCenteredAndScaledRect(int src_width, int src_height, 45 gfx::Rect GetCenteredAndScaledRect(int src_width, int src_height,
46 int dst_x, int dst_y, 46 int dst_x, int dst_y,
47 int dst_width, int dst_height) { 47 int dst_width, int dst_height) {
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 edit_link_->SetHasFocusBorder(true); 219 edit_link_->SetHasFocusBorder(true);
220 AddChildView(edit_link_); 220 AddChildView(edit_link_);
221 221
222 OnHighlightStateChanged(); 222 OnHighlightStateChanged();
223 } 223 }
224 224
225 gfx::Size ProfileItemView::GetPreferredSize() { 225 gfx::Size ProfileItemView::GetPreferredSize() {
226 int width = std::max(name_label_->GetPreferredSize().width(), 226 int width = std::max(name_label_->GetPreferredSize().width(),
227 sync_state_label_->GetPreferredSize().width()); 227 sync_state_label_->GetPreferredSize().width());
228 width = std::max(edit_link_->GetPreferredSize().width(), width); 228 width = std::max(edit_link_->GetPreferredSize().width(), width);
229 return gfx::Size(kIconWidth + kIconMarginX + width, kItemHeight); 229 return gfx::Size(profiles::kAvatarIconWidth + kIconMarginX + width,
230 kItemHeight);
230 } 231 }
231 232
232 void ProfileItemView::Layout() { 233 void ProfileItemView::Layout() {
233 // Profile icon. 234 // Profile icon.
234 const SkBitmap& icon = image_view_->GetImage(); 235 gfx::Rect icon_rect;
235 gfx::Rect icon_rect = GetCenteredAndScaledRect( 236 if (item_.active) {
236 icon.width(), icon.height(), 0, 0, kIconWidth, height()); 237 // If this is the active item then the icon is already scaled and so
sail 2011/11/26 06:59:04 This old code had a bug in it. It assumed that the
238 // just use the preferred size.
239 icon_rect.set_size(image_view_->GetPreferredSize());
240 icon_rect.set_y((height() - icon_rect.height()) / 2);
241 } else {
242 const SkBitmap& icon = image_view_->GetImage();
243 icon_rect = GetCenteredAndScaledRect(icon.width(), icon.height(), 0, 0,
244 profiles::kAvatarIconWidth, height());
245 }
237 image_view_->SetBoundsRect(icon_rect); 246 image_view_->SetBoundsRect(icon_rect);
238 247
239 int label_x = icon_rect.right() + kIconMarginX; 248 int label_x = profiles::kAvatarIconWidth + kIconMarginX;
240 int max_label_width = std::max(width() - label_x, 0); 249 int max_label_width = std::max(width() - label_x, 0);
241 gfx::Size name_size = name_label_->GetPreferredSize(); 250 gfx::Size name_size = name_label_->GetPreferredSize();
242 name_size.set_width(std::min(name_size.width(), max_label_width)); 251 name_size.set_width(std::min(name_size.width(), max_label_width));
243 gfx::Size state_size = sync_state_label_->GetPreferredSize(); 252 gfx::Size state_size = sync_state_label_->GetPreferredSize();
244 state_size.set_width(std::min(state_size.width(), max_label_width)); 253 state_size.set_width(std::min(state_size.width(), max_label_width));
245 gfx::Size edit_size = edit_link_->GetPreferredSize(); 254 gfx::Size edit_size = edit_link_->GetPreferredSize();
246 edit_size.set_width(std::min(edit_size.width(), max_label_width)); 255 edit_size.set_width(std::min(edit_size.width(), max_label_width));
247 256
248 const int kNameStatePaddingY = 2; 257 const int kNameStatePaddingY = 2;
249 int labels_height = name_size.height() + kNameStatePaddingY + 258 int labels_height = name_size.height() + kNameStatePaddingY +
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 } 299 }
291 300
292 void ProfileItemView::OnFocusStateChanged(bool has_focus) { 301 void ProfileItemView::OnFocusStateChanged(bool has_focus) {
293 if (!has_focus && state() != views::CustomButton::BS_DISABLED) 302 if (!has_focus && state() != views::CustomButton::BS_DISABLED)
294 SetState(views::CustomButton::BS_NORMAL); 303 SetState(views::CustomButton::BS_NORMAL);
295 OnHighlightStateChanged(); 304 OnHighlightStateChanged();
296 } 305 }
297 306
298 // static 307 // static
299 SkBitmap ProfileItemView::GetBadgedIcon(const SkBitmap& icon) { 308 SkBitmap ProfileItemView::GetBadgedIcon(const SkBitmap& icon) {
300 gfx::Rect icon_rect = GetCenteredAndScaledRect( 309 gfx::Rect icon_rect = GetCenteredAndScaledRect(icon.width(), icon.height(),
301 icon.width(), icon.height(), 0, 0, kIconWidth, kItemHeight); 310 0, 0, profiles::kAvatarIconWidth, kItemHeight);
302 311
303 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 312 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
304 SkBitmap badge = rb.GetImageNamed(IDR_PROFILE_SELECTED); 313 SkBitmap badge = rb.GetImageNamed(IDR_PROFILE_SELECTED);
305 const float kBadgeOverlapRatioX = 1.0f / 5.0f; 314 const float kBadgeOverlapRatioX = 1.0f / 5.0f;
306 int width = icon_rect.width() + badge.width() * kBadgeOverlapRatioX; 315 int width = icon_rect.width() + badge.width() * kBadgeOverlapRatioX;
307 const float kBadgeOverlapRatioY = 1.0f / 3.0f; 316 const float kBadgeOverlapRatioY = 1.0f / 3.0f;
308 int height = icon_rect.height() + badge.height() * kBadgeOverlapRatioY; 317 int height = icon_rect.height() + badge.height() * kBadgeOverlapRatioY;
309 318
310 gfx::CanvasSkia canvas(width, height, false); 319 gfx::CanvasSkia canvas(width, height, false);
311 canvas.DrawBitmapInt(icon, 0, 0, icon.width(), icon.height(), 0, 0, 320 canvas.DrawBitmapInt(icon, 0, 0, icon.width(), icon.height(), 0, 0,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 gfx::Size size = item_views_[i]->GetPreferredSize(); 363 gfx::Size size = item_views_[i]->GetPreferredSize();
355 max_width = std::max(max_width, size.width()); 364 max_width = std::max(max_width, size.width());
356 total_height += size.height() + kItemMarginY; 365 total_height += size.height() + kItemMarginY;
357 } 366 }
358 367
359 total_height += kSeparatorPaddingY * 2 + 368 total_height += kSeparatorPaddingY * 2 +
360 separator_->GetPreferredSize().height(); 369 separator_->GetPreferredSize().height();
361 370
362 gfx::Size add_profile_size = add_profile_link_->GetPreferredSize(); 371 gfx::Size add_profile_size = add_profile_link_->GetPreferredSize();
363 max_width = std::max(max_width, 372 max_width = std::max(max_width,
364 add_profile_size.width() + kIconWidth + kIconMarginX); 373 add_profile_size.width() + profiles::kAvatarIconWidth + kIconMarginX);
365 total_height += add_profile_link_->GetPreferredSize().height(); 374 total_height += add_profile_link_->GetPreferredSize().height();
366 375
367 const int kBubbleViewMaxWidth = 800; 376 const int kBubbleViewMaxWidth = 800;
368 const int kBubbleViewMinWidth = 175; 377 const int kBubbleViewMinWidth = 175;
369 int total_width = std::min(std::max(max_width, kBubbleViewMinWidth), 378 int total_width = std::min(std::max(max_width, kBubbleViewMinWidth),
370 kBubbleViewMaxWidth); 379 kBubbleViewMaxWidth);
371 return gfx::Size(total_width, total_height); 380 return gfx::Size(total_width, total_height);
372 } 381 }
373 382
374 void AvatarMenuBubbleView::Layout() { 383 void AvatarMenuBubbleView::Layout() {
375 int y = 0; 384 int y = 0;
376 for (size_t i = 0; i < item_views_.size(); ++i) { 385 for (size_t i = 0; i < item_views_.size(); ++i) {
377 views::CustomButton* item_view = item_views_[i]; 386 views::CustomButton* item_view = item_views_[i];
378 int item_height = item_view->GetPreferredSize().height(); 387 int item_height = item_view->GetPreferredSize().height();
379 int item_width = width(); 388 int item_width = width();
380 item_view->SetBounds(0, y, item_width, item_height); 389 item_view->SetBounds(0, y, item_width, item_height);
381 y += item_height + kItemMarginY; 390 y += item_height + kItemMarginY;
382 } 391 }
383 392
384 y += kSeparatorPaddingY; 393 y += kSeparatorPaddingY;
385 int separator_height = separator_->GetPreferredSize().height(); 394 int separator_height = separator_->GetPreferredSize().height();
386 separator_->SetBounds(0, y, width(), separator_height); 395 separator_->SetBounds(0, y, width(), separator_height);
387 y += kSeparatorPaddingY + separator_height; 396 y += kSeparatorPaddingY + separator_height;
388 397
389 add_profile_link_->SetBounds(kIconWidth + kIconMarginX, y, width(), 398 add_profile_link_->SetBounds(profiles::kAvatarIconWidth + kIconMarginX, y,
390 add_profile_link_->GetPreferredSize().height()); 399 width(), add_profile_link_->GetPreferredSize().height());
391 } 400 }
392 401
393 bool AvatarMenuBubbleView::AcceleratorPressed( 402 bool AvatarMenuBubbleView::AcceleratorPressed(
394 const ui::Accelerator& accelerator) { 403 const ui::Accelerator& accelerator) {
395 if (accelerator.key_code() != ui::VKEY_DOWN && 404 if (accelerator.key_code() != ui::VKEY_DOWN &&
396 accelerator.key_code() != ui::VKEY_UP) { 405 accelerator.key_code() != ui::VKEY_UP) {
397 return false; 406 return false;
398 } 407 }
399 408
400 if (item_views_.empty()) 409 if (item_views_.empty())
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 489
481 add_profile_link_ = new views::Link( 490 add_profile_link_ = new views::Link(
482 l10n_util::GetStringUTF16(IDS_PROFILES_CREATE_NEW_PROFILE_LINK)); 491 l10n_util::GetStringUTF16(IDS_PROFILES_CREATE_NEW_PROFILE_LINK));
483 add_profile_link_->set_listener(this); 492 add_profile_link_->set_listener(this);
484 add_profile_link_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 493 add_profile_link_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
485 add_profile_link_->SetEnabledColor(SkColorSetRGB(0xe3, 0xed, 0xf6)); 494 add_profile_link_->SetEnabledColor(SkColorSetRGB(0xe3, 0xed, 0xf6));
486 AddChildView(add_profile_link_); 495 AddChildView(add_profile_link_);
487 496
488 PreferredSizeChanged(); 497 PreferredSizeChanged();
489 } 498 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ui/views/avatar_menu_button.h » ('j') | chrome/browser/ui/views/avatar_menu_button.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698