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