// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_GFX_ANIMATION_MULTI_ANIMATION_H_ #define UI_GFX_ANIMATION_MULTI_ANIMATION_H_ #include <vector> #include "ui/gfx/animation/animation.h" #include "ui/gfx/animation/tween.h" namespace gfx { // MultiAnimation is an animation that consists of a number of sub animations. // To create a MultiAnimation pass in the parts, invoke Start() and the delegate // is notified as the animation progresses. By default MultiAnimation runs until // Stop is invoked, see |set_continuous()| for details. class GFX_EXPORT MultiAnimation : public Animation { public: // Defines part of the animation. Each part consists of the following: // // time_ms: the time of the part. // start_time_ms: the amount of time to offset this part by when calculating // the percented completed. // end_time_ms: the end time used to calculate the percentange completed. // // In most cases |start_time_ms| = 0 and |end_time_ms| = |time_ms|. But you // can adjust the start/end for different effects. For example, to run a part // for 200ms with a % between .25 and .75 use the following three values: 200, // 100, 400. struct Part { Part() : time_ms(0), start_time_ms(0), end_time_ms(0), type(Tween::ZERO) {} Part(int time_ms, Tween::Type type) : time_ms(time_ms), start_time_ms(0), end_time_ms(time_ms), type(type) {} int time_ms; int start_time_ms; int end_time_ms; Tween::Type type; }; typedef std::vector<Part> Parts; MultiAnimation(const Parts& parts, base::TimeDelta timer_interval); virtual ~MultiAnimation(); // Default interval. static base::TimeDelta GetDefaultTimerInterval(); // Sets whether the animation continues after it reaches the end. If true, the // animation runs until explicitly stopped. The default is true. void set_continuous(bool continuous) { continuous_ = continuous; } // Returns the current value. The current value for a MultiAnimation is // determined from the tween type of the current part. virtual double GetCurrentValue() const OVERRIDE; // Returns the index of the current part. size_t current_part_index() const { return current_part_index_; } protected: // Animation overrides. virtual void Step(base::TimeTicks time_now) OVERRIDE; virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE; private: // Returns the part containing the specified time. |time_ms| is reset to be // relative to the part containing the time and |part_index| the index of the // part. const Part& GetPart(int* time_ms, size_t* part_index); // The parts that make up the animation. const Parts parts_; // Total time of all the parts. const int cycle_time_ms_; // Current value for the animation. double current_value_; // Index of the current part. size_t current_part_index_; // See description above setter. bool continuous_; DISALLOW_COPY_AND_ASSIGN(MultiAnimation); }; } // namespace gfx #endif // UI_GFX_ANIMATION_MULTI_ANIMATION_H_