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

Unified Diff: chrome/browser/ui/views/profiles/new_avatar_button.cc

Issue 2832223003: Update profile switcher button on Linux. (Closed)
Patch Set: self review Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/profiles/new_avatar_button.cc
diff --git a/chrome/browser/ui/views/profiles/new_avatar_button.cc b/chrome/browser/ui/views/profiles/new_avatar_button.cc
index 795ca239a216e99c1280e4eaff0747fdef293a11..24893dcdabb8d0b626dbd04169318a2be69b08a7 100644
--- a/chrome/browser/ui/views/profiles/new_avatar_button.cc
+++ b/chrome/browser/ui/views/profiles/new_avatar_button.cc
@@ -12,16 +12,19 @@
#include "chrome/browser/profiles/profile_attributes_entry.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profiles_state.h"
+#include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/ui/views/profiles/avatar_button_delegate.h"
#include "chrome/browser/ui/views/profiles/profile_chooser_view.h"
#include "chrome/grit/theme_resources.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "ui/base/resource/resource_bundle.h"
+#include "ui/base/theme_provider.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/vector_icons/vector_icons.h"
+#include "ui/views/animation/ink_drop_mask.h"
#include "ui/views/border.h"
#include "ui/views/controls/button/label_button_border.h"
#include "ui/views/painter.h"
@@ -32,6 +35,65 @@
namespace {
+// Insets between view bounds and the filled region for
+// AvatarButtonThemedBorder.
+static constexpr gfx::InsetsF kFillInsets(1);
+
+// Corner radius of the roundrect for AvatarButtonThemedBorder.
+static constexpr float kCornerRadius = 1;
+
+// This class draws the border (and background) of the avatar button for
+// "themed" browser windows, i.e. OpaqueBrowserFrameView. Currently it's only
+// used on Linux as the shape specifically matches the Linux caption buttons.
+// TODO(estade): make this look nice on Windows and use it there as well.
+class AvatarButtonThemedBorder : public views::Border {
+ public:
+ AvatarButtonThemedBorder() {}
+ ~AvatarButtonThemedBorder() override {}
+
+ void Paint(const views::View& view, gfx::Canvas* canvas) override {
+ gfx::RectF fill_bounds(view.GetLocalBounds());
+ fill_bounds.Inset(kFillInsets);
+ cc::PaintFlags fill_flags;
+ fill_flags.setStyle(cc::PaintFlags::kFill_Style);
+ fill_flags.setColor(view.GetThemeProvider()->GetColor(
+ ThemeProperties::COLOR_BUTTON_BACKGROUND));
+ fill_flags.setAntiAlias(true);
+ canvas->DrawRoundRect(fill_bounds, kCornerRadius, fill_flags);
+
+ // Start with an outer dark stroke.
+ cc::PaintFlags stroke_flags;
+ stroke_flags.setStyle(cc::PaintFlags::kStroke_Style);
+ stroke_flags.setColor(SkColorSetA(SK_ColorBLACK, 0x2B));
+ stroke_flags.setStrokeWidth(1);
+ stroke_flags.setAntiAlias(true);
+ gfx::RectF stroke_bounds(view.GetLocalBounds());
+ stroke_bounds.Inset(gfx::InsetsF(0.5f));
+ canvas->DrawRoundRect(stroke_bounds, kCornerRadius, stroke_flags);
+
+ // There's a second, light stroke that matches the fill bounds.
Peter Kasting 2017/04/27 02:13:18 I'm a little worried about the radii of the corner
+ stroke_bounds.Inset(kFillInsets);
+ stroke_flags.setColor(SkColorSetA(SK_ColorWHITE, 0x3F));
+ canvas->DrawRoundRect(stroke_bounds, kCornerRadius, stroke_flags);
+ }
+
+ gfx::Insets GetInsets() const override {
+ const int kLeftRightInset = 8;
+ const int kTopInset = 2;
+ const int kBottomInset = 4;
+ return gfx::Insets(kTopInset, kLeftRightInset, kBottomInset,
+ kLeftRightInset);
+ }
+
+ gfx::Size GetMinimumSize() const override {
+ return gfx::Size(GetInsets().width(), GetInsets().height());
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(AvatarButtonThemedBorder);
+};
+
+#if !defined(OS_LINUX)
std::unique_ptr<views::Border> CreateBorder(const int normal_image_set[],
const int hot_image_set[],
const int pushed_image_set[]) {
@@ -52,6 +114,7 @@ std::unique_ptr<views::Border> CreateBorder(const int normal_image_set[],
return std::move(border);
}
+#endif
} // namespace
@@ -78,14 +141,21 @@ NewAvatarButton::NewAvatarButton(AvatarButtonDelegate* delegate,
label()->font_list().DeriveWithHeightUpperBound(kDisplayFontHeight));
ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
+ generic_avatar_ =
+ rb->GetImageNamed(IDR_AVATAR_THEMED_BUTTON_AVATAR).AsImageSkia();
+#if defined(OS_LINUX)
+ DCHECK_EQ(AvatarButtonStyle::THEMED, button_style);
+ SetBorder(base::MakeUnique<AvatarButtonThemedBorder>());
+ SetInkDropMode(InkDropMode::ON);
+#else // !defined(OS_LINUX)
if (button_style == AvatarButtonStyle::THEMED) {
+ SetBorder(base::MakeUnique<AvatarButtonThemedBorder>());
+ SetInkDropMode(InkDropMode::ON);
const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_NORMAL);
const int kHotImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_HOVER);
const int kPushedImageSet[] = IMAGE_GRID(IDR_AVATAR_THEMED_BUTTON_PRESSED);
SetBorder(CreateBorder(kNormalImageSet, kHotImageSet, kPushedImageSet));
- generic_avatar_ =
- *rb->GetImageNamed(IDR_AVATAR_THEMED_BUTTON_AVATAR).ToImageSkia();
#if defined(OS_WIN)
} else if (base::win::GetVersion() < base::win::VERSION_WIN8) {
const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_NORMAL);
@@ -105,6 +175,7 @@ NewAvatarButton::NewAvatarButton(AvatarButtonDelegate* delegate,
generic_avatar_ =
*rb->GetImageNamed(IDR_AVATAR_NATIVE_BUTTON_AVATAR).ToImageSkia();
}
+#endif // !defined(OS_LINUX)
g_browser_process->profile_manager()->
GetProfileAttributesStorage().AddObserver(this);
@@ -130,6 +201,25 @@ void NewAvatarButton::OnMouseReleased(const ui::MouseEvent& event) {
LabelButton::OnMouseReleased(event);
}
+SkColor NewAvatarButton::GetInkDropBaseColor() const {
+ return SK_ColorWHITE;
Evan Stade 2017/04/26 19:24:49 I stuck with white because the theme-colored backg
Peter Kasting 2017/04/27 02:13:18 Is the drop visible at all on a pure-white toolbar
+}
+
+std::unique_ptr<views::InkDropMask> NewAvatarButton::CreateInkDropMask() const {
+ return base::MakeUnique<views::RoundRectInkDropMask>(size(), kFillInsets,
+ kCornerRadius);
+}
+
+void NewAvatarButton::NotifyClick(const ui::Event& event) {
+ LabelButton::NotifyClick(event);
+
+ if (ProfileChooserView::IsShowing() && ink_drop_mode() == InkDropMode::ON) {
+ ProfileChooserView::GetCurrentBubbleWidget()->AddObserver(this);
+ AnimateInkDrop(views::InkDropState::ACTIVATED,
+ ui::LocatedEvent::FromIfValid(&event));
+ }
+}
+
void NewAvatarButton::OnGestureEvent(ui::GestureEvent* event) {
// TODO(wjmaclean): The check for ET_GESTURE_LONG_PRESS is done here since
// no other UI button based on CustomButton appears to handle mouse
@@ -171,6 +261,11 @@ void NewAvatarButton::OnProfileSupervisedUserIdChanged(
Update();
}
+void NewAvatarButton::OnWidgetClosing(views::Widget* widget) {
+ if (ink_drop_mode() == InkDropMode::ON)
+ AnimateInkDrop(views::InkDropState::DEACTIVATED, nullptr);
+}
+
void NewAvatarButton::Update() {
ProfileAttributesStorage& storage =
g_browser_process->profile_manager()->GetProfileAttributesStorage();

Powered by Google App Engine
This is Rietveld 408576698