| Index: chrome/browser/ui/cocoa/tabs/media_indicator_button_cocoa.mm
|
| diff --git a/chrome/browser/ui/cocoa/tabs/media_indicator_button_cocoa.mm b/chrome/browser/ui/cocoa/tabs/media_indicator_button_cocoa.mm
|
| deleted file mode 100644
|
| index 2d1888e8fe85514e69379140deca34aa18cf901b..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/tabs/media_indicator_button_cocoa.mm
|
| +++ /dev/null
|
| @@ -1,240 +0,0 @@
|
| -// 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.
|
| -
|
| -#import "chrome/browser/ui/cocoa/tabs/media_indicator_button_cocoa.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/macros.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "ui/gfx/animation/animation.h"
|
| -#include "ui/gfx/animation/animation_delegate.h"
|
| -#include "ui/gfx/image/image.h"
|
| -
|
| -namespace {
|
| -
|
| -// The minimum required click-to-select area of an inactive tab before allowing
|
| -// the click-to-mute functionality to be enabled. This value is in terms of
|
| -// some percentage of the MediaIndicatorButton's width. See comments in the
|
| -// updateEnabledForMuteToggle method.
|
| -const int kMinMouseSelectableAreaPercent = 250;
|
| -
|
| -} // namespace
|
| -
|
| -@implementation MediaIndicatorButton
|
| -
|
| -class FadeAnimationDelegate : public gfx::AnimationDelegate {
|
| - public:
|
| - explicit FadeAnimationDelegate(MediaIndicatorButton* button)
|
| - : button_(button) {}
|
| - ~FadeAnimationDelegate() override {}
|
| -
|
| - private:
|
| - // gfx::AnimationDelegate implementation.
|
| - void AnimationProgressed(const gfx::Animation* animation) override {
|
| - [button_ setNeedsDisplay:YES];
|
| - }
|
| -
|
| - void AnimationCanceled(const gfx::Animation* animation) override {
|
| - AnimationEnded(animation);
|
| - }
|
| -
|
| - void AnimationEnded(const gfx::Animation* animation) override {
|
| - button_->showingMediaState_ = button_->mediaState_;
|
| - [button_ setNeedsDisplay:YES];
|
| - [button_->animationDoneTarget_
|
| - performSelector:button_->animationDoneAction_];
|
| - }
|
| -
|
| - MediaIndicatorButton* const button_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FadeAnimationDelegate);
|
| -};
|
| -
|
| -@synthesize showingMediaState = showingMediaState_;
|
| -
|
| -- (id)init {
|
| - if ((self = [super initWithFrame:NSZeroRect])) {
|
| - mediaState_ = TAB_MEDIA_STATE_NONE;
|
| - showingMediaState_ = TAB_MEDIA_STATE_NONE;
|
| - [self setEnabled:NO];
|
| - [super setTarget:self];
|
| - [super setAction:@selector(handleClick:)];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)removeFromSuperview {
|
| - fadeAnimation_.reset();
|
| - [super removeFromSuperview];
|
| -}
|
| -
|
| -- (void)transitionToMediaState:(TabMediaState)nextState {
|
| - if (nextState == mediaState_)
|
| - return;
|
| -
|
| - if (nextState != TAB_MEDIA_STATE_NONE) {
|
| - [self
|
| - setImage:chrome::GetTabMediaIndicatorImage(nextState, 0).ToNSImage()];
|
| - affordanceImage_.reset(
|
| - [chrome::GetTabMediaIndicatorAffordanceImage(nextState, 0)
|
| - .ToNSImage() retain]);
|
| - }
|
| -
|
| - if ((mediaState_ == TAB_MEDIA_STATE_AUDIO_PLAYING &&
|
| - nextState == TAB_MEDIA_STATE_AUDIO_MUTING) ||
|
| - (mediaState_ == TAB_MEDIA_STATE_AUDIO_MUTING &&
|
| - nextState == TAB_MEDIA_STATE_AUDIO_PLAYING) ||
|
| - (mediaState_ == TAB_MEDIA_STATE_AUDIO_MUTING &&
|
| - nextState == TAB_MEDIA_STATE_NONE)) {
|
| - // Instant user feedback: No fade animation.
|
| - showingMediaState_ = nextState;
|
| - fadeAnimation_.reset();
|
| - } else {
|
| - if (nextState == TAB_MEDIA_STATE_NONE)
|
| - showingMediaState_ = mediaState_; // Fading-out indicator.
|
| - else
|
| - showingMediaState_ = nextState; // Fading-in to next indicator.
|
| - // gfx::Animation requires a task runner is available for the current
|
| - // thread. Generally, only certain unit tests would not instantiate a task
|
| - // runner.
|
| - if (base::ThreadTaskRunnerHandle::IsSet()) {
|
| - fadeAnimation_ = chrome::CreateTabMediaIndicatorFadeAnimation(nextState);
|
| - if (!fadeAnimationDelegate_)
|
| - fadeAnimationDelegate_.reset(new FadeAnimationDelegate(self));
|
| - fadeAnimation_->set_delegate(fadeAnimationDelegate_.get());
|
| - fadeAnimation_->Start();
|
| - }
|
| - }
|
| -
|
| - mediaState_ = nextState;
|
| -
|
| - [self updateEnabledForMuteToggle];
|
| -
|
| - // An indicator state change should be made visible immediately, instead of
|
| - // the user being surprised when their mouse leaves the button.
|
| - if ([self hoverState] == kHoverStateMouseOver)
|
| - [self setHoverState:kHoverStateNone];
|
| -
|
| - [self setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (void)setTarget:(id)aTarget {
|
| - NOTREACHED(); // See class-level comments.
|
| -}
|
| -
|
| -- (void)setAction:(SEL)anAction {
|
| - NOTREACHED(); // See class-level comments.
|
| -}
|
| -
|
| -- (void)setAnimationDoneTarget:(id)target withAction:(SEL)action {
|
| - animationDoneTarget_ = target;
|
| - animationDoneAction_ = action;
|
| -}
|
| -
|
| -- (void)setClickTarget:(id)target withAction:(SEL)action {
|
| - clickTarget_ = target;
|
| - clickAction_ = action;
|
| -}
|
| -
|
| -- (void)mouseDown:(NSEvent*)theEvent {
|
| - // Do not handle this left-button mouse event if any modifier keys are being
|
| - // held down. Instead, the Tab should react (e.g., selection or drag start).
|
| - if ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask) {
|
| - [self setHoverState:kHoverStateNone]; // Turn off hover.
|
| - [[self nextResponder] mouseDown:theEvent];
|
| - return;
|
| - }
|
| - [super mouseDown:theEvent];
|
| -}
|
| -
|
| -- (void)mouseEntered:(NSEvent*)theEvent {
|
| - // If any modifier keys are being held down, do not turn on hover.
|
| - if ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask) {
|
| - [self setHoverState:kHoverStateNone];
|
| - return;
|
| - }
|
| - [super mouseEntered:theEvent];
|
| -}
|
| -
|
| -- (void)mouseMoved:(NSEvent*)theEvent {
|
| - // If any modifier keys are being held down, turn off hover.
|
| - if ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask) {
|
| - [self setHoverState:kHoverStateNone];
|
| - return;
|
| - }
|
| - [super mouseMoved:theEvent];
|
| -}
|
| -
|
| -- (void)rightMouseDown:(NSEvent*)theEvent {
|
| - // All right-button mouse events should be handled by the Tab.
|
| - [self setHoverState:kHoverStateNone]; // Turn off hover.
|
| - [[self nextResponder] rightMouseDown:theEvent];
|
| -}
|
| -
|
| -- (void)drawRect:(NSRect)dirtyRect {
|
| - NSImage* image = ([self hoverState] == kHoverStateNone || ![self isEnabled]) ?
|
| - [self image] : affordanceImage_.get();
|
| - if (!image)
|
| - return;
|
| - NSRect imageRect = NSZeroRect;
|
| - imageRect.size = [image size];
|
| - NSRect destRect = [self bounds];
|
| - destRect.origin.y =
|
| - floor((NSHeight(destRect) / 2) - (NSHeight(imageRect) / 2));
|
| - destRect.size = imageRect.size;
|
| - double opaqueness =
|
| - fadeAnimation_ ? fadeAnimation_->GetCurrentValue() : 1.0;
|
| - if (mediaState_ == TAB_MEDIA_STATE_NONE)
|
| - opaqueness = 1.0 - opaqueness; // Fading out, not in.
|
| - [image drawInRect:destRect
|
| - fromRect:imageRect
|
| - operation:NSCompositeSourceOver
|
| - fraction:opaqueness
|
| - respectFlipped:YES
|
| - hints:nil];
|
| -}
|
| -
|
| -// When disabled, the superview should receive all mouse events.
|
| -- (NSView*)hitTest:(NSPoint)aPoint {
|
| - if ([self isEnabled] && ![self isHidden])
|
| - return [super hitTest:aPoint];
|
| - else
|
| - return nil;
|
| -}
|
| -
|
| -- (void)handleClick:(id)sender {
|
| - using base::UserMetricsAction;
|
| -
|
| - if (mediaState_ == TAB_MEDIA_STATE_AUDIO_PLAYING)
|
| - content::RecordAction(UserMetricsAction("MediaIndicatorButton_Mute"));
|
| - else if (mediaState_ == TAB_MEDIA_STATE_AUDIO_MUTING)
|
| - content::RecordAction(UserMetricsAction("MediaIndicatorButton_Unmute"));
|
| - else
|
| - NOTREACHED();
|
| -
|
| - [clickTarget_ performSelector:clickAction_ withObject:self];
|
| -}
|
| -
|
| -- (void)updateEnabledForMuteToggle {
|
| - BOOL enable = chrome::AreExperimentalMuteControlsEnabled() &&
|
| - (mediaState_ == TAB_MEDIA_STATE_AUDIO_PLAYING ||
|
| - mediaState_ == TAB_MEDIA_STATE_AUDIO_MUTING);
|
| -
|
| - // If the tab is not the currently-active tab, make sure it is wide enough
|
| - // before enabling click-to-mute. This ensures that there is enough click
|
| - // area for the user to activate a tab rather than unintentionally muting it.
|
| - TabView* const tabView = base::mac::ObjCCast<TabView>([self superview]);
|
| - if (enable && tabView && ([tabView state] != NSOnState)) {
|
| - const int requiredWidth =
|
| - NSWidth([self frame]) * kMinMouseSelectableAreaPercent / 100;
|
| - enable = ([tabView widthOfLargestSelectableRegion] >= requiredWidth);
|
| - }
|
| -
|
| - [self setEnabled:enable];
|
| -}
|
| -
|
| -@end
|
|
|