blob: 28b7c6f0c809bd9d754fd778fdb9cb128d9de4d4 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#import "base/mac/scoped_nsobject.h"
#import "chrome/browser/ui/cocoa/themed_window.h"
#include "chrome/browser/ui/tabs/tab_utils.h"
#import "ui/base/cocoa/hover_button.h"
namespace gfx {
class Animation;
class AnimationDelegate;
} // namespace gfx
// This is an HoverButton subclass that serves as both the alert indicator icon
// (audio, tab capture, etc.), and as a mute button. It is meant to only be
// used as a subview of TabView.
// When the indicator is transitioned to the audio playing or muting state, the
// button functionality is enabled and begins handling mouse events. Otherwise,
// this view behaves like an image and all mouse events will be handled by the
// its superview.
// Note: Send the |-setClickTarget:withAction:| message instead of the
// |-setTarget:| and |-setAction:| messages to be notified of button clicks.
@interface AlertIndicatorButton : HoverButton <ThemedWindowDrawing> {
class FadeAnimationDelegate;
// Current TabAlertState. When animating fade-in/out, this reflects the
// indicator state at the end of the animation.
TabAlertState alertState_;
// Alert indicator fade-in/out animation (i.e., only on show/hide, not a
// continuous animation).
std::unique_ptr<gfx::AnimationDelegate> fadeAnimationDelegate_;
std::unique_ptr<gfx::Animation> fadeAnimation_;
TabAlertState showingAlertState_;
// Set to YES while the button is in the temporary dormant period after mute
// has been toggled.
BOOL isDormant_;
// Target and action invoked whenever a fade-in/out animation completes. This
// is used by TabController to layout the TabView after an indicator has
// completely faded out.
id animationDoneTarget_; // weak
SEL animationDoneAction_;
// The image to show when the mouse hovers over the button.
base::scoped_nsobject<NSImage> affordanceImage_;
// Target and action invoked whenever an enabled button is clicked.
id clickTarget_; // weak
SEL clickAction_;
@property(readonly, nonatomic) TabAlertState showingAlertState;
// Initialize a new AlertIndicatorButton in TabAlertState::NONE (i.e., a
// non-active indicator).
- (id)init;
// Updates button images, starts fade animations, and activates/deactivates
// button functionality as appropriate.
- (void)transitionToAlertState:(TabAlertState)nextState;
// Determines whether the AlertIndicatorButtonCocoa will be clickable for
// toggling muting. This should be called whenever the frame of this view is
// changed, and also whenever the active/inactive state of the tab has changed.
// Internally, |-transitionToAlertState:| will call this.
- (void)updateEnabledForMuteToggle;
// Register a message be sent to |target| whenever fade animations complete. A
// weak reference on |target| is held.
- (void)setAnimationDoneTarget:(id)target withAction:(SEL)action;
// Request a message be sent to |target| whenever the enabled button has been
// clicked. A weak reference on |target| is held.
- (void)setClickTarget:(id)target withAction:(SEL)action;
// ThemedWindowDrawing protocol support.
- (void)windowDidChangeTheme;
- (void)windowDidChangeActive;