• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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/gfx/animation/throb_animation.h"
6 
7 #include <limits>
8 
9 namespace gfx {
10 
11 static const int kDefaultThrobDurationMS = 400;
12 
ThrobAnimation(AnimationDelegate * target)13 ThrobAnimation::ThrobAnimation(AnimationDelegate* target)
14     : SlideAnimation(target),
15       slide_duration_(GetSlideDuration()),
16       throb_duration_(kDefaultThrobDurationMS),
17       cycles_remaining_(0),
18       throbbing_(false) {
19 }
20 
StartThrobbing(int cycles_til_stop)21 void ThrobAnimation::StartThrobbing(int cycles_til_stop) {
22   cycles_til_stop = cycles_til_stop >= 0 ? cycles_til_stop :
23                                            std::numeric_limits<int>::max();
24   cycles_remaining_ = cycles_til_stop;
25   throbbing_ = true;
26   SlideAnimation::SetSlideDuration(throb_duration_);
27   if (is_animating())
28     return;  // We're already running, we'll cycle when current loop finishes.
29 
30   if (IsShowing())
31     SlideAnimation::Hide();
32   else
33     SlideAnimation::Show();
34   cycles_remaining_ = cycles_til_stop;
35 }
36 
Reset()37 void ThrobAnimation::Reset() {
38   Reset(0);
39 }
40 
Reset(double value)41 void ThrobAnimation::Reset(double value) {
42   ResetForSlide();
43   SlideAnimation::Reset(value);
44 }
45 
Show()46 void ThrobAnimation::Show() {
47   ResetForSlide();
48   SlideAnimation::Show();
49 }
50 
Hide()51 void ThrobAnimation::Hide() {
52   ResetForSlide();
53   SlideAnimation::Hide();
54 }
55 
SetSlideDuration(int duration)56 void ThrobAnimation::SetSlideDuration(int duration) {
57   slide_duration_ = duration;
58 }
59 
Step(base::TimeTicks time_now)60 void ThrobAnimation::Step(base::TimeTicks time_now) {
61   LinearAnimation::Step(time_now);
62 
63   if (!is_animating() && throbbing_) {
64     // Were throbbing a finished a cycle. Start the next cycle unless we're at
65     // the end of the cycles, in which case we stop.
66     cycles_remaining_--;
67     if (IsShowing()) {
68       // We want to stop hidden, hence this doesn't check cycles_remaining_.
69       SlideAnimation::Hide();
70     } else if (cycles_remaining_ > 0) {
71       SlideAnimation::Show();
72     } else {
73       // We're done throbbing.
74       throbbing_ = false;
75     }
76   }
77 }
78 
ResetForSlide()79 void ThrobAnimation::ResetForSlide() {
80   SlideAnimation::SetSlideDuration(slide_duration_);
81   cycles_remaining_ = 0;
82   throbbing_ = false;
83 }
84 
85 }  // namespace gfx
86