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