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_CONTROLS_GLOW_HOVER_CONTROLLER_H_
6#define UI_VIEWS_CONTROLS_GLOW_HOVER_CONTROLLER_H_
7
8#include "ui/gfx/animation/animation_delegate.h"
9#include "ui/gfx/animation/slide_animation.h"
10#include "ui/views/views_export.h"
11
12namespace gfx {
13class Canvas;
14class ImageSkia;
15class Point;
16}
17
18namespace views {
19
20class View;
21
22// GlowHoverController is responsible for drawing a hover effect as is used by
23// the tabstrip. Typical usage:
24//   OnMouseEntered() -> invoke Show().
25//   OnMouseMoved()   -> invoke SetLocation().
26//   OnMouseExited()  -> invoke Hide().
27//   OnPaint()        -> if ShouldDraw() returns true invoke Draw().
28// Internally GlowHoverController uses an animation to animate the glow and
29// invokes SchedulePaint() back on the View as necessary.
30class VIEWS_EXPORT GlowHoverController : public gfx::AnimationDelegate {
31 public:
32  enum Style {
33    SUBTLE,
34    PRONOUNCED
35  };
36
37  explicit GlowHoverController(views::View* view);
38  virtual ~GlowHoverController();
39
40  // Sets the AnimationContainer used by the animation.
41  void SetAnimationContainer(gfx::AnimationContainer* container);
42
43  // Sets the location of the hover, relative to the View passed to the
44  // constructor.
45  void SetLocation(const gfx::Point& location);
46
47  // Initiates showing the hover.
48  void Show(Style style);
49
50  // Hides the hover.
51  void Hide();
52
53  // Hides the hover immediately.
54  void HideImmediately();
55
56  // Returns the value of the animation.
57  double GetAnimationValue() const;
58
59  // Returns true if there is something to be drawn. Use this instead of
60  // invoking Draw() if creating |mask_image| is expensive.
61  bool ShouldDraw() const;
62
63  // If the hover is currently visible it is drawn to the supplied canvas.
64  // |mask_image| is used to determine what parts of the canvas to draw on.
65  void Draw(gfx::Canvas* canvas, const gfx::ImageSkia& mask_image) const;
66
67  // gfx::AnimationDelegate overrides:
68  virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
69  virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
70
71 private:
72  // View we're drawing to.
73  views::View* view_;
74
75  // Opacity of the glow ramps up over time.
76  gfx::SlideAnimation animation_;
77
78  // Location of the glow, relative to view.
79  gfx::Point location_;
80  double opacity_scale_;
81
82  DISALLOW_COPY_AND_ASSIGN(GlowHoverController);
83};
84
85}  // namespace views
86
87#endif  // UI_VIEWS_CONTROLS_GLOW_HOVER_CONTROLLER_H_
88