1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_GFX_ANIMATION_SLIDE_ANIMATION_H_
6#define UI_GFX_ANIMATION_SLIDE_ANIMATION_H_
7
8#include "ui/gfx/animation/linear_animation.h"
9#include "ui/gfx/animation/tween.h"
10
11namespace gfx {
12
13// Slide Animation
14//
15// Used for reversible animations and as a general helper class. Typical usage:
16//
17// #include "ui/gfx/animation/slide_animation.h"
18//
19// class MyClass : public AnimationDelegate {
20//  public:
21//   MyClass() {
22//     animation_.reset(new SlideAnimation(this));
23//     animation_->SetSlideDuration(500);
24//   }
25//   void OnMouseOver() {
26//     animation_->Show();
27//   }
28//   void OnMouseOut() {
29//     animation_->Hide();
30//   }
31//   void AnimationProgressed(const Animation* animation) {
32//     if (animation == animation_.get()) {
33//       Layout();
34//       SchedulePaint();
35//     } else if (animation == other_animation_.get()) {
36//       ...
37//     }
38//   }
39//   void Layout() {
40//     if (animation_->is_animating()) {
41//       hover_image_.SetOpacity(animation_->GetCurrentValue());
42//     }
43//   }
44//  private:
45//   scoped_ptr<SlideAnimation> animation_;
46// }
47class GFX_EXPORT SlideAnimation : public LinearAnimation {
48 public:
49  explicit SlideAnimation(AnimationDelegate* target);
50  virtual ~SlideAnimation();
51
52  // Set the animation back to the 0 state.
53  virtual void Reset();
54  virtual void Reset(double value);
55
56  // Begin a showing animation or reverse a hiding animation in progress.
57  virtual void Show();
58
59  // Begin a hiding animation or reverse a showing animation in progress.
60  virtual void Hide();
61
62  // Sets the time a slide will take. Note that this isn't actually
63  // the amount of time an animation will take as the current value of
64  // the slide is considered.
65  virtual void SetSlideDuration(int duration);
66  int GetSlideDuration() const { return slide_duration_; }
67  void SetTweenType(Tween::Type tween_type) { tween_type_ = tween_type; }
68
69  virtual double GetCurrentValue() const OVERRIDE;
70  bool IsShowing() const { return showing_; }
71  bool IsClosing() const { return !showing_ && value_end_ < value_current_; }
72
73  class TestApi;
74
75 private:
76  // Overridden from Animation.
77  virtual void AnimateToState(double state) OVERRIDE;
78
79  AnimationDelegate* target_;
80
81  Tween::Type tween_type_;
82
83  // Used to determine which way the animation is going.
84  bool showing_;
85
86  // Animation values. These are a layer on top of Animation::state_ to
87  // provide the reversability.
88  double value_start_;
89  double value_end_;
90  double value_current_;
91
92  // How long a hover in/out animation will last for. This defaults to
93  // kHoverFadeDurationMS, but can be overridden with SetDuration.
94  int slide_duration_;
95
96  DISALLOW_COPY_AND_ASSIGN(SlideAnimation);
97};
98
99}  // namespace gfx
100
101#endif  // UI_GFX_ANIMATION_SLIDE_ANIMATION_H_
102