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 |