Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(285)

Side by Side Diff: ash/system/audio/tray_volume.cc

Issue 10825264: Consolidate volume control code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase and VolumeControlDelegate only accesible via SystemTrayDelegate. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 volume_control_delegate()->IsAudioMuted();
42 } 47 }
43 48
49 float GetVolumeLevel() {
50 return Shell::GetInstance()->tray_delegate()->
51 volume_control_delegate()->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
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
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 volume_control_delegate()->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 volume_control_delegate()->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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698