summaryrefslogtreecommitdiffstats
path: root/ui/base/animation/multi_animation.h
diff options
context:
space:
mode:
Diffstat (limited to 'ui/base/animation/multi_animation.h')
-rw-r--r--ui/base/animation/multi_animation.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/ui/base/animation/multi_animation.h b/ui/base/animation/multi_animation.h
new file mode 100644
index 0000000..fbacde3
--- /dev/null
+++ b/ui/base/animation/multi_animation.h
@@ -0,0 +1,94 @@
+// 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_BASE_ANIMATION_MULTI_ANIMATION_H_
+#define UI_BASE_ANIMATION_MULTI_ANIMATION_H_
+#pragma once
+
+#include <vector>
+
+#include "ui/base/animation/animation.h"
+#include "ui/base/animation/tween.h"
+
+namespace ui {
+
+// 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 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;
+
+ explicit MultiAnimation(const Parts& parts);
+ virtual ~MultiAnimation();
+
+ // 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;
+
+ // 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);
+ virtual void SetStartTime(base::TimeTicks start_time);
+
+ 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 ui
+
+#endif // UI_BASE_ANIMATION_MULTI_ANIMATION_H_