1// Copyright 2013 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 CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_
6#define CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "cc/animation/scrollbar_animation_controller.h"
10#include "cc/base/cc_export.h"
11
12namespace cc {
13class LayerImpl;
14
15// Scrollbar animation that partially fades and thins after an idle delay,
16// and reacts to mouse movements.
17class CC_EXPORT ScrollbarAnimationControllerThinning
18    : public ScrollbarAnimationController {
19 public:
20  static scoped_ptr<ScrollbarAnimationControllerThinning> Create(
21      LayerImpl* scroll_layer,
22      ScrollbarAnimationControllerClient* client,
23      base::TimeDelta delay_before_starting,
24      base::TimeDelta duration);
25
26  virtual ~ScrollbarAnimationControllerThinning();
27
28  void set_mouse_move_distance_for_test(float distance) {
29    mouse_move_distance_to_trigger_animation_ = distance;
30  }
31  bool mouse_is_over_scrollbar() const { return mouse_is_over_scrollbar_; }
32  bool mouse_is_near_scrollbar() const { return mouse_is_near_scrollbar_; }
33
34  virtual void DidScrollUpdate() OVERRIDE;
35  virtual void DidMouseMoveOffScrollbar() OVERRIDE;
36  virtual void DidMouseMoveNear(float distance) OVERRIDE;
37
38 protected:
39  ScrollbarAnimationControllerThinning(
40      LayerImpl* scroll_layer,
41      ScrollbarAnimationControllerClient* client,
42      base::TimeDelta delay_before_starting,
43      base::TimeDelta duration);
44
45  virtual void RunAnimationFrame(float progress) OVERRIDE;
46
47 private:
48  // Describes whether the current animation should INCREASE (darken / thicken)
49  // a bar or DECREASE it (lighten / thin).
50  enum AnimationChange {
51    NONE,
52    INCREASE,
53    DECREASE
54  };
55  float OpacityAtAnimationProgress(float progress);
56  float ThumbThicknessScaleAtAnimationProgress(float progress);
57  float AdjustScale(float new_value,
58                    float current_value,
59                    AnimationChange animation_change);
60  void ApplyOpacityAndThumbThicknessScale(float opacity,
61                                          float thumb_thickness_scale);
62
63  LayerImpl* scroll_layer_;
64
65  bool mouse_is_over_scrollbar_;
66  bool mouse_is_near_scrollbar_;
67  // Are we narrowing or thickening the bars.
68  AnimationChange thickness_change_;
69  // Are we darkening or lightening the bars.
70  AnimationChange opacity_change_;
71  // How close should the mouse be to the scrollbar before we thicken it.
72  float mouse_move_distance_to_trigger_animation_;
73
74  DISALLOW_COPY_AND_ASSIGN(ScrollbarAnimationControllerThinning);
75};
76
77}  // namespace cc
78
79#endif  // CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_
80