| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/system/audio/tray_volume.h" | 5 #include "ash/system/audio/tray_volume.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/system/tray/system_tray_delegate.h" | 10 #include "ash/system/tray/system_tray_delegate.h" |
| 11 #include "ash/system/tray/tray_constants.h" | 11 #include "ash/system/tray/tray_constants.h" |
| 12 #include "ash/system/tray/tray_views.h" | 12 #include "ash/system/tray/tray_views.h" |
| 13 #include "ash/volume_control_delegate.h" |
| 13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 14 #include "grit/ash_strings.h" | 15 #include "grit/ash_strings.h" |
| 15 #include "grit/ui_resources.h" | 16 #include "grit/ui_resources.h" |
| 16 #include "third_party/skia/include/core/SkCanvas.h" | 17 #include "third_party/skia/include/core/SkCanvas.h" |
| 17 #include "third_party/skia/include/core/SkPaint.h" | 18 #include "third_party/skia/include/core/SkPaint.h" |
| 18 #include "third_party/skia/include/core/SkRect.h" | 19 #include "third_party/skia/include/core/SkRect.h" |
| 19 #include "third_party/skia/include/effects/SkGradientShader.h" | 20 #include "third_party/skia/include/effects/SkGradientShader.h" |
| 20 #include "ui/base/resource/resource_bundle.h" | 21 #include "ui/base/resource/resource_bundle.h" |
| 21 #include "ui/gfx/canvas.h" | 22 #include "ui/gfx/canvas.h" |
| 22 #include "ui/gfx/image/image.h" | 23 #include "ui/gfx/image/image.h" |
| 23 #include "ui/gfx/image/image_skia_operations.h" | 24 #include "ui/gfx/image/image_skia_operations.h" |
| 24 #include "ui/views/controls/button/image_button.h" | 25 #include "ui/views/controls/button/image_button.h" |
| 25 #include "ui/views/controls/image_view.h" | 26 #include "ui/views/controls/image_view.h" |
| 26 #include "ui/views/controls/label.h" | 27 #include "ui/views/controls/label.h" |
| 27 #include "ui/views/controls/slider.h" | 28 #include "ui/views/controls/slider.h" |
| 28 #include "ui/views/layout/box_layout.h" | 29 #include "ui/views/layout/box_layout.h" |
| 29 #include "ui/views/view.h" | 30 #include "ui/views/view.h" |
| 30 | 31 |
| 31 namespace ash { | 32 namespace ash { |
| 32 namespace internal { | 33 namespace internal { |
| 33 | 34 |
| 34 namespace { | 35 namespace { |
| 35 const int kVolumeImageWidth = 25; | 36 const int kVolumeImageWidth = 25; |
| 36 const int kVolumeImageHeight = 25; | 37 const int kVolumeImageHeight = 25; |
| 37 | 38 |
| 38 // IDR_AURA_UBER_TRAY_VOLUME_LEVELS contains 5 images, | 39 // IDR_AURA_UBER_TRAY_VOLUME_LEVELS contains 5 images, |
| 39 // The one for mute is at the 0 index and the other | 40 // The one for mute is at the 0 index and the other |
| 40 // four are used for ascending volume levels. | 41 // four are used for ascending volume levels. |
| 41 const int kVolumeLevels = 4; | 42 const int kVolumeLevels = 4; |
| 43 |
| 44 bool IsAudioMuted() { |
| 45 return Shell::GetInstance()->tray_delegate()-> |
| 46 GetVolumeControlDelegate()->IsAudioMuted(); |
| 42 } | 47 } |
| 43 | 48 |
| 49 float GetVolumeLevel() { |
| 50 return Shell::GetInstance()->tray_delegate()-> |
| 51 GetVolumeControlDelegate()->GetVolumeLevel(); |
| 52 } |
| 53 |
| 54 } // namespace |
| 55 |
| 44 namespace tray { | 56 namespace tray { |
| 45 | 57 |
| 46 class VolumeButton : public views::ToggleImageButton { | 58 class VolumeButton : public views::ToggleImageButton { |
| 47 public: | 59 public: |
| 48 explicit VolumeButton(views::ButtonListener* listener) | 60 explicit VolumeButton(views::ButtonListener* listener) |
| 49 : views::ToggleImageButton(listener), | 61 : views::ToggleImageButton(listener), |
| 50 image_index_(-1) { | 62 image_index_(-1) { |
| 51 SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE); | 63 SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE); |
| 52 image_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( | 64 image_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| 53 IDR_AURA_UBER_TRAY_VOLUME_LEVELS); | 65 IDR_AURA_UBER_TRAY_VOLUME_LEVELS); |
| 54 SetPreferredSize(gfx::Size(kTrayPopupItemHeight, kTrayPopupItemHeight)); | 66 SetPreferredSize(gfx::Size(kTrayPopupItemHeight, kTrayPopupItemHeight)); |
| 55 Update(); | 67 Update(); |
| 56 } | 68 } |
| 57 | 69 |
| 58 virtual ~VolumeButton() {} | 70 virtual ~VolumeButton() {} |
| 59 | 71 |
| 60 void Update() { | 72 void Update() { |
| 61 ash::SystemTrayDelegate* delegate = | 73 float level = GetVolumeLevel(); |
| 62 ash::Shell::GetInstance()->tray_delegate(); | 74 int image_index = IsAudioMuted() ? |
| 63 float level = delegate->GetVolumeLevel(); | |
| 64 int image_index = delegate->IsAudioMuted() ? | |
| 65 0 : (level == 1.0 ? | 75 0 : (level == 1.0 ? |
| 66 kVolumeLevels : | 76 kVolumeLevels : |
| 67 std::max(1, int(std::ceil(level * (kVolumeLevels - 1))))); | 77 std::max(1, int(std::ceil(level * (kVolumeLevels - 1))))); |
| 68 if (image_index != image_index_) { | 78 if (image_index != image_index_) { |
| 69 gfx::Rect region(0, image_index * kVolumeImageHeight, | 79 gfx::Rect region(0, image_index * kVolumeImageHeight, |
| 70 kVolumeImageWidth, kVolumeImageHeight); | 80 kVolumeImageWidth, kVolumeImageHeight); |
| 71 gfx::ImageSkia image_skia = gfx::ImageSkiaOperations::ExtractSubset( | 81 gfx::ImageSkia image_skia = gfx::ImageSkiaOperations::ExtractSubset( |
| 72 *(image_.ToImageSkia()), region); | 82 *(image_.ToImageSkia()), region); |
| 73 SetImage(views::CustomButton::BS_NORMAL, &image_skia); | 83 SetImage(views::CustomButton::BS_NORMAL, &image_skia); |
| 74 image_index_ = image_index; | 84 image_index_ = image_index; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 94 public: | 104 public: |
| 95 explicit MuteButton(views::ButtonListener* listener) | 105 explicit MuteButton(views::ButtonListener* listener) |
| 96 : TrayBarButtonWithTitle(listener, | 106 : TrayBarButtonWithTitle(listener, |
| 97 IDS_ASH_STATUS_TRAY_VOLUME_MUTE, | 107 IDS_ASH_STATUS_TRAY_VOLUME_MUTE, |
| 98 kTrayBarButtonWidth) { | 108 kTrayBarButtonWidth) { |
| 99 Update(); | 109 Update(); |
| 100 } | 110 } |
| 101 virtual ~MuteButton() {} | 111 virtual ~MuteButton() {} |
| 102 | 112 |
| 103 void Update() { | 113 void Update() { |
| 104 ash::SystemTrayDelegate* delegate = | 114 UpdateButton(IsAudioMuted()); |
| 105 ash::Shell::GetInstance()->tray_delegate(); | |
| 106 UpdateButton(delegate->IsAudioMuted()); | |
| 107 SchedulePaint(); | 115 SchedulePaint(); |
| 108 } | 116 } |
| 109 | 117 |
| 110 DISALLOW_COPY_AND_ASSIGN(MuteButton); | 118 DISALLOW_COPY_AND_ASSIGN(MuteButton); |
| 111 }; | 119 }; |
| 112 | 120 |
| 113 class VolumeSlider : public views::Slider { | 121 class VolumeSlider : public views::Slider { |
| 114 public: | 122 public: |
| 115 explicit VolumeSlider(views::SliderListener* listener) | 123 explicit VolumeSlider(views::SliderListener* listener) |
| 116 : views::Slider(listener, views::Slider::HORIZONTAL) { | 124 : views::Slider(listener, views::Slider::HORIZONTAL) { |
| 117 set_focus_border_color(kFocusBorderColor); | 125 set_focus_border_color(kFocusBorderColor); |
| 118 SetValue(ash::Shell::GetInstance()->tray_delegate()->GetVolumeLevel()); | 126 SetValue(GetVolumeLevel()); |
| 119 SetAccessibleName( | 127 SetAccessibleName( |
| 120 ui::ResourceBundle::GetSharedInstance().GetLocalizedString( | 128 ui::ResourceBundle::GetSharedInstance().GetLocalizedString( |
| 121 IDS_ASH_STATUS_TRAY_VOLUME)); | 129 IDS_ASH_STATUS_TRAY_VOLUME)); |
| 122 Update(); | 130 Update(); |
| 123 } | 131 } |
| 124 virtual ~VolumeSlider() {} | 132 virtual ~VolumeSlider() {} |
| 125 | 133 |
| 126 void Update() { | 134 void Update() { |
| 127 UpdateState(!ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted()); | 135 UpdateState(!IsAudioMuted()); |
| 128 } | 136 } |
| 129 | 137 |
| 130 DISALLOW_COPY_AND_ASSIGN(VolumeSlider); | 138 DISALLOW_COPY_AND_ASSIGN(VolumeSlider); |
| 131 }; | 139 }; |
| 132 | 140 |
| 133 class VolumeView : public views::View, | 141 class VolumeView : public views::View, |
| 134 public views::ButtonListener, | 142 public views::ButtonListener, |
| 135 public views::SliderListener { | 143 public views::SliderListener { |
| 136 public: | 144 public: |
| 137 VolumeView() { | 145 VolumeView() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 // Overridden from views::View. | 180 // Overridden from views::View. |
| 173 virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE { | 181 virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE { |
| 174 int w = width() - slider_->x(); | 182 int w = width() - slider_->x(); |
| 175 slider_->SetSize(gfx::Size(w, slider_->height())); | 183 slider_->SetSize(gfx::Size(w, slider_->height())); |
| 176 } | 184 } |
| 177 | 185 |
| 178 // Overridden from views::ButtonListener. | 186 // Overridden from views::ButtonListener. |
| 179 virtual void ButtonPressed(views::Button* sender, | 187 virtual void ButtonPressed(views::Button* sender, |
| 180 const ui::Event& event) OVERRIDE { | 188 const ui::Event& event) OVERRIDE { |
| 181 CHECK(sender == icon_ || sender == mute_); | 189 CHECK(sender == icon_ || sender == mute_); |
| 182 ash::SystemTrayDelegate* delegate = | 190 ash::Shell::GetInstance()->tray_delegate()-> |
| 183 ash::Shell::GetInstance()->tray_delegate(); | 191 GetVolumeControlDelegate()->SetAudioMuted(!IsAudioMuted()); |
| 184 delegate->SetAudioMuted(!delegate->IsAudioMuted()); | |
| 185 } | 192 } |
| 186 | 193 |
| 187 // Overridden from views:SliderListener. | 194 // Overridden from views:SliderListener. |
| 188 virtual void SliderValueChanged(views::Slider* sender, | 195 virtual void SliderValueChanged(views::Slider* sender, |
| 189 float value, | 196 float value, |
| 190 float old_value, | 197 float old_value, |
| 191 views::SliderChangeReason reason) OVERRIDE { | 198 views::SliderChangeReason reason) OVERRIDE { |
| 192 if (reason == views::VALUE_CHANGED_BY_USER) { | 199 if (reason == views::VALUE_CHANGED_BY_USER) { |
| 193 ash::SystemTrayDelegate* delegate = | 200 ash::Shell::GetInstance()->tray_delegate()-> |
| 194 ash::Shell::GetInstance()->tray_delegate(); | 201 GetVolumeControlDelegate()->SetVolumeLevel(value); |
| 195 delegate->SetVolumeLevel(value); | |
| 196 } | 202 } |
| 197 icon_->Update(); | 203 icon_->Update(); |
| 198 } | 204 } |
| 199 | 205 |
| 200 VolumeButton* icon_; | 206 VolumeButton* icon_; |
| 201 MuteButton* mute_; | 207 MuteButton* mute_; |
| 202 VolumeSlider* slider_; | 208 VolumeSlider* slider_; |
| 203 | 209 |
| 204 DISALLOW_COPY_AND_ASSIGN(VolumeView); | 210 DISALLOW_COPY_AND_ASSIGN(VolumeView); |
| 205 }; | 211 }; |
| 206 | 212 |
| 207 } // namespace tray | 213 } // namespace tray |
| 208 | 214 |
| 209 TrayVolume::TrayVolume() | 215 TrayVolume::TrayVolume() |
| 210 : TrayImageItem(IDR_AURA_UBER_TRAY_VOLUME_MUTE), | 216 : TrayImageItem(IDR_AURA_UBER_TRAY_VOLUME_MUTE), |
| 211 volume_view_(NULL), | 217 volume_view_(NULL), |
| 212 is_default_view_(false) { | 218 is_default_view_(false) { |
| 213 } | 219 } |
| 214 | 220 |
| 215 TrayVolume::~TrayVolume() { | 221 TrayVolume::~TrayVolume() { |
| 216 } | 222 } |
| 217 | 223 |
| 218 bool TrayVolume::GetInitialVisibility() { | 224 bool TrayVolume::GetInitialVisibility() { |
| 219 ash::SystemTrayDelegate* delegate = | 225 return IsAudioMuted(); |
| 220 ash::Shell::GetInstance()->tray_delegate(); | |
| 221 return delegate->IsAudioMuted(); | |
| 222 } | 226 } |
| 223 | 227 |
| 224 views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) { | 228 views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) { |
| 225 volume_view_ = new tray::VolumeView; | 229 volume_view_ = new tray::VolumeView; |
| 226 is_default_view_ = true; | 230 is_default_view_ = true; |
| 227 return volume_view_; | 231 return volume_view_; |
| 228 } | 232 } |
| 229 | 233 |
| 230 views::View* TrayVolume::CreateDetailedView(user::LoginStatus status) { | 234 views::View* TrayVolume::CreateDetailedView(user::LoginStatus status) { |
| 231 volume_view_ = new tray::VolumeView; | 235 volume_view_ = new tray::VolumeView; |
| 232 is_default_view_ = false; | 236 is_default_view_ = false; |
| 233 return volume_view_; | 237 return volume_view_; |
| 234 } | 238 } |
| 235 | 239 |
| 236 void TrayVolume::DestroyDefaultView() { | 240 void TrayVolume::DestroyDefaultView() { |
| 237 if (is_default_view_) | 241 if (is_default_view_) |
| 238 volume_view_ = NULL; | 242 volume_view_ = NULL; |
| 239 } | 243 } |
| 240 | 244 |
| 241 void TrayVolume::DestroyDetailedView() { | 245 void TrayVolume::DestroyDetailedView() { |
| 242 if (!is_default_view_) | 246 if (!is_default_view_) |
| 243 volume_view_ = NULL; | 247 volume_view_ = NULL; |
| 244 } | 248 } |
| 245 | 249 |
| 246 void TrayVolume::OnVolumeChanged(float percent) { | 250 void TrayVolume::OnVolumeChanged(float percent) { |
| 247 if (tray_view()) | 251 if (tray_view()) |
| 248 tray_view()->SetVisible(GetInitialVisibility()); | 252 tray_view()->SetVisible(GetInitialVisibility()); |
| 249 | 253 |
| 250 if (volume_view_) { | 254 if (volume_view_) { |
| 251 if (ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted()) | 255 if (IsAudioMuted()) |
| 252 percent = 0.0; | 256 percent = 0.0; |
| 253 volume_view_->SetVolumeLevel(percent); | 257 volume_view_->SetVolumeLevel(percent); |
| 254 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); | 258 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); |
| 255 return; | 259 return; |
| 256 } | 260 } |
| 257 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); | 261 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); |
| 258 } | 262 } |
| 259 | 263 |
| 260 void TrayVolume::OnMuteToggled() { | 264 void TrayVolume::OnMuteToggled() { |
| 261 if (tray_view()) | 265 if (tray_view()) |
| 262 tray_view()->SetVisible(GetInitialVisibility()); | 266 tray_view()->SetVisible(GetInitialVisibility()); |
| 263 | 267 |
| 264 if (volume_view_) | 268 if (volume_view_) |
| 265 volume_view_->Update(); | 269 volume_view_->Update(); |
| 266 else | 270 else |
| 267 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); | 271 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); |
| 268 } | 272 } |
| 269 | 273 |
| 270 } // namespace internal | 274 } // namespace internal |
| 271 } // namespace ash | 275 } // namespace ash |
| OLD | NEW |