15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#ifndef UI_GFX_ANIMATION_MULTI_ANIMATION_H_ 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define UI_GFX_ANIMATION_MULTI_ANIMATION_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/animation.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/tween.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MultiAnimation is an animation that consists of a number of sub animations. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To create a MultiAnimation pass in the parts, invoke Start() and the delegate 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is notified as the animation progresses. By default MultiAnimation runs until 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stop is invoked, see |set_continuous()| for details. 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class GFX_EXPORT MultiAnimation : public Animation { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defines part of the animation. Each part consists of the following: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time_ms: the time of the part. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // start_time_ms: the amount of time to offset this part by when calculating 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the percented completed. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // end_time_ms: the end time used to calculate the percentange completed. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases |start_time_ms| = 0 and |end_time_ms| = |time_ms|. But you 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can adjust the start/end for different effects. For example, to run a part 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for 200ms with a % between .25 and .75 use the following three values: 200, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100, 400. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Part { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part() : time_ms(0), start_time_ms(0), end_time_ms(0), type(Tween::ZERO) {} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part(int time_ms, Tween::Type type) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : time_ms(time_ms), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_time_ms(0), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_time_ms(time_ms), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type(type) {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int time_ms; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_time_ms; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int end_time_ms; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::Type type; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<Part> Parts; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultiAnimation(const Parts& parts, base::TimeDelta timer_interval); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MultiAnimation(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default interval. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static base::TimeDelta GetDefaultTimerInterval(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets whether the animation continues after it reaches the end. If true, the 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // animation runs until explicitly stopped. The default is true. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_continuous(bool continuous) { continuous_ = continuous; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current value. The current value for a MultiAnimation is 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // determined from the tween type of the current part. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual double GetCurrentValue() const OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the index of the current part. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_part_index() const { return current_part_index_; } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Animation overrides. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Step(base::TimeTicks time_now) OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the part containing the specified time. |time_ms| is reset to be 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relative to the part containing the time and |part_index| the index of the 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // part. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Part& GetPart(int* time_ms, size_t* part_index); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parts that make up the animation. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Parts parts_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total time of all the parts. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int cycle_time_ms_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current value for the animation. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double current_value_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Index of the current part. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_part_index_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See description above setter. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool continuous_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MultiAnimation); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace gfx 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // UI_GFX_ANIMATION_MULTI_ANIMATION_H_ 97