Commit 5f8f22cc authored by sadrul@chromium.org's avatar sadrul@chromium.org

ash uber tray: Update the volume icon for various levels of volumes.

BUG=110130
TEST=none


Review URL: http://codereview.chromium.org/9585004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124692 0039d316-1c4b-4281-b951-d872f2087c98
parent b81dee62
......@@ -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() {
......
......@@ -10,17 +10,13 @@
#include "ash/system/tray/system_tray_item.h"
#include "base/memory/scoped_ptr.h"
namespace views {
class ImageView;
}
namespace ash {
namespace internal {
namespace tray {
class VolumeView;
}
namespace ash {
namespace internal {
class TrayVolume : public SystemTrayItem,
public AudioController {
public:
......@@ -28,7 +24,7 @@ class TrayVolume : public SystemTrayItem,
virtual ~TrayVolume();
private:
// Overridden from SystemTrayItem
// Overridden from SystemTrayItem.
virtual views::View* CreateTrayView() OVERRIDE;
virtual views::View* CreateDefaultView() OVERRIDE;
virtual views::View* CreateDetailedView() OVERRIDE;
......@@ -40,7 +36,6 @@ class TrayVolume : public SystemTrayItem,
virtual void OnVolumeChanged(float percent) OVERRIDE;
scoped_ptr<tray::VolumeView> volume_view_;
scoped_ptr<views::ImageView> tray_view_;
DISALLOW_COPY_AND_ASSIGN(TrayVolume);
};
......
......@@ -20,6 +20,9 @@
#include "ui/views/controls/image_view.h"
#include "ui/views/view.h"
namespace ash {
namespace internal {
namespace tray {
class BrightnessView : public views::View,
......@@ -76,9 +79,6 @@ class BrightnessView : public views::View,
} // namespace tray
namespace ash {
namespace internal {
TrayBrightness::TrayBrightness() {}
TrayBrightness::~TrayBrightness() {}
......
......@@ -10,13 +10,13 @@
#include "ash/system/tray/system_tray_item.h"
#include "base/compiler_specific.h"
namespace ash {
namespace internal {
namespace tray {
class BrightnessView;
}
namespace ash {
namespace internal {
class TrayBrightness : public SystemTrayItem,
public BrightnessController {
public:
......@@ -24,7 +24,7 @@ class TrayBrightness : public SystemTrayItem,
virtual ~TrayBrightness();
private:
// Overridden from SystemTrayItem
// Overridden from SystemTrayItem.
virtual views::View* CreateTrayView() OVERRIDE;
virtual views::View* CreateDefaultView() OVERRIDE;
virtual views::View* CreateDetailedView() OVERRIDE;
......
......@@ -206,8 +206,7 @@
<include name="IDR_AURA_WINDOW_TOP_LEFT" file="aura/window_top_left.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_TOP_RIGHT" file="aura/window_top_right.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_ZOOM_ICON" file="aura/slab_zoom.png" type="BINDATA" />
<include name="IDR_AURA_UBER_TRAY_VOLUME" file="aura/status_volume.png" type="BINDATA" />
<include name="IDR_AURA_UBER_TRAY_VOLUME_MUTE" file="aura/status_volume_mute.png" type="BINDATA" />
<include name="IDR_AURA_UBER_TRAY_VOLUME_LEVELS" file="aura/status_volume_all.png" type="BINDATA" />
<include name="IDR_AURA_UBER_TRAY_BRIGHTNESS" file="aura/status_brightness.png" type="BINDATA" />
<include name="IDR_AURA_UBER_TRAY_SETTINGS" file="aura/status_settings.png" type="BINDATA" />
<include name="IDR_AURA_UBER_TRAY_POWER_SMALL" file="aura/status_power_small_all.png" type="BINDATA" />
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment