Home | History | Annotate | Download | only in controls
      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_THROBBER_H_
      6 #define UI_VIEWS_CONTROLS_THROBBER_H_
      7 
      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"
     13 
     14 namespace gfx {
     15 class ImageSkia;
     16 }
     17 
     18 namespace views {
     19 
     20 // Throbbers display an animation, usually used as a status indicator.
     21 
     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   virtual ~Throbber();
     31 
     32   // Start and stop the throbber animation
     33   virtual void Start();
     34   virtual void Stop();
     35 
     36   // Set custom throbber frames. Otherwise IDR_THROBBER is loaded.
     37   void SetFrames(const gfx::ImageSkia* frames);
     38 
     39   // Overridden from View:
     40   virtual gfx::Size GetPreferredSize() OVERRIDE;
     41   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
     42 
     43  protected:
     44   // Specifies whether the throbber is currently animating or not
     45   bool running_;
     46 
     47  private:
     48   void Run();
     49 
     50   bool paint_while_stopped_;
     51   int frame_count_;  // How many frames we have.
     52   base::Time start_time_;  // Time when Start was called.
     53   const gfx::ImageSkia* frames_;  // Frames images.
     54   base::TimeDelta frame_time_;  // How long one frame is displayed.
     55   base::RepeatingTimer<Throbber> timer_;  // Used to schedule Run calls.
     56 
     57   DISALLOW_COPY_AND_ASSIGN(Throbber);
     58 };
     59 
     60 // A SmoothedThrobber is a throbber that is representing potentially short
     61 // and nonoverlapping bursts of work.  SmoothedThrobber ignores small
     62 // pauses in the work stops and starts, and only starts its throbber after
     63 // a small amount of work time has passed.
     64 class VIEWS_EXPORT SmoothedThrobber : public Throbber {
     65  public:
     66   explicit SmoothedThrobber(int frame_delay_ms);
     67   SmoothedThrobber(int frame_delay_ms, gfx::ImageSkia* frames);
     68   virtual ~SmoothedThrobber();
     69 
     70   virtual void Start() OVERRIDE;
     71   virtual void Stop() OVERRIDE;
     72 
     73   void set_start_delay_ms(int value) { start_delay_ms_ = value; }
     74   void set_stop_delay_ms(int value) { stop_delay_ms_ = value; }
     75 
     76  private:
     77   // Called when the startup-delay timer fires
     78   // This function starts the actual throbbing.
     79   void StartDelayOver();
     80 
     81   // Called when the shutdown-delay timer fires.
     82   // This function stops the actual throbbing.
     83   void StopDelayOver();
     84 
     85   // Delay after work starts before starting throbber, in milliseconds.
     86   int start_delay_ms_;
     87 
     88   // Delay after work stops before stopping, in milliseconds.
     89   int stop_delay_ms_;
     90 
     91   base::OneShotTimer<SmoothedThrobber> start_timer_;
     92   base::OneShotTimer<SmoothedThrobber> stop_timer_;
     93 
     94   DISALLOW_COPY_AND_ASSIGN(SmoothedThrobber);
     95 };
     96 
     97 // A CheckmarkThrobber is a special variant of throbber that has three states:
     98 //   1. not yet completed (which paints nothing)
     99 //   2. working (which paints the throbber animation)
    100 //   3. completed (which paints a checkmark)
    101 //
    102 class VIEWS_EXPORT CheckmarkThrobber : public Throbber {
    103  public:
    104   CheckmarkThrobber();
    105 
    106   // If checked is true, the throbber stops spinning and displays a checkmark.
    107   // If checked is false, the throbber stops spinning and displays nothing.
    108   void SetChecked(bool checked);
    109 
    110   // Overridden from Throbber:
    111   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
    112 
    113  private:
    114   static const int kFrameTimeMs = 30;
    115 
    116   // Whether or not we should display a checkmark.
    117   bool checked_;
    118 
    119   // The checkmark image.
    120   const gfx::ImageSkia* checkmark_;
    121 
    122   DISALLOW_COPY_AND_ASSIGN(CheckmarkThrobber);
    123 };
    124 
    125 }  // namespace views
    126 
    127 #endif  // UI_VIEWS_CONTROLS_THROBBER_H_
    128