| Index: ash/system/audio/tray_volume.cc
|
| diff --git a/ash/system/audio/tray_volume.cc b/ash/system/audio/tray_volume.cc
|
| index 9d2a2498210d89a32fcdfdd66729637caa952c96..0bfa5bc732fc71b3db72b39179d60def77bf7070 100644
|
| --- a/ash/system/audio/tray_volume.cc
|
| +++ b/ash/system/audio/tray_volume.cc
|
| @@ -8,7 +8,12 @@
|
| #include "ash/system/tray/system_tray_delegate.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "grit/ui_resources.h"
|
| +#include "third_party/skia/include/core/SkCanvas.h"
|
| +#include "third_party/skia/include/core/SkPaint.h"
|
| +#include "third_party/skia/include/core/SkRect.h"
|
| +#include "third_party/skia/include/effects/SkGradientShader.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| +#include "ui/gfx/canvas.h"
|
| #include "ui/gfx/image/image.h"
|
| #include "ui/views/controls/button/image_button.h"
|
| #include "ui/views/controls/image_view.h"
|
| @@ -17,8 +22,75 @@
|
| #include "ui/views/layout/box_layout.h"
|
| #include "ui/views/view.h"
|
|
|
| +namespace ash {
|
| +namespace internal {
|
| +
|
| +namespace {
|
| +const int kVolumeImageWidth = 44;
|
| +const int kVolumeImageHeight = 44;
|
| +const int kVolumeLevel = 5;
|
| +}
|
| +
|
| namespace tray {
|
|
|
| +class VolumeButton : public views::ToggleImageButton {
|
| + public:
|
| + explicit VolumeButton(views::ButtonListener* listener)
|
| + : views::ToggleImageButton(listener),
|
| + image_index_(-1) {
|
| + image_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
|
| + IDR_AURA_UBER_TRAY_VOLUME_LEVELS);
|
| + Update();
|
| + }
|
| +
|
| + virtual ~VolumeButton() {}
|
| +
|
| + void Update() {
|
| + ash::SystemTrayDelegate* delegate =
|
| + ash::Shell::GetInstance()->tray_delegate();
|
| + int level = static_cast<int>(delegate->GetVolumeLevel() * 100);
|
| + int image_index = level / (100 / kVolumeLevel);
|
| + if (level > 0 && image_index == 0)
|
| + ++image_index;
|
| + if (level == 100)
|
| + image_index = kVolumeLevel - 1;
|
| + else if (image_index == kVolumeLevel - 1)
|
| + --image_index;
|
| + if (image_index != image_index_) {
|
| + SkIRect region = SkIRect::MakeXYWH(0, image_index * kVolumeImageHeight,
|
| + kVolumeImageWidth, kVolumeImageHeight);
|
| + SkBitmap bitmap;
|
| + image_.ToSkBitmap()->extractSubset(&bitmap, region);
|
| + SetImage(views::CustomButton::BS_NORMAL, &bitmap);
|
| + image_index_ = image_index;
|
| + }
|
| + SchedulePaint();
|
| + }
|
| +
|
| + private:
|
| + // Overridden from views::View.
|
| + virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
|
| + views::ToggleImageButton::OnPaint(canvas);
|
| +
|
| + ash::SystemTrayDelegate* delegate =
|
| + ash::Shell::GetInstance()->tray_delegate();
|
| + if (!delegate->IsAudioMuted())
|
| + return;
|
| +
|
| + SkPaint paint;
|
| + paint.setColor(SkColorSetARGB(63, 0, 0, 0));
|
| + paint.setStrokeWidth(SkIntToScalar(3));
|
| + canvas->GetSkCanvas()->drawLine(SkIntToScalar(width() - 10),
|
| + SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(height() - 10),
|
| + paint);
|
| + }
|
| +
|
| + gfx::Image image_;
|
| + int image_index_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VolumeButton);
|
| +};
|
| +
|
| class VolumeView : public views::View,
|
| public views::ButtonListener,
|
| public views::SliderListener {
|
| @@ -27,24 +99,11 @@ class VolumeView : public views::View,
|
| SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
|
| 0, 0, 5));
|
|
|
| - gfx::Image image = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
|
| - IDR_AURA_UBER_TRAY_VOLUME);
|
| - icon_ = new views::ToggleImageButton(this);
|
| - icon_->SetImage(views::CustomButton::BS_NORMAL, image.ToSkBitmap());
|
| - icon_->SetImage(views::CustomButton::BS_HOT, image.ToSkBitmap());
|
| - icon_->SetImage(views::CustomButton::BS_PUSHED, image.ToSkBitmap());
|
| -
|
| - image = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
|
| - IDR_AURA_UBER_TRAY_VOLUME_MUTE);
|
| - icon_->SetToggledImage(views::CustomButton::BS_NORMAL, image.ToSkBitmap());
|
| - icon_->SetToggledImage(views::CustomButton::BS_HOT, image.ToSkBitmap());
|
| - icon_->SetToggledImage(views::CustomButton::BS_PUSHED, image.ToSkBitmap());
|
| + icon_ = new VolumeButton(this);
|
| + AddChildView(icon_);
|
|
|
| ash::SystemTrayDelegate* delegate =
|
| ash::Shell::GetInstance()->tray_delegate();
|
| - icon_->SetToggled(delegate->IsAudioMuted());
|
| - AddChildView(icon_);
|
| -
|
| slider_ = new views::Slider(this, views::Slider::HORIZONTAL);
|
| slider_->SetValue(delegate->GetVolumeLevel());
|
| slider_->set_border(views::Border::CreateEmptyBorder(0, 0, 0, 20));
|
| @@ -56,7 +115,6 @@ class VolumeView : public views::View,
|
| }
|
|
|
| private:
|
| -
|
| // Overridden from views::ButtonListener.
|
| virtual void ButtonPressed(views::Button* sender,
|
| const views::Event& event) OVERRIDE {
|
| @@ -64,10 +122,6 @@ class VolumeView : public views::View,
|
| ash::SystemTrayDelegate* delegate =
|
| ash::Shell::GetInstance()->tray_delegate();
|
| delegate->SetAudioMuted(!delegate->IsAudioMuted());
|
| -
|
| - // TODO(sad): Should the icon auto-update its state when mute/unmute happens
|
| - // above?
|
| - icon_->SetToggled(delegate->IsAudioMuted());
|
| }
|
|
|
| // Overridden from views:SliderListener.
|
| @@ -75,12 +129,12 @@ class VolumeView : public views::View,
|
| float value,
|
| float old_value,
|
| views::SliderChangeReason reason) OVERRIDE {
|
| - if (reason != views::VALUE_CHANGED_BY_USER)
|
| - return;
|
| - ash::Shell::GetInstance()->tray_delegate()->SetVolumeLevel(value);
|
| + if (reason == views::VALUE_CHANGED_BY_USER)
|
| + ash::Shell::GetInstance()->tray_delegate()->SetVolumeLevel(value);
|
| + icon_->Update();
|
| }
|
|
|
| - views::ToggleImageButton* icon_;
|
| + VolumeButton* icon_;
|
| views::Slider* slider_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(VolumeView);
|
| @@ -88,9 +142,6 @@ class VolumeView : public views::View,
|
|
|
| } // namespace tray
|
|
|
| -namespace ash {
|
| -namespace internal {
|
| -
|
| TrayVolume::TrayVolume() {
|
| }
|
|
|
| @@ -98,10 +149,7 @@ TrayVolume::~TrayVolume() {
|
| }
|
|
|
| views::View* TrayVolume::CreateTrayView() {
|
| - tray_view_.reset(new views::ImageView());
|
| - tray_view_->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
|
| - IDR_AURA_UBER_TRAY_VOLUME).ToSkBitmap());
|
| - return tray_view_.get();
|
| + return NULL;
|
| }
|
|
|
| views::View* TrayVolume::CreateDefaultView() {
|
| @@ -115,7 +163,6 @@ views::View* TrayVolume::CreateDetailedView() {
|
| }
|
|
|
| void TrayVolume::DestroyTrayView() {
|
| - tray_view_.reset();
|
| }
|
|
|
| void TrayVolume::DestroyDefaultView() {
|
|
|