| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ui/message_center/views/notification_progress_bar.h" | |
| 6 | |
| 7 #include "third_party/skia/include/core/SkPaint.h" | |
| 8 #include "third_party/skia/include/core/SkPath.h" | |
| 9 #include "ui/gfx/canvas.h" | |
| 10 #include "ui/message_center/message_center_style.h" | |
| 11 | |
| 12 namespace { | |
| 13 | |
| 14 // Dimensions. | |
| 15 const int kProgressBarWidth = message_center::kNotificationWidth - | |
| 16 message_center::kTextLeftPadding - message_center::kTextRightPadding; | |
| 17 | |
| 18 const int kAnimationFrameRateHz = 60; | |
| 19 | |
| 20 const int kAnimationDuration = 2000; // In millisecond | |
| 21 | |
| 22 } // namespace | |
| 23 | |
| 24 namespace message_center { | |
| 25 | |
| 26 // NotificationProgressBarBase ///////////////////////////////////////////////// | |
| 27 | |
| 28 gfx::Size NotificationProgressBarBase::GetPreferredSize() const { | |
| 29 gfx::Size pref_size(kProgressBarWidth, message_center::kProgressBarThickness); | |
| 30 gfx::Insets insets = GetInsets(); | |
| 31 pref_size.Enlarge(insets.width(), insets.height()); | |
| 32 return pref_size; | |
| 33 } | |
| 34 | |
| 35 // NotificationProgressBar ///////////////////////////////////////////////////// | |
| 36 | |
| 37 NotificationProgressBar::NotificationProgressBar() { | |
| 38 } | |
| 39 | |
| 40 NotificationProgressBar::~NotificationProgressBar() { | |
| 41 } | |
| 42 | |
| 43 bool NotificationProgressBar::is_indeterminate() { | |
| 44 return false; | |
| 45 } | |
| 46 | |
| 47 void NotificationProgressBar::OnPaint(gfx::Canvas* canvas) { | |
| 48 gfx::Rect content_bounds = GetContentsBounds(); | |
| 49 | |
| 50 // Draw background. | |
| 51 SkPath background_path; | |
| 52 background_path.addRoundRect(gfx::RectToSkRect(content_bounds), | |
| 53 message_center::kProgressBarCornerRadius, | |
| 54 message_center::kProgressBarCornerRadius); | |
| 55 SkPaint background_paint; | |
| 56 background_paint.setStyle(SkPaint::kFill_Style); | |
| 57 background_paint.setFlags(SkPaint::kAntiAlias_Flag); | |
| 58 background_paint.setColor(message_center::kProgressBarBackgroundColor); | |
| 59 canvas->DrawPath(background_path, background_paint); | |
| 60 | |
| 61 // Draw slice. | |
| 62 SkPath slice_path; | |
| 63 const int slice_width = | |
| 64 static_cast<int>(content_bounds.width() * GetNormalizedValue() + 0.5); | |
| 65 if (slice_width < 1) | |
| 66 return; | |
| 67 | |
| 68 gfx::Rect slice_bounds = content_bounds; | |
| 69 slice_bounds.set_width(slice_width); | |
| 70 slice_path.addRoundRect(gfx::RectToSkRect(slice_bounds), | |
| 71 message_center::kProgressBarCornerRadius, | |
| 72 message_center::kProgressBarCornerRadius); | |
| 73 | |
| 74 SkPaint slice_paint; | |
| 75 slice_paint.setStyle(SkPaint::kFill_Style); | |
| 76 slice_paint.setFlags(SkPaint::kAntiAlias_Flag); | |
| 77 slice_paint.setColor(message_center::kProgressBarSliceColor); | |
| 78 canvas->DrawPath(slice_path, slice_paint); | |
| 79 } | |
| 80 | |
| 81 // NotificationIndeteminateProgressBar ///////////////////////////////////////// | |
| 82 | |
| 83 NotificationIndeterminateProgressBar::NotificationIndeterminateProgressBar() { | |
| 84 indeterminate_bar_animation_.reset( | |
| 85 new gfx::LinearAnimation(kAnimationFrameRateHz, this)); | |
| 86 indeterminate_bar_animation_->SetDuration(kAnimationDuration); | |
| 87 indeterminate_bar_animation_->Start(); | |
| 88 } | |
| 89 | |
| 90 NotificationIndeterminateProgressBar::~NotificationIndeterminateProgressBar() { | |
| 91 indeterminate_bar_animation_->Stop(); // Just in case | |
| 92 } | |
| 93 | |
| 94 bool NotificationIndeterminateProgressBar::is_indeterminate() { | |
| 95 return true; | |
| 96 } | |
| 97 | |
| 98 void NotificationIndeterminateProgressBar::OnPaint(gfx::Canvas* canvas) { | |
| 99 gfx::Rect content_bounds = GetContentsBounds(); | |
| 100 | |
| 101 // Draw background. | |
| 102 SkPath background_path; | |
| 103 background_path.addRoundRect(gfx::RectToSkRect(content_bounds), | |
| 104 message_center::kProgressBarCornerRadius, | |
| 105 message_center::kProgressBarCornerRadius); | |
| 106 SkPaint background_paint; | |
| 107 background_paint.setStyle(SkPaint::kFill_Style); | |
| 108 background_paint.setFlags(SkPaint::kAntiAlias_Flag); | |
| 109 background_paint.setColor(message_center::kProgressBarBackgroundColor); | |
| 110 canvas->DrawPath(background_path, background_paint); | |
| 111 | |
| 112 // Draw slice. | |
| 113 SkPath slice_path; | |
| 114 double time = indeterminate_bar_animation_->GetCurrentValue(); | |
| 115 | |
| 116 // The animation spec corresponds to the material design lite's parameter. | |
| 117 // (cf. https://github.com/google/material-design-lite/) | |
| 118 double bar1_left; | |
| 119 double bar1_width; | |
| 120 double bar2_left; | |
| 121 double bar2_width; | |
| 122 if (time < 0.50) { | |
| 123 bar1_left = time / 2; | |
| 124 bar1_width = time * 1.5; | |
| 125 bar2_left = 0; | |
| 126 bar2_width = 0; | |
| 127 } else if (time < 0.75) { | |
| 128 bar1_left = time * 3 - 1.25; | |
| 129 bar1_width = 0.75 - (time - 0.5) * 3; | |
| 130 bar2_left = 0; | |
| 131 bar2_width = time - 0.5; | |
| 132 } else { | |
| 133 bar1_left = 1; | |
| 134 bar1_width = 0; | |
| 135 bar2_left = (time - 0.75) * 4; | |
| 136 bar2_width = 0.25 - (time - 0.75); | |
| 137 } | |
| 138 | |
| 139 int bar1_x = static_cast<int>(content_bounds.width() * bar1_left); | |
| 140 int bar1_w = | |
| 141 std::min(static_cast<int>(content_bounds.width() * bar1_width + 0.5), | |
| 142 content_bounds.width() - bar1_x); | |
| 143 int bar2_x = static_cast<int>(content_bounds.width() * bar2_left); | |
| 144 int bar2_w = | |
| 145 std::min(static_cast<int>(content_bounds.width() * bar2_width + 0.5), | |
| 146 content_bounds.width() - bar2_x); | |
| 147 | |
| 148 | |
| 149 gfx::Rect slice_bounds = content_bounds; | |
| 150 slice_bounds.set_x(content_bounds.x() + bar1_x); | |
| 151 slice_bounds.set_width(bar1_w); | |
| 152 slice_path.addRoundRect(gfx::RectToSkRect(slice_bounds), | |
| 153 message_center::kProgressBarCornerRadius, | |
| 154 message_center::kProgressBarCornerRadius); | |
| 155 slice_bounds.set_x(content_bounds.x() + bar2_x); | |
| 156 slice_bounds.set_width(bar2_w); | |
| 157 slice_path.addRoundRect(gfx::RectToSkRect(slice_bounds), | |
| 158 message_center::kProgressBarCornerRadius, | |
| 159 message_center::kProgressBarCornerRadius); | |
| 160 | |
| 161 SkPaint slice_paint; | |
| 162 slice_paint.setStyle(SkPaint::kFill_Style); | |
| 163 slice_paint.setFlags(SkPaint::kAntiAlias_Flag); | |
| 164 slice_paint.setColor(message_center::kProgressBarSliceColor); | |
| 165 canvas->DrawPath(slice_path, slice_paint); | |
| 166 } | |
| 167 | |
| 168 void NotificationIndeterminateProgressBar::AnimationProgressed( | |
| 169 const gfx::Animation* animation) { | |
| 170 if (animation == indeterminate_bar_animation_.get()) { | |
| 171 DCHECK(indeterminate_bar_animation_); | |
| 172 SchedulePaint(); | |
| 173 } | |
| 174 } | |
| 175 | |
| 176 void NotificationIndeterminateProgressBar::AnimationEnded( | |
| 177 const gfx::Animation* animation) { | |
| 178 // Restarts animation. | |
| 179 if (animation == indeterminate_bar_animation_.get()) { | |
| 180 DCHECK(indeterminate_bar_animation_); | |
| 181 indeterminate_bar_animation_->Start(); | |
| 182 } | |
| 183 } | |
| 184 | |
| 185 } // namespace message_center | |
| OLD | NEW |