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