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

Side by Side Diff: ui/views/controls/button/toggle_button.cc

Issue 2165413002: Add shadow for md toggle button. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "ui/views/controls/button/toggle_button.h" 5 #include "ui/views/controls/button/toggle_button.h"
6 6
7 #include "third_party/skia/include/core/SkDrawLooper.h"
8 #include "third_party/skia/include/core/SkPaint.h"
7 #include "ui/gfx/canvas.h" 9 #include "ui/gfx/canvas.h"
8 #include "ui/gfx/color_utils.h" 10 #include "ui/gfx/color_utils.h"
9 #include "ui/views/border.h" 11 #include "ui/views/border.h"
10 12
11 namespace views { 13 namespace views {
12 14
13 namespace { 15 namespace {
14 16
15 // Constants are measured in dip. 17 // Constants are measured in dip.
16 const int kTrackHeight = 14; 18 const int kTrackHeight = 14;
17 const int kTrackWidth = 36; 19 const int kTrackWidth = 36;
18 // Margins from edge of track to edge of view. 20 // Margins from edge of track to edge of view.
19 const int kTrackVerticalMargin = 4; 21 const int kTrackVerticalMargin = 6;
20 const int kTrackHorizontalMargin = 1; 22 const int kTrackHorizontalMargin = 2;
21 // Margin from edge of thumb to closest three edges of view. 23 // Margin from edge of thumb to closest edge of view. Note that the thumb
22 const int kThumbMargin = 1; 24 // margins must be sufficiently large to allow space for the shadow.
25 const int kThumbHorizontalMargin = 2;
26 // Margin from top/bottom edge of thumb to top/bottom edge of view.
27 const int kThumbVerticalMargin = 3;
23 28
24 } // namespace 29 } // namespace
25 30
26 ToggleButton::ToggleButton(ButtonListener* listener) 31 ToggleButton::ToggleButton(ButtonListener* listener)
27 : CustomButton(listener), is_on_(false), slide_animation_(this) { 32 : CustomButton(listener), is_on_(false), slide_animation_(this) {
28 slide_animation_.SetSlideDuration(80 /* ms */); 33 slide_animation_.SetSlideDuration(80 /* ms */);
29 slide_animation_.SetTweenType(gfx::Tween::LINEAR); 34 slide_animation_.SetTweenType(gfx::Tween::LINEAR);
30 SetBorder(Border::CreateEmptyBorder( 35 SetBorder(Border::CreateEmptyBorder(
31 gfx::Insets(kTrackVerticalMargin, kTrackHorizontalMargin))); 36 gfx::Insets(kTrackVerticalMargin, kTrackHorizontalMargin)));
32 } 37 }
(...skipping 17 matching lines...) Expand all
50 gfx::Rect rect(0, 0, kTrackWidth, kTrackHeight); 55 gfx::Rect rect(0, 0, kTrackWidth, kTrackHeight);
51 if (border()) 56 if (border())
52 rect.Inset(-border()->GetInsets()); 57 rect.Inset(-border()->GetInsets());
53 return rect.size(); 58 return rect.size();
54 } 59 }
55 60
56 void ToggleButton::OnPaint(gfx::Canvas* canvas) { 61 void ToggleButton::OnPaint(gfx::Canvas* canvas) {
57 SkAlpha blend = 62 SkAlpha blend =
58 static_cast<SkAlpha>(SK_AlphaOPAQUE * slide_animation_.GetCurrentValue()); 63 static_cast<SkAlpha>(SK_AlphaOPAQUE * slide_animation_.GetCurrentValue());
59 64
65 // Track.
60 gfx::RectF track_rect(GetContentsBounds()); 66 gfx::RectF track_rect(GetContentsBounds());
61 SkPaint paint; 67 SkPaint track_paint;
62 paint.setAntiAlias(true); 68 track_paint.setAntiAlias(true);
63
64 // Track.
65 const SkColor track_on_color = 69 const SkColor track_on_color =
66 SkColorSetA(GetNativeTheme()->GetSystemColor( 70 SkColorSetA(GetNativeTheme()->GetSystemColor(
67 ui::NativeTheme::kColorId_CallToActionColor), 71 ui::NativeTheme::kColorId_CallToActionColor),
68 0xFF / 2); 72 0xFF / 2);
69 // TODO(estade): get this color from the theme. 73 // TODO(estade): get this color from the theme.
70 const SkColor track_off_color = SkColorSetA(SK_ColorBLACK, 0x61); 74 const SkColor track_off_color = SkColorSetA(SK_ColorBLACK, 0x61);
71 paint.setColor( 75 track_paint.setColor(
72 color_utils::AlphaBlend(track_on_color, track_off_color, blend)); 76 color_utils::AlphaBlend(track_on_color, track_off_color, blend));
73 canvas->DrawRoundRect(track_rect, track_rect.height() / 2, paint); 77 canvas->DrawRoundRect(track_rect, track_rect.height() / 2, track_paint);
74 78
75 // Thumb. 79 // Thumb.
76 const SkColor thumb_on_color = GetNativeTheme()->GetSystemColor(
77 ui::NativeTheme::kColorId_CallToActionColor);
78 // TODO(estade): get this color from the theme.
79 const SkColor thumb_off_color = SkColorSetRGB(0xFA, 0xFA, 0xFA);
80 paint.setColor(
81 color_utils::AlphaBlend(thumb_on_color, thumb_off_color, blend));
82 gfx::Rect thumb_bounds = GetLocalBounds(); 80 gfx::Rect thumb_bounds = GetLocalBounds();
83 thumb_bounds.Inset(gfx::Insets(kThumbMargin)); 81 thumb_bounds.Inset(gfx::Insets(kThumbVerticalMargin, kThumbHorizontalMargin));
84 thumb_bounds.set_x(thumb_bounds.x() + 82 thumb_bounds.set_x(thumb_bounds.x() +
85 slide_animation_.GetCurrentValue() * 83 slide_animation_.GetCurrentValue() *
86 (thumb_bounds.width() - thumb_bounds.height())); 84 (thumb_bounds.width() - thumb_bounds.height()));
87 thumb_bounds.set_width(thumb_bounds.height()); 85 thumb_bounds.set_width(thumb_bounds.height());
88 thumb_bounds.set_x(GetMirroredXForRect(thumb_bounds)); 86 thumb_bounds.set_x(GetMirroredXForRect(thumb_bounds));
87 SkPaint thumb_paint;
88 std::vector<gfx::ShadowValue> shadows;
89 shadows.emplace(shadows.end(), gfx::Vector2d(0, 1), 5.f,
sadrul 2016/07/22 03:35:05 emplace_back instead?
Evan Stade 2016/07/22 14:03:28 done, thanks
90 SkColorSetA(SK_ColorBLACK, 0x99));
91 thumb_paint.setLooper(gfx::CreateShadowDrawLooperCorrectBlur(shadows));
92 thumb_paint.setStyle(SkPaint::kStrokeAndFill_Style);
93 thumb_paint.setAntiAlias(true);
94 const SkColor thumb_on_color = GetNativeTheme()->GetSystemColor(
95 ui::NativeTheme::kColorId_CallToActionColor);
96 // TODO(estade): get this color from the theme.
97 const SkColor thumb_off_color = SkColorSetRGB(0xFA, 0xFA, 0xFA);
98 thumb_paint.setColor(
99 color_utils::AlphaBlend(thumb_on_color, thumb_off_color, blend));
89 canvas->DrawCircle(gfx::RectF(thumb_bounds).CenterPoint(), 100 canvas->DrawCircle(gfx::RectF(thumb_bounds).CenterPoint(),
90 thumb_bounds.height() / 2.f, paint); 101 thumb_bounds.height() / 2.f, thumb_paint);
91 // TODO(estade): add a shadow to the thumb.
92 } 102 }
93 103
94 void ToggleButton::NotifyClick(const ui::Event& event) { 104 void ToggleButton::NotifyClick(const ui::Event& event) {
95 SetIsOn(!is_on(), true); 105 SetIsOn(!is_on(), true);
96 CustomButton::NotifyClick(event); 106 CustomButton::NotifyClick(event);
97 } 107 }
98 108
99 void ToggleButton::OnNativeThemeChanged(const ui::NativeTheme* theme) { 109 void ToggleButton::OnNativeThemeChanged(const ui::NativeTheme* theme) {
100 SchedulePaint(); 110 SchedulePaint();
101 } 111 }
102 112
103 void ToggleButton::AnimationProgressed(const gfx::Animation* animation) { 113 void ToggleButton::AnimationProgressed(const gfx::Animation* animation) {
104 if (animation == &slide_animation_) 114 if (animation == &slide_animation_)
105 SchedulePaint(); 115 SchedulePaint();
106 else 116 else
107 CustomButton::AnimationProgressed(animation); 117 CustomButton::AnimationProgressed(animation);
108 } 118 }
109 119
110 } // namespace views 120 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698