Home | History | Annotate | Download | only in infobars
      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_INFOBARS_INFOBAR_ARROW_MODEL_H_
      6 #define CHROME_BROWSER_UI_GTK_INFOBARS_INFOBAR_ARROW_MODEL_H_
      7 #pragma once
      8 
      9 #include <gtk/gtk.h>
     10 
     11 #include "third_party/skia/include/core/SkPaint.h"
     12 #include "ui/base/animation/animation_delegate.h"
     13 #include "ui/base/animation/slide_animation.h"
     14 
     15 namespace gfx {
     16 class Rect;
     17 }
     18 
     19 class InfoBar;
     20 
     21 // A helper class that tracks the state of an infobar arrow and provides a
     22 // utility to draw it.
     23 class InfoBarArrowModel : public ui::AnimationDelegate {
     24  public:
     25   class Observer {
     26    public:
     27     // The arrow has changed states; relevant widgets need to be repainted.
     28     virtual void PaintStateChanged() = 0;
     29   };
     30 
     31   explicit InfoBarArrowModel(Observer* observer);
     32   virtual ~InfoBarArrowModel();
     33 
     34   // An infobar has been added or removed that will affect the state of this
     35   // arrow.
     36   void ShowArrowFor(InfoBar* bar, bool animate);
     37 
     38   // Returns true if the arrow is showing at all.
     39   bool NeedToDrawInfoBarArrow();
     40 
     41   // Paints the arrow on |widget|, in response to |expose|, in an area bounded
     42   // by |bounds|, drawing a border with |border_color|.
     43   void Paint(GtkWidget* widget,
     44              GdkEventExpose* expose,
     45              const gfx::Rect& bounds,
     46              const GdkColor& border_color);
     47 
     48   // Overridden from ui::AnimationDelegate.
     49   virtual void AnimationEnded(const ui::Animation* animation);
     50   virtual void AnimationProgressed(const ui::Animation* animation);
     51   virtual void AnimationCanceled(const ui::Animation* animation);
     52 
     53   // The size of the default arrow (its height; also half its width).
     54   static const size_t kDefaultArrowSize;
     55 
     56  private:
     57   // A pair of colors used to draw a gradient for an arrow.
     58   struct InfoBarColors {
     59     SkColor top;
     60     SkColor bottom;
     61   };
     62 
     63   // Calculates the currently showing arrow color, which is a blend of the new
     64   // arrow color and the old arrow color.
     65   InfoBarColors CurrentInfoBarColors();
     66 
     67   // The view that owns us.
     68   Observer* observer_;
     69 
     70   // An animation that tracks the progress of the transition from the last color
     71   // to the new color.
     72   ui::SlideAnimation animation_;
     73 
     74   // The color we are animating towards.
     75   InfoBarColors target_colors_;
     76   // The last color we showed (the one we are animating away from).
     77   InfoBarColors previous_colors_;
     78 
     79   DISALLOW_COPY_AND_ASSIGN(InfoBarArrowModel);
     80 };
     81 
     82 #endif  // CHROME_BROWSER_UI_GTK_INFOBARS_INFOBAR_ARROW_MODEL_H_
     83