| Index: chrome/browser/ui/views/tabs/media_indicator_button.cc
|
| diff --git a/chrome/browser/ui/views/tabs/media_indicator_button.cc b/chrome/browser/ui/views/tabs/media_indicator_button.cc
|
| deleted file mode 100644
|
| index 9421d42f1c764fdbee5921cbe2d7eba43aec52f7..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/views/tabs/media_indicator_button.cc
|
| +++ /dev/null
|
| @@ -1,269 +0,0 @@
|
| -// Copyright 2014 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 "chrome/browser/ui/views/tabs/media_indicator_button.h"
|
| -
|
| -#include "base/macros.h"
|
| -#include "chrome/browser/ui/views/tabs/tab.h"
|
| -#include "chrome/browser/ui/views/tabs/tab_controller.h"
|
| -#include "chrome/browser/ui/views/tabs/tab_renderer_data.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "ui/gfx/animation/animation_delegate.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/gfx/image/image.h"
|
| -
|
| -using base::UserMetricsAction;
|
| -
|
| -namespace {
|
| -
|
| -// The minimum required click-to-select area of an inactive Tab before allowing
|
| -// the click-to-mute functionality to be enabled. These values are in terms of
|
| -// some percentage of the MediaIndicatorButton's width. See comments in
|
| -// UpdateEnabledForMuteToggle().
|
| -const int kMinMouseSelectableAreaPercent = 250;
|
| -const int kMinGestureSelectableAreaPercent = 400;
|
| -
|
| -// Returns true if either Shift or Control are being held down. In this case,
|
| -// mouse events are delegated to the Tab, to perform tab selection in the tab
|
| -// strip instead.
|
| -bool IsShiftOrControlDown(const ui::Event& event) {
|
| - return (event.flags() & (ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)) != 0;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -const char MediaIndicatorButton::kViewClassName[] = "MediaIndicatorButton";
|
| -
|
| -class MediaIndicatorButton::FadeAnimationDelegate
|
| - : public gfx::AnimationDelegate {
|
| - public:
|
| - explicit FadeAnimationDelegate(MediaIndicatorButton* button)
|
| - : button_(button) {}
|
| - ~FadeAnimationDelegate() override {}
|
| -
|
| - private:
|
| - // gfx::AnimationDelegate
|
| - void AnimationProgressed(const gfx::Animation* animation) override {
|
| - button_->SchedulePaint();
|
| - }
|
| -
|
| - void AnimationCanceled(const gfx::Animation* animation) override {
|
| - AnimationEnded(animation);
|
| - }
|
| -
|
| - void AnimationEnded(const gfx::Animation* animation) override {
|
| - button_->showing_media_state_ = button_->media_state_;
|
| - button_->parent_tab_->MediaStateChanged();
|
| - }
|
| -
|
| - MediaIndicatorButton* const button_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FadeAnimationDelegate);
|
| -};
|
| -
|
| -MediaIndicatorButton::MediaIndicatorButton(Tab* parent_tab)
|
| - : views::ImageButton(NULL),
|
| - parent_tab_(parent_tab),
|
| - media_state_(TAB_MEDIA_STATE_NONE),
|
| - showing_media_state_(TAB_MEDIA_STATE_NONE) {
|
| - DCHECK(parent_tab_);
|
| - SetEventTargeter(
|
| - scoped_ptr<views::ViewTargeter>(new views::ViewTargeter(this)));
|
| -}
|
| -
|
| -MediaIndicatorButton::~MediaIndicatorButton() {}
|
| -
|
| -void MediaIndicatorButton::TransitionToMediaState(TabMediaState next_state) {
|
| - if (next_state == media_state_)
|
| - return;
|
| -
|
| - TabMediaState previous_media_showing_state = showing_media_state_;
|
| -
|
| - if (next_state != TAB_MEDIA_STATE_NONE)
|
| - ResetImages(next_state);
|
| -
|
| - if ((media_state_ == TAB_MEDIA_STATE_AUDIO_PLAYING &&
|
| - next_state == TAB_MEDIA_STATE_AUDIO_MUTING) ||
|
| - (media_state_ == TAB_MEDIA_STATE_AUDIO_MUTING &&
|
| - next_state == TAB_MEDIA_STATE_AUDIO_PLAYING) ||
|
| - (media_state_ == TAB_MEDIA_STATE_AUDIO_MUTING &&
|
| - next_state == TAB_MEDIA_STATE_NONE)) {
|
| - // Instant user feedback: No fade animation.
|
| - showing_media_state_ = next_state;
|
| - fade_animation_.reset();
|
| - } else {
|
| - if (next_state == TAB_MEDIA_STATE_NONE)
|
| - showing_media_state_ = media_state_; // Fading-out indicator.
|
| - else
|
| - showing_media_state_ = next_state; // Fading-in to next indicator.
|
| - fade_animation_ = chrome::CreateTabMediaIndicatorFadeAnimation(next_state);
|
| - if (!fade_animation_delegate_)
|
| - fade_animation_delegate_.reset(new FadeAnimationDelegate(this));
|
| - fade_animation_->set_delegate(fade_animation_delegate_.get());
|
| - fade_animation_->Start();
|
| - }
|
| -
|
| - media_state_ = next_state;
|
| -
|
| - if (previous_media_showing_state != showing_media_state_)
|
| - parent_tab_->MediaStateChanged();
|
| -
|
| - UpdateEnabledForMuteToggle();
|
| -
|
| - // An indicator state change should be made visible immediately, instead of
|
| - // the user being surprised when their mouse leaves the button.
|
| - if (state() == views::CustomButton::STATE_HOVERED) {
|
| - SetState(enabled() ? views::CustomButton::STATE_NORMAL :
|
| - views::CustomButton::STATE_DISABLED);
|
| - }
|
| -
|
| - // Note: The calls to SetImage(), SetEnabled(), and SetState() above will call
|
| - // SchedulePaint() if necessary.
|
| -}
|
| -
|
| -void MediaIndicatorButton::UpdateEnabledForMuteToggle() {
|
| - bool enable = chrome::AreExperimentalMuteControlsEnabled() &&
|
| - (media_state_ == TAB_MEDIA_STATE_AUDIO_PLAYING ||
|
| - media_state_ == 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.
|
| - // Note that IsTriggerableEvent() is also overridden to provide an even wider
|
| - // requirement for tap gestures.
|
| - if (enable && !GetTab()->IsActive()) {
|
| - const int required_width = width() * kMinMouseSelectableAreaPercent / 100;
|
| - enable = (GetTab()->GetWidthOfLargestSelectableRegion() >= required_width);
|
| - }
|
| -
|
| - SetEnabled(enable);
|
| -}
|
| -
|
| -void MediaIndicatorButton::OnParentTabButtonColorChanged() {
|
| - if (media_state_ == TAB_MEDIA_STATE_AUDIO_PLAYING ||
|
| - media_state_ == TAB_MEDIA_STATE_AUDIO_MUTING)
|
| - ResetImages(media_state_);
|
| -}
|
| -
|
| -const char* MediaIndicatorButton::GetClassName() const {
|
| - return kViewClassName;
|
| -}
|
| -
|
| -views::View* MediaIndicatorButton::GetTooltipHandlerForPoint(
|
| - const gfx::Point& point) {
|
| - return NULL; // Tab (the parent View) provides the tooltip.
|
| -}
|
| -
|
| -bool MediaIndicatorButton::OnMousePressed(const ui::MouseEvent& event) {
|
| - // Do not handle this mouse event when anything but the left mouse button is
|
| - // pressed or when any modifier keys are being held down. Instead, the Tab
|
| - // should react (e.g., middle-click for close, right-click for context menu).
|
| - if (!event.IsOnlyLeftMouseButton() || IsShiftOrControlDown(event)) {
|
| - if (state() != views::CustomButton::STATE_DISABLED)
|
| - SetState(views::CustomButton::STATE_NORMAL); // Turn off hover.
|
| - return false; // Event to be handled by Tab.
|
| - }
|
| - return ImageButton::OnMousePressed(event);
|
| -}
|
| -
|
| -bool MediaIndicatorButton::OnMouseDragged(const ui::MouseEvent& event) {
|
| - const ButtonState previous_state = state();
|
| - const bool ret = ImageButton::OnMouseDragged(event);
|
| - if (previous_state != views::CustomButton::STATE_NORMAL &&
|
| - state() == views::CustomButton::STATE_NORMAL)
|
| - content::RecordAction(UserMetricsAction("MediaIndicatorButton_Dragged"));
|
| - return ret;
|
| -}
|
| -
|
| -void MediaIndicatorButton::OnMouseEntered(const ui::MouseEvent& event) {
|
| - // If any modifier keys are being held down, do not turn on hover.
|
| - if (state() != views::CustomButton::STATE_DISABLED &&
|
| - IsShiftOrControlDown(event)) {
|
| - SetState(views::CustomButton::STATE_NORMAL);
|
| - return;
|
| - }
|
| - ImageButton::OnMouseEntered(event);
|
| -}
|
| -
|
| -void MediaIndicatorButton::OnMouseMoved(const ui::MouseEvent& event) {
|
| - // If any modifier keys are being held down, turn off hover.
|
| - if (state() != views::CustomButton::STATE_DISABLED &&
|
| - IsShiftOrControlDown(event)) {
|
| - SetState(views::CustomButton::STATE_NORMAL);
|
| - return;
|
| - }
|
| - ImageButton::OnMouseMoved(event);
|
| -}
|
| -
|
| -void MediaIndicatorButton::OnBoundsChanged(const gfx::Rect& previous_bounds) {
|
| - UpdateEnabledForMuteToggle();
|
| -}
|
| -
|
| -void MediaIndicatorButton::OnPaint(gfx::Canvas* canvas) {
|
| - double opaqueness =
|
| - fade_animation_ ? fade_animation_->GetCurrentValue() : 1.0;
|
| - if (media_state_ == TAB_MEDIA_STATE_NONE)
|
| - opaqueness = 1.0 - opaqueness; // Fading out, not in.
|
| - if (opaqueness < 1.0)
|
| - canvas->SaveLayerAlpha(opaqueness * SK_AlphaOPAQUE);
|
| - ImageButton::OnPaint(canvas);
|
| - if (opaqueness < 1.0)
|
| - canvas->Restore();
|
| -}
|
| -
|
| -bool MediaIndicatorButton::DoesIntersectRect(const views::View* target,
|
| - const gfx::Rect& rect) const {
|
| - // If this button is not enabled, Tab (the parent View) handles all mouse
|
| - // events.
|
| - return enabled() &&
|
| - views::ViewTargeterDelegate::DoesIntersectRect(target, rect);
|
| -}
|
| -
|
| -void MediaIndicatorButton::NotifyClick(const ui::Event& event) {
|
| - if (media_state_ == TAB_MEDIA_STATE_AUDIO_PLAYING)
|
| - content::RecordAction(UserMetricsAction("MediaIndicatorButton_Mute"));
|
| - else if (media_state_ == TAB_MEDIA_STATE_AUDIO_MUTING)
|
| - content::RecordAction(UserMetricsAction("MediaIndicatorButton_Unmute"));
|
| - else
|
| - NOTREACHED();
|
| -
|
| - GetTab()->controller()->ToggleTabAudioMute(GetTab());
|
| -}
|
| -
|
| -bool MediaIndicatorButton::IsTriggerableEvent(const ui::Event& event) {
|
| - // For mouse events, only trigger on the left mouse button and when no
|
| - // modifier keys are being held down.
|
| - if (event.IsMouseEvent() &&
|
| - (!static_cast<const ui::MouseEvent*>(&event)->IsOnlyLeftMouseButton() ||
|
| - IsShiftOrControlDown(event)))
|
| - return false;
|
| -
|
| - // For gesture events on an inactive tab, require an even wider tab before
|
| - // click-to-mute can be triggered. See comments in
|
| - // UpdateEnabledForMuteToggle().
|
| - if (event.IsGestureEvent() && !GetTab()->IsActive()) {
|
| - const int required_width = width() * kMinGestureSelectableAreaPercent / 100;
|
| - if (GetTab()->GetWidthOfLargestSelectableRegion() < required_width)
|
| - return false;
|
| - }
|
| -
|
| - return views::ImageButton::IsTriggerableEvent(event);
|
| -}
|
| -
|
| -Tab* MediaIndicatorButton::GetTab() const {
|
| - DCHECK_EQ(static_cast<views::View*>(parent_tab_), parent());
|
| - return parent_tab_;
|
| -}
|
| -
|
| -void MediaIndicatorButton::ResetImages(TabMediaState state) {
|
| - SkColor color = parent_tab_->button_color();
|
| - gfx::ImageSkia indicator_image =
|
| - chrome::GetTabMediaIndicatorImage(state, color).AsImageSkia();
|
| - SetImage(views::CustomButton::STATE_NORMAL, &indicator_image);
|
| - SetImage(views::CustomButton::STATE_DISABLED, &indicator_image);
|
| - gfx::ImageSkia affordance_image =
|
| - chrome::GetTabMediaIndicatorAffordanceImage(state, color).AsImageSkia();
|
| - SetImage(views::CustomButton::STATE_HOVERED, &affordance_image);
|
| - SetImage(views::CustomButton::STATE_PRESSED, &affordance_image);
|
| -}
|
|
|