Clean up Throbber.
[chromium-blink-merge.git] / ui / views / controls / throbber.h
bloba136a7d02e16b1487bffe902fb02b55a4578482d
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.
5 #ifndef UI_VIEWS_CONTROLS_THROBBER_H_
6 #define UI_VIEWS_CONTROLS_THROBBER_H_
8 #include "base/basictypes.h"
9 #include "base/compiler_specific.h"
10 #include "base/time/time.h"
11 #include "base/timer/timer.h"
12 #include "ui/views/view.h"
14 namespace gfx {
15 class ImageSkia;
18 namespace views {
20 // Throbbers display an animation, usually used as a status indicator.
22 class VIEWS_EXPORT Throbber : public View {
23 public:
24 // |frame_time_ms| is the amount of time that should elapse between frames
25 // (in milliseconds)
26 // If |paint_while_stopped| is false, this view will be invisible when not
27 // running.
28 Throbber(int frame_time_ms, bool paint_while_stopped);
29 Throbber(int frame_time_ms, bool paint_while_stopped, gfx::ImageSkia* frames);
30 ~Throbber() override;
32 // Start and stop the throbber animation
33 virtual void Start();
34 virtual void Stop();
36 // Set custom throbber frames. Otherwise IDR_THROBBER is loaded.
37 void SetFrames(const gfx::ImageSkia* frames);
39 // Overridden from View:
40 gfx::Size GetPreferredSize() const override;
41 void OnPaint(gfx::Canvas* canvas) override;
43 protected:
44 // Specifies whether the throbber is currently animating or not
45 bool IsRunning() const;
46 base::TimeTicks start_time() const { return start_time_; }
48 private:
49 bool paint_while_stopped_;
50 int frame_count_; // How many frames we have.
51 base::TimeTicks start_time_; // Time when Start was called.
52 const gfx::ImageSkia* frames_; // Frames images.
53 base::TimeDelta frame_time_; // How long one frame is displayed.
54 base::RepeatingTimer<Throbber> timer_; // Used to schedule Run calls.
56 DISALLOW_COPY_AND_ASSIGN(Throbber);
59 // A SmoothedThrobber is a throbber that is representing potentially short
60 // and nonoverlapping bursts of work. SmoothedThrobber ignores small
61 // pauses in the work stops and starts, and only starts its throbber after
62 // a small amount of work time has passed.
63 class VIEWS_EXPORT SmoothedThrobber : public Throbber {
64 public:
65 explicit SmoothedThrobber(int frame_delay_ms);
66 SmoothedThrobber(int frame_delay_ms, gfx::ImageSkia* frames);
67 ~SmoothedThrobber() override;
69 void Start() override;
70 void Stop() override;
72 void set_start_delay_ms(int value) { start_delay_ms_ = value; }
73 void set_stop_delay_ms(int value) { stop_delay_ms_ = value; }
75 private:
76 // Called when the startup-delay timer fires
77 // This function starts the actual throbbing.
78 void StartDelayOver();
80 // Called when the shutdown-delay timer fires.
81 // This function stops the actual throbbing.
82 void StopDelayOver();
84 // Delay after work starts before starting throbber, in milliseconds.
85 int start_delay_ms_;
87 // Delay after work stops before stopping, in milliseconds.
88 int stop_delay_ms_;
90 base::OneShotTimer<SmoothedThrobber> start_timer_;
91 base::OneShotTimer<SmoothedThrobber> stop_timer_;
93 DISALLOW_COPY_AND_ASSIGN(SmoothedThrobber);
96 // A throbber that follows material design guidelines. This is a specialization
97 // of Throbber for now, but should probably be folded into/replace Throbber
98 // eventually.
99 class VIEWS_EXPORT MaterialThrobber : public Throbber {
100 public:
101 MaterialThrobber();
102 ~MaterialThrobber() override;
104 // Stop spinning and, if checked is true, display a checkmark.
105 void SetChecked(bool checked);
107 void set_preferred_diameter(int diameter) { preferred_diameter_ = diameter; }
109 // View implementation.
110 gfx::Size GetPreferredSize() const override;
111 int GetHeightForWidth(int w) const override;
112 void OnPaint(gfx::Canvas* canvas) override;
114 private:
115 // The preferred width and height for this view. Zero indicates the size is
116 // set by the parent class (i.e. matches the size of the pre-material
117 // sprites).
118 int preferred_diameter_;
120 // Whether or not we should display a checkmark.
121 bool checked_;
123 // The checkmark image. Will be null until it's used (if ever).
124 const gfx::ImageSkia* checkmark_;
126 DISALLOW_COPY_AND_ASSIGN(MaterialThrobber);
129 } // namespace views
131 #endif // UI_VIEWS_CONTROLS_THROBBER_H_