throb_animation.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/throb_animation.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDefaultThrobDurationMS = 400;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ThrobAnimation::ThrobAnimation(AnimationDelegate* target)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : SlideAnimation(target),
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      slide_duration_(GetSlideDuration()),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throb_duration_(kDefaultThrobDurationMS),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cycles_remaining_(0),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throbbing_(false) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::StartThrobbing(int cycles_til_stop) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cycles_til_stop = cycles_til_stop >= 0 ? cycles_til_stop :
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           std::numeric_limits<int>::max();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cycles_remaining_ = cycles_til_stop;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  throbbing_ = true;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SlideAnimation::SetSlideDuration(throb_duration_);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_animating())
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // We're already running, we'll cycle when current loop finishes.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsShowing())
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SlideAnimation::Hide();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SlideAnimation::Show();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cycles_remaining_ = cycles_til_stop;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::Reset() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset(0);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::Reset(double value) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetForSlide();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SlideAnimation::Reset(value);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::Show() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetForSlide();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SlideAnimation::Show();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::Hide() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetForSlide();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SlideAnimation::Hide();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::SetSlideDuration(int duration) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  slide_duration_ = duration;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::Step(base::TimeTicks time_now) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LinearAnimation::Step(time_now);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_animating() && throbbing_) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Were throbbing a finished a cycle. Start the next cycle unless we're at
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the end of the cycles, in which case we stop.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cycles_remaining_--;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsShowing()) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We want to stop hidden, hence this doesn't check cycles_remaining_.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SlideAnimation::Hide();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (cycles_remaining_ > 0) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SlideAnimation::Show();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We're done throbbing.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throbbing_ = false;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrobAnimation::ResetForSlide() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SlideAnimation::SetSlideDuration(slide_duration_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cycles_remaining_ = 0;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  throbbing_ = false;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace gfx
86