summaryrefslogtreecommitdiffstats
path: root/ash/system/audio
diff options
context:
space:
mode:
Diffstat (limited to 'ash/system/audio')
-rw-r--r--ash/system/audio/audio_observer.h1
-rw-r--r--ash/system/audio/tray_volume.cc55
-rw-r--r--ash/system/audio/tray_volume.h1
3 files changed, 42 insertions, 15 deletions
diff --git a/ash/system/audio/audio_observer.h b/ash/system/audio/audio_observer.h
index ebf5adb..d0ff405 100644
--- a/ash/system/audio/audio_observer.h
+++ b/ash/system/audio/audio_observer.h
@@ -14,6 +14,7 @@ class ASH_EXPORT AudioObserver {
virtual ~AudioObserver() {}
virtual void OnVolumeChanged(float percent) = 0;
+ virtual void OnMuteToggled() = 0;
};
} // namespace ash
diff --git a/ash/system/audio/tray_volume.cc b/ash/system/audio/tray_volume.cc
index f395be6..0d63a8e 100644
--- a/ash/system/audio/tray_volume.cc
+++ b/ash/system/audio/tray_volume.cc
@@ -63,8 +63,8 @@ class VolumeButton : public views::ToggleImageButton {
float level = delegate->GetVolumeLevel();
int image_index = delegate->IsAudioMuted() ?
0 : (level == 1.0 ?
- kVolumeLevels : std::ceil(level * (kVolumeLevels - 1)));
-
+ kVolumeLevels :
+ std::max(1, int(std::ceil(level * (kVolumeLevels - 1)))));
if (image_index != image_index_) {
gfx::Rect region(0, image_index * kVolumeImageHeight,
kVolumeImageWidth, kVolumeImageHeight);
@@ -110,6 +110,26 @@ class MuteButton : public ash::internal::TrayBarButtonWithTitle {
DISALLOW_COPY_AND_ASSIGN(MuteButton);
};
+class VolumeSlider : public views::Slider {
+ public:
+ explicit VolumeSlider(views::SliderListener* listener)
+ : views::Slider(listener, views::Slider::HORIZONTAL) {
+ set_focus_border_color(kFocusBorderColor);
+ SetValue(ash::Shell::GetInstance()->tray_delegate()->GetVolumeLevel());
+ SetAccessibleName(
+ ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
+ IDS_ASH_STATUS_TRAY_VOLUME));
+ Update();
+ }
+ virtual ~VolumeSlider() {}
+
+ void Update() {
+ UpdateState(!ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted());
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(VolumeSlider);
+};
+
class VolumeView : public views::View,
public views::ButtonListener,
public views::SliderListener {
@@ -124,20 +144,18 @@ class VolumeView : public views::View,
mute_ = new MuteButton(this);
AddChildView(mute_);
- ash::SystemTrayDelegate* delegate =
- ash::Shell::GetInstance()->tray_delegate();
- slider_ = new views::Slider(this, views::Slider::HORIZONTAL);
- slider_->set_focus_border_color(kFocusBorderColor);
- slider_->SetValue(
- delegate->IsAudioMuted() ? 0.0 : delegate->GetVolumeLevel());
- slider_->SetAccessibleName(
- ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
- IDS_ASH_STATUS_TRAY_VOLUME));
+ slider_ = new VolumeSlider(this);
AddChildView(slider_);
}
virtual ~VolumeView() {}
+ void Update() {
+ icon_->Update();
+ mute_->Update();
+ slider_->Update();
+ }
+
void SetVolumeLevel(float percent) {
// The change in volume will be reflected via accessibility system events,
// so we prevent the UI event from being sent here.
@@ -146,8 +164,7 @@ class VolumeView : public views::View,
// It is possible that the volume was (un)muted, but the actual volume level
// did not change. In that case, setting the value of the slider won't
// trigger an update. So explicitly trigger an update.
- icon_->Update();
- mute_->Update();
+ Update();
slider_->set_enable_accessibility_events(true);
}
@@ -182,7 +199,7 @@ class VolumeView : public views::View,
VolumeButton* icon_;
MuteButton* mute_;
- views::Slider* slider_;
+ VolumeSlider* slider_;
DISALLOW_COPY_AND_ASSIGN(VolumeView);
};
@@ -201,7 +218,7 @@ TrayVolume::~TrayVolume() {
bool TrayVolume::GetInitialVisibility() {
ash::SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->tray_delegate();
- return delegate->GetVolumeLevel() == 0.0 || delegate->IsAudioMuted();
+ return delegate->IsAudioMuted();
}
views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) {
@@ -240,5 +257,13 @@ void TrayVolume::OnVolumeChanged(float percent) {
PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false);
}
+void TrayVolume::OnMuteToggled() {
+ if (tray_view())
+ tray_view()->SetVisible(GetInitialVisibility());
+
+ if (volume_view_)
+ volume_view_->Update();
+}
+
} // namespace internal
} // namespace ash
diff --git a/ash/system/audio/tray_volume.h b/ash/system/audio/tray_volume.h
index 8dd71dc..2a0d06b 100644
--- a/ash/system/audio/tray_volume.h
+++ b/ash/system/audio/tray_volume.h
@@ -33,6 +33,7 @@ class TrayVolume : public TrayImageItem,
// Overridden from AudioObserver.
virtual void OnVolumeChanged(float percent) OVERRIDE;
+ virtual void OnMuteToggled() OVERRIDE;
tray::VolumeView* volume_view_;