Home | History | Annotate | Download | only in gtk
      1 // Copyright (c) 2011 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 CHROME_BROWSER_UI_GTK_HOVER_CONTROLLER_GTK_H_
      6 #define CHROME_BROWSER_UI_GTK_HOVER_CONTROLLER_GTK_H_
      7 
      8 #include <gtk/gtk.h>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "ui/base/animation/animation_delegate.h"
     12 #include "ui/base/animation/slide_animation.h"
     13 #include "ui/base/animation/throb_animation.h"
     14 #include "ui/base/gtk/gtk_signal.h"
     15 #include "ui/base/gtk/gtk_signal_registrar.h"
     16 
     17 // This class handles the "throbbing" of a GtkChromeButton. The visual effect
     18 // of throbbing is created by painting partially transparent hover effects. It
     19 // only works in non-gtk theme mode. This class mainly exists to glue an
     20 // AnimationDelegate (C++ class) to a GtkChromeButton* (GTK/c object).
     21 class HoverControllerGtk : public ui::AnimationDelegate {
     22  public:
     23   virtual ~HoverControllerGtk();
     24 
     25   GtkWidget* button() { return button_; }
     26 
     27   // Throb for |cycles| cycles. This will override the current remaining
     28   // number of cycles. Note that a "cycle" is (somewhat unintuitively) half of
     29   // a complete throb revolution.
     30   void StartThrobbing(int cycles);
     31 
     32   // Get the HoverControllerGtk for a given GtkChromeButton*. It is an error
     33   // to call this on a widget that is not a GtkChromeButton*.
     34   static HoverControllerGtk* GetHoverControllerGtk(GtkWidget* button);
     35 
     36   // Creates a GtkChromeButton and adds a HoverControllerGtk for it.
     37   static GtkWidget* CreateChromeButton();
     38 
     39   // Stop throbbing and delete |this|.
     40   void Destroy();
     41 
     42  private:
     43   explicit HoverControllerGtk(GtkWidget* button);
     44 
     45   // Overridden from ui::AnimationDelegate.
     46   virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
     47   virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE;
     48   virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE;
     49 
     50   CHROMEGTK_CALLBACK_1(HoverControllerGtk, gboolean, OnEnter,
     51                        GdkEventCrossing*);
     52   CHROMEGTK_CALLBACK_1(HoverControllerGtk, gboolean, OnLeave,
     53                        GdkEventCrossing*);
     54   CHROMEGTK_CALLBACK_1(HoverControllerGtk, void, OnHierarchyChanged,
     55                        GtkWidget*);
     56   CHROMEGTK_CALLBACK_0(HoverControllerGtk, void, OnDestroy);
     57 
     58   ui::ThrobAnimation throb_animation_;
     59   ui::SlideAnimation hover_animation_;
     60   GtkWidget* button_;
     61 
     62   ui::GtkSignalRegistrar signals_;
     63 
     64   DISALLOW_COPY_AND_ASSIGN(HoverControllerGtk);
     65 };
     66 
     67 #endif  // CHROME_BROWSER_UI_GTK_HOVER_CONTROLLER_GTK_H_
     68