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_VIEWS_ANIMATION_SCROLL_ANIMATOR_H_
6#define UI_VIEWS_ANIMATION_SCROLL_ANIMATOR_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "ui/gfx/animation/animation_delegate.h"
11#include "ui/views/views_export.h"
12
13namespace gfx {
14class SlideAnimation;
15}
16
17namespace views {
18
19class VIEWS_EXPORT ScrollDelegate {
20 public:
21  // Returns true if the content was actually scrolled, false otherwise.
22  virtual bool OnScroll(float dx, float dy) = 0;
23
24 protected:
25  ~ScrollDelegate() {}
26};
27
28class VIEWS_EXPORT ScrollAnimator : public gfx::AnimationDelegate {
29 public:
30  // The ScrollAnimator does not own the delegate. Uses default acceleration.
31  explicit ScrollAnimator(ScrollDelegate* delegate);
32  virtual ~ScrollAnimator();
33
34  // Use this if you would prefer different acceleration than the default.
35  void set_acceleration(float acceleration) { acceleration_ = acceleration; }
36
37  void Start(float velocity_x, float velocity_y);
38  void Stop();
39
40  bool is_scrolling() const { return !!animation_.get(); }
41
42 private:
43  // Implementation of gfx::AnimationDelegate.
44  virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
45  virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
46  virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE;
47
48  ScrollDelegate* delegate_;
49
50  float velocity_x_;
51  float velocity_y_;
52  float last_t_;
53  float duration_;
54  float acceleration_;
55
56  scoped_ptr<gfx::SlideAnimation> animation_;
57
58  DISALLOW_COPY_AND_ASSIGN(ScrollAnimator);
59};
60
61}  // namespace views
62
63#endif  // UI_VIEWS_ANIMATION_SCROLL_ANIMATOR_H_
64