1 // Copyright 2014 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_VIEWS_TABS_MEDIA_INDICATOR_BUTTON_H_ 6 #define CHROME_BROWSER_UI_VIEWS_TABS_MEDIA_INDICATOR_BUTTON_H_ 7 8 #include "base/memory/scoped_ptr.h" 9 #include "chrome/browser/ui/tabs/tab_utils.h" 10 #include "ui/views/controls/button/image_button.h" 11 #include "ui/views/view_targeter_delegate.h" 12 13 namespace gfx { 14 class Animation; 15 class AnimationDelegate; 16 } 17 18 // This is an ImageButton subclass that serves as both the media indicator icon 19 // (audio, tab capture, etc.), and as a mute button. It is meant to only be 20 // used as a child view of Tab. 21 // 22 // When the indicator is transitioned to the audio playing or muting state, the 23 // button functionality is enabled and begins handling mouse events. Otherwise, 24 // this view behaves like an image and all mouse events will be handled by the 25 // Tab (its parent View). 26 class MediaIndicatorButton : public views::ImageButton, 27 public views::ViewTargeterDelegate { 28 public: 29 // The MediaIndicatorButton's class name. 30 static const char kViewClassName[]; 31 32 MediaIndicatorButton(); 33 virtual ~MediaIndicatorButton(); 34 35 // Returns the current TabMediaState except, while the indicator image is 36 // fading out, returns the prior TabMediaState. showing_media_state()37 TabMediaState showing_media_state() const { 38 return showing_media_state_; 39 } 40 41 // Updates ImageButton images, starts fade animations, and 42 // activates/deactivates button functionality as appropriate. 43 void TransitionToMediaState(TabMediaState next_state); 44 45 protected: 46 // views::View: 47 virtual const char* GetClassName() const OVERRIDE; 48 virtual View* GetTooltipHandlerForPoint(const gfx::Point& point) OVERRIDE; 49 virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; 50 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 51 52 // views::ViewTargeterDelegate 53 virtual bool DoesIntersectRect(const View* target, 54 const gfx::Rect& rect) const OVERRIDE; 55 56 // views::Button: 57 virtual void NotifyClick(const ui::Event& event) OVERRIDE; 58 59 private: 60 class FadeAnimationDelegate; 61 62 TabMediaState media_state_; 63 64 // Media indicator fade-in/out animation (i.e., only on show/hide, not a 65 // continuous animation). 66 scoped_ptr<gfx::AnimationDelegate> fade_animation_delegate_; 67 scoped_ptr<gfx::Animation> fade_animation_; 68 TabMediaState showing_media_state_; 69 70 DISALLOW_COPY_AND_ASSIGN(MediaIndicatorButton); 71 }; 72 73 #endif // CHROME_BROWSER_UI_VIEWS_TABS_MEDIA_INDICATOR_BUTTON_H_ 74