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" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 } | 56 } |
57 | 57 |
58 virtual ~VolumeButton() {} | 58 virtual ~VolumeButton() {} |
59 | 59 |
60 void Update() { | 60 void Update() { |
61 ash::SystemTrayDelegate* delegate = | 61 ash::SystemTrayDelegate* delegate = |
62 ash::Shell::GetInstance()->tray_delegate(); | 62 ash::Shell::GetInstance()->tray_delegate(); |
63 float level = delegate->GetVolumeLevel(); | 63 float level = delegate->GetVolumeLevel(); |
64 int image_index = delegate->IsAudioMuted() ? | 64 int image_index = delegate->IsAudioMuted() ? |
65 0 : (level == 1.0 ? | 65 0 : (level == 1.0 ? |
66 kVolumeLevels : std::ceil(level * (kVolumeLevels - 1))); | 66 kVolumeLevels : |
67 | 67 std::max(1, int(std::ceil(level * (kVolumeLevels - 1))))); |
68 if (image_index != image_index_) { | 68 if (image_index != image_index_) { |
69 gfx::Rect region(0, image_index * kVolumeImageHeight, | 69 gfx::Rect region(0, image_index * kVolumeImageHeight, |
70 kVolumeImageWidth, kVolumeImageHeight); | 70 kVolumeImageWidth, kVolumeImageHeight); |
71 gfx::ImageSkia image_skia = gfx::ImageSkiaOperations::ExtractSubset( | 71 gfx::ImageSkia image_skia = gfx::ImageSkiaOperations::ExtractSubset( |
72 *(image_.ToImageSkia()), region); | 72 *(image_.ToImageSkia()), region); |
73 SetImage(views::CustomButton::BS_NORMAL, &image_skia); | 73 SetImage(views::CustomButton::BS_NORMAL, &image_skia); |
74 image_index_ = image_index; | 74 image_index_ = image_index; |
75 } | 75 } |
76 SchedulePaint(); | 76 SchedulePaint(); |
77 } | 77 } |
(...skipping 25 matching lines...) Expand all Loading... |
103 void Update() { | 103 void Update() { |
104 ash::SystemTrayDelegate* delegate = | 104 ash::SystemTrayDelegate* delegate = |
105 ash::Shell::GetInstance()->tray_delegate(); | 105 ash::Shell::GetInstance()->tray_delegate(); |
106 UpdateButton(delegate->IsAudioMuted()); | 106 UpdateButton(delegate->IsAudioMuted()); |
107 SchedulePaint(); | 107 SchedulePaint(); |
108 } | 108 } |
109 | 109 |
110 DISALLOW_COPY_AND_ASSIGN(MuteButton); | 110 DISALLOW_COPY_AND_ASSIGN(MuteButton); |
111 }; | 111 }; |
112 | 112 |
| 113 class VolumeSlider : public views::Slider { |
| 114 public: |
| 115 explicit VolumeSlider(views::SliderListener* listener) |
| 116 : views::Slider(listener, views::Slider::HORIZONTAL) { |
| 117 set_focus_border_color(kFocusBorderColor); |
| 118 SetValue(ash::Shell::GetInstance()->tray_delegate()->GetVolumeLevel()); |
| 119 SetAccessibleName( |
| 120 ui::ResourceBundle::GetSharedInstance().GetLocalizedString( |
| 121 IDS_ASH_STATUS_TRAY_VOLUME)); |
| 122 Update(); |
| 123 } |
| 124 virtual ~VolumeSlider() {} |
| 125 |
| 126 void Update() { |
| 127 UpdateState(!ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted()); |
| 128 } |
| 129 |
| 130 DISALLOW_COPY_AND_ASSIGN(VolumeSlider); |
| 131 }; |
| 132 |
113 class VolumeView : public views::View, | 133 class VolumeView : public views::View, |
114 public views::ButtonListener, | 134 public views::ButtonListener, |
115 public views::SliderListener { | 135 public views::SliderListener { |
116 public: | 136 public: |
117 VolumeView() { | 137 VolumeView() { |
118 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, | 138 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, |
119 kTrayPopupPaddingHorizontal, 0, kTrayPopupPaddingBetweenItems)); | 139 kTrayPopupPaddingHorizontal, 0, kTrayPopupPaddingBetweenItems)); |
120 | 140 |
121 icon_ = new VolumeButton(this); | 141 icon_ = new VolumeButton(this); |
122 AddChildView(icon_); | 142 AddChildView(icon_); |
123 | 143 |
124 mute_ = new MuteButton(this); | 144 mute_ = new MuteButton(this); |
125 AddChildView(mute_); | 145 AddChildView(mute_); |
126 | 146 |
127 ash::SystemTrayDelegate* delegate = | 147 slider_ = new VolumeSlider(this); |
128 ash::Shell::GetInstance()->tray_delegate(); | |
129 slider_ = new views::Slider(this, views::Slider::HORIZONTAL); | |
130 slider_->set_focus_border_color(kFocusBorderColor); | |
131 slider_->SetValue( | |
132 delegate->IsAudioMuted() ? 0.0 : delegate->GetVolumeLevel()); | |
133 slider_->SetAccessibleName( | |
134 ui::ResourceBundle::GetSharedInstance().GetLocalizedString( | |
135 IDS_ASH_STATUS_TRAY_VOLUME)); | |
136 AddChildView(slider_); | 148 AddChildView(slider_); |
137 } | 149 } |
138 | 150 |
139 virtual ~VolumeView() {} | 151 virtual ~VolumeView() {} |
140 | 152 |
| 153 void Update() { |
| 154 icon_->Update(); |
| 155 mute_->Update(); |
| 156 slider_->Update(); |
| 157 } |
| 158 |
141 void SetVolumeLevel(float percent) { | 159 void SetVolumeLevel(float percent) { |
142 // The change in volume will be reflected via accessibility system events, | 160 // The change in volume will be reflected via accessibility system events, |
143 // so we prevent the UI event from being sent here. | 161 // so we prevent the UI event from being sent here. |
144 slider_->set_enable_accessibility_events(false); | 162 slider_->set_enable_accessibility_events(false); |
145 slider_->SetValue(percent); | 163 slider_->SetValue(percent); |
146 // It is possible that the volume was (un)muted, but the actual volume level | 164 // It is possible that the volume was (un)muted, but the actual volume level |
147 // did not change. In that case, setting the value of the slider won't | 165 // did not change. In that case, setting the value of the slider won't |
148 // trigger an update. So explicitly trigger an update. | 166 // trigger an update. So explicitly trigger an update. |
149 icon_->Update(); | 167 Update(); |
150 mute_->Update(); | |
151 slider_->set_enable_accessibility_events(true); | 168 slider_->set_enable_accessibility_events(true); |
152 } | 169 } |
153 | 170 |
154 private: | 171 private: |
155 // Overridden from views::View. | 172 // Overridden from views::View. |
156 virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE { | 173 virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE { |
157 int w = width() - slider_->x(); | 174 int w = width() - slider_->x(); |
158 slider_->SetSize(gfx::Size(w, slider_->height())); | 175 slider_->SetSize(gfx::Size(w, slider_->height())); |
159 } | 176 } |
160 | 177 |
(...skipping 14 matching lines...) Expand all Loading... |
175 if (reason == views::VALUE_CHANGED_BY_USER) { | 192 if (reason == views::VALUE_CHANGED_BY_USER) { |
176 ash::SystemTrayDelegate* delegate = | 193 ash::SystemTrayDelegate* delegate = |
177 ash::Shell::GetInstance()->tray_delegate(); | 194 ash::Shell::GetInstance()->tray_delegate(); |
178 delegate->SetVolumeLevel(value); | 195 delegate->SetVolumeLevel(value); |
179 } | 196 } |
180 icon_->Update(); | 197 icon_->Update(); |
181 } | 198 } |
182 | 199 |
183 VolumeButton* icon_; | 200 VolumeButton* icon_; |
184 MuteButton* mute_; | 201 MuteButton* mute_; |
185 views::Slider* slider_; | 202 VolumeSlider* slider_; |
186 | 203 |
187 DISALLOW_COPY_AND_ASSIGN(VolumeView); | 204 DISALLOW_COPY_AND_ASSIGN(VolumeView); |
188 }; | 205 }; |
189 | 206 |
190 } // namespace tray | 207 } // namespace tray |
191 | 208 |
192 TrayVolume::TrayVolume() | 209 TrayVolume::TrayVolume() |
193 : TrayImageItem(IDR_AURA_UBER_TRAY_VOLUME_MUTE), | 210 : TrayImageItem(IDR_AURA_UBER_TRAY_VOLUME_MUTE), |
194 volume_view_(NULL), | 211 volume_view_(NULL), |
195 is_default_view_(false) { | 212 is_default_view_(false) { |
196 } | 213 } |
197 | 214 |
198 TrayVolume::~TrayVolume() { | 215 TrayVolume::~TrayVolume() { |
199 } | 216 } |
200 | 217 |
201 bool TrayVolume::GetInitialVisibility() { | 218 bool TrayVolume::GetInitialVisibility() { |
202 ash::SystemTrayDelegate* delegate = | 219 ash::SystemTrayDelegate* delegate = |
203 ash::Shell::GetInstance()->tray_delegate(); | 220 ash::Shell::GetInstance()->tray_delegate(); |
204 return delegate->GetVolumeLevel() == 0.0 || delegate->IsAudioMuted(); | 221 return delegate->IsAudioMuted(); |
205 } | 222 } |
206 | 223 |
207 views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) { | 224 views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) { |
208 volume_view_ = new tray::VolumeView; | 225 volume_view_ = new tray::VolumeView; |
209 is_default_view_ = true; | 226 is_default_view_ = true; |
210 return volume_view_; | 227 return volume_view_; |
211 } | 228 } |
212 | 229 |
213 views::View* TrayVolume::CreateDetailedView(user::LoginStatus status) { | 230 views::View* TrayVolume::CreateDetailedView(user::LoginStatus status) { |
214 volume_view_ = new tray::VolumeView; | 231 volume_view_ = new tray::VolumeView; |
(...skipping 18 matching lines...) Expand all Loading... |
233 if (volume_view_) { | 250 if (volume_view_) { |
234 if (ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted()) | 251 if (ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted()) |
235 percent = 0.0; | 252 percent = 0.0; |
236 volume_view_->SetVolumeLevel(percent); | 253 volume_view_->SetVolumeLevel(percent); |
237 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); | 254 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); |
238 return; | 255 return; |
239 } | 256 } |
240 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); | 257 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); |
241 } | 258 } |
242 | 259 |
| 260 void TrayVolume::OnMuteToggled() { |
| 261 if (tray_view()) |
| 262 tray_view()->SetVisible(GetInitialVisibility()); |
| 263 |
| 264 if (volume_view_) |
| 265 volume_view_->Update(); |
| 266 } |
| 267 |
243 } // namespace internal | 268 } // namespace internal |
244 } // namespace ash | 269 } // namespace ash |
OLD | NEW |