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 "chrome/browser/chromeos/status/volume_menu_button.h" | 5 #include "chrome/browser/chromeos/status/volume_menu_button.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | |
10 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
| 10 #include "chrome/browser/chromeos/audio/audio_handler.h" |
11 #include "chrome/browser/chromeos/status/status_area_bubble.h" | 11 #include "chrome/browser/chromeos/status/status_area_bubble.h" |
12 #include "chrome/browser/chromeos/system/runtime_environment.h" | |
13 #include "chrome/browser/chromeos/view_ids.h" | 12 #include "chrome/browser/chromeos/view_ids.h" |
14 #include "chrome/common/chrome_switches.h" | |
15 #include "grit/generated_resources.h" | 13 #include "grit/generated_resources.h" |
16 #include "grit/theme_resources.h" | 14 #include "grit/theme_resources.h" |
17 #include "ui/base/l10n/l10n_util.h" | 15 #include "ui/base/l10n/l10n_util.h" |
18 #include "ui/base/resource/resource_bundle.h" | 16 #include "ui/base/resource/resource_bundle.h" |
19 #include "ui/gfx/canvas.h" | 17 #include "ui/gfx/canvas.h" |
20 #include "ui/gfx/canvas_skia.h" | 18 #include "ui/gfx/canvas_skia.h" |
21 #include "ui/gfx/image/image.h" | 19 #include "ui/gfx/image/image.h" |
22 #include "ui/views/controls/menu/menu_item_view.h" | 20 #include "ui/views/controls/menu/menu_item_view.h" |
23 #include "ui/views/controls/menu/menu_runner.h" | 21 #include "ui/views/controls/menu/menu_runner.h" |
24 #include "ui/views/controls/menu/submenu_view.h" | 22 #include "ui/views/controls/menu/submenu_view.h" |
25 | 23 |
26 namespace chromeos { | |
27 | |
28 namespace { | 24 namespace { |
29 | 25 |
30 const int kMenuItemId = 100; // arbitrary menu id. | 26 static const int kMenuItemId = 100; // arbitrary menu id. |
31 // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide. | 27 // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide. |
32 const int kVolumeMenuWidth = 27; | 28 static const int kVolumeMenuWidth = 27; |
33 const int kVolumeIconWidth = 20; | 29 static const int kVolumeIconWidth = 20; |
34 | |
35 bool ShouldShowStatusAreaVolume() { | |
36 return CommandLine::ForCurrentProcess()-> | |
37 HasSwitch(switches::kShowVolumeStatus); | |
38 } | |
39 | 30 |
40 //////////////////////////////////////////////////////////////////////////////// | 31 //////////////////////////////////////////////////////////////////////////////// |
41 // AudioHandler helpers | 32 // AudioHandler helpers |
42 | 33 |
43 // Used when not running on a ChromeOS device. | 34 // Used when not running on a ChromeOS device. |
44 static int g_volume_percent = 0; | 35 static int g_volume_percent = 0; |
45 | 36 |
| 37 chromeos::AudioHandler* GetAudioHandler() { |
| 38 chromeos::AudioHandler* audio_handler = chromeos::AudioHandler::GetInstance(); |
| 39 return audio_handler && audio_handler->IsInitialized() ? |
| 40 audio_handler : NULL; |
| 41 } |
| 42 |
46 int GetVolumePercent() { | 43 int GetVolumePercent() { |
47 AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized(); | 44 chromeos::AudioHandler* audio_handler = GetAudioHandler(); |
48 if (audio_handler) | 45 return audio_handler ? audio_handler->GetVolumePercent() : g_volume_percent; |
49 return audio_handler->IsMuted() ? 0 : audio_handler->GetVolumePercent(); | |
50 return g_volume_percent; | |
51 } | 46 } |
52 | 47 |
53 void SetVolumePercent(int percent) { | 48 void SetVolumePercent(int percent) { |
54 AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized(); | 49 chromeos::AudioHandler* audio_handler = GetAudioHandler(); |
55 if (audio_handler) | 50 if (audio_handler) |
56 audio_handler->SetVolumePercent(percent); | 51 audio_handler->SetVolumePercent(percent); |
57 g_volume_percent = percent; | 52 g_volume_percent = percent; |
58 } | 53 } |
59 | 54 |
60 void AddVolumeObserver(AudioHandler::VolumeObserver* volume_observer) { | |
61 if (system::runtime_environment::IsRunningOnChromeOS()) | |
62 AudioHandler::GetInstance()->AddVolumeObserver(volume_observer); | |
63 } | |
64 | |
65 void RemoveVolumeObserver(AudioHandler::VolumeObserver* volume_observer) { | |
66 if (system::runtime_environment::IsRunningOnChromeOS()) | |
67 AudioHandler::GetInstance()->RemoveVolumeObserver(volume_observer); | |
68 } | |
69 | |
70 //////////////////////////////////////////////////////////////////////////////// | 55 //////////////////////////////////////////////////////////////////////////////// |
71 // SkBitmap helpers | 56 // SkBitmap helpers |
72 | 57 |
73 const SkBitmap* GetImageNamed(int image_index) { | 58 const SkBitmap* GetImageNamed(int image_index) { |
74 return ResourceBundle::GetSharedInstance(). | 59 return ResourceBundle::GetSharedInstance(). |
75 GetImageNamed(image_index).ToSkBitmap(); | 60 GetImageNamed(image_index).ToSkBitmap(); |
76 } | 61 } |
77 | 62 |
78 const SkBitmap* GetIcon() { | 63 const SkBitmap* GetIcon() { |
79 const int volume_percent = GetVolumePercent(); | 64 const int volume_percent = GetVolumePercent(); |
80 int image_index = IDR_STATUSBAR_VOLUME_ICON_MUTE; | 65 int image_index = IDR_STATUSBAR_VOLUME_ICON_MUTE; |
81 | 66 |
82 if (volume_percent > 67) | 67 if (volume_percent > 67) |
83 image_index = IDR_STATUSBAR_VOLUME_ICON3; | 68 image_index = IDR_STATUSBAR_VOLUME_ICON3; |
84 else if (volume_percent > 33) | 69 else if (volume_percent > 33) |
85 image_index = IDR_STATUSBAR_VOLUME_ICON2; | 70 image_index = IDR_STATUSBAR_VOLUME_ICON2; |
86 else if (volume_percent > 0) | 71 else if (volume_percent > 0) |
87 image_index = IDR_STATUSBAR_VOLUME_ICON1; | 72 image_index = IDR_STATUSBAR_VOLUME_ICON1; |
88 | 73 |
89 return GetImageNamed(image_index); | 74 return GetImageNamed(image_index); |
90 } | 75 } |
91 | 76 |
92 //////////////////////////////////////////////////////////////////////////////// | 77 //////////////////////////////////////////////////////////////////////////////// |
93 // VolumeControlView | 78 // VolumeControlView |
94 | 79 |
95 class VolumeControlView : public views::View, | 80 class VolumeControlView : public views::View { |
96 public AudioHandler::VolumeObserver { | |
97 public: | 81 public: |
98 explicit VolumeControlView(VolumeMenuButton* volume_menu_button); | 82 explicit VolumeControlView(chromeos::VolumeMenuButton* volume_menu_button); |
99 virtual ~VolumeControlView(); | |
100 | 83 |
101 private: | 84 private: |
102 // views::View overrides: | 85 // views::View overrides: |
103 virtual gfx::Size GetPreferredSize() OVERRIDE; | 86 virtual gfx::Size GetPreferredSize() OVERRIDE; |
104 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; | 87 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
105 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; | 88 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; |
106 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; | 89 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; |
107 | 90 |
108 // AudioHandler::VolumeObserver overrides: | 91 chromeos::VolumeMenuButton* volume_menu_button_; |
109 virtual void OnVolumeChanged() OVERRIDE; | |
110 | |
111 VolumeMenuButton* volume_menu_button_; // not owned. | |
112 | 92 |
113 const SkBitmap* slider_empty_; | 93 const SkBitmap* slider_empty_; |
114 const SkBitmap* slider_full_; | 94 const SkBitmap* slider_full_; |
115 const SkBitmap* thumb_; | 95 const SkBitmap* thumb_; |
116 | 96 |
117 int slider_w_; | 97 int slider_w_; |
118 int slider_h_; | 98 int slider_h_; |
119 int thumb_h_; | 99 int thumb_h_; |
120 | 100 |
121 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); | 101 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); |
122 }; | 102 }; |
123 | 103 |
124 VolumeControlView::VolumeControlView( | 104 VolumeControlView::VolumeControlView( |
125 VolumeMenuButton* volume_menu_button) | 105 chromeos::VolumeMenuButton* volume_menu_button) |
126 : volume_menu_button_(volume_menu_button), | 106 : volume_menu_button_(volume_menu_button), |
127 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), | 107 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), |
128 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), | 108 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), |
129 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), | 109 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), |
130 slider_w_(slider_empty_->width()), | 110 slider_w_(slider_empty_->width()), |
131 slider_h_(slider_empty_->height()), | 111 slider_h_(slider_empty_->height()), |
132 thumb_h_(thumb_->height()) { | 112 thumb_h_(thumb_->height()) { |
133 DCHECK_EQ(slider_w_, slider_full_->width()); | 113 DCHECK_EQ(slider_w_, slider_full_->width()); |
134 AddVolumeObserver(this); | |
135 } | |
136 | |
137 VolumeControlView::~VolumeControlView() { | |
138 RemoveVolumeObserver(this); | |
139 } | 114 } |
140 | 115 |
141 gfx::Size VolumeControlView::GetPreferredSize() { | 116 gfx::Size VolumeControlView::GetPreferredSize() { |
142 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_); | 117 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_); |
143 } | 118 } |
144 | 119 |
145 void VolumeControlView::OnPaint(gfx::Canvas* canvas) { | 120 void VolumeControlView::OnPaint(gfx::Canvas* canvas) { |
146 const int slider_x = (width() - slider_w_) / 2; | 121 const int slider_x = (width() - slider_w_) / 2; |
147 const int thumb_x = (width() - thumb_->width()) / 2; | 122 const int thumb_x = (width() - thumb_->width()) / 2; |
148 const int slider_empty_y = thumb_->height() / 2.0; | 123 const int slider_empty_y = thumb_->height() / 2.0; |
(...skipping 30 matching lines...) Expand all Loading... |
179 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y), | 154 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y), |
180 slider_h_), 0) * 100 / slider_h_); | 155 slider_h_), 0) * 100 / slider_h_); |
181 if (new_volume != GetVolumePercent()) { | 156 if (new_volume != GetVolumePercent()) { |
182 SetVolumePercent(new_volume); | 157 SetVolumePercent(new_volume); |
183 SchedulePaint(); | 158 SchedulePaint(); |
184 volume_menu_button_->UpdateIcon(); | 159 volume_menu_button_->UpdateIcon(); |
185 } | 160 } |
186 return true; | 161 return true; |
187 } | 162 } |
188 | 163 |
189 void VolumeControlView::OnVolumeChanged() { | |
190 SchedulePaint(); | |
191 } | |
192 | |
193 } // namespace | 164 } // namespace |
194 | 165 |
| 166 namespace chromeos { |
| 167 |
195 //////////////////////////////////////////////////////////////////////////////// | 168 //////////////////////////////////////////////////////////////////////////////// |
196 // VolumeMenuButton | 169 // VolumeMenuButton |
197 | 170 |
198 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) | 171 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) |
199 : StatusAreaButton(delegate, this) { | 172 : StatusAreaButton(delegate, this) { |
200 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); | 173 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); |
201 UpdateIcon(); | 174 UpdateIcon(); |
202 SetVisible(ShouldShowStatusAreaVolume()); | 175 // TODO(achuith): Query SystemKeyEventListener to determine when we |
203 AddVolumeObserver(this); | 176 // can show statusbar volume controls. |
| 177 SetVisible(false); |
204 } | 178 } |
205 | 179 |
206 VolumeMenuButton::~VolumeMenuButton() { | 180 VolumeMenuButton::~VolumeMenuButton() { |
207 RemoveVolumeObserver(this); | |
208 } | 181 } |
209 | 182 |
210 int VolumeMenuButton::icon_width() { | 183 int VolumeMenuButton::icon_width() { |
211 return kVolumeIconWidth; | 184 return kVolumeIconWidth; |
212 } | 185 } |
213 | 186 |
214 void VolumeMenuButton::UpdateIcon() { | 187 void VolumeMenuButton::UpdateIcon() { |
215 const int volume_percent = GetVolumePercent(); | 188 const int volume_percent = GetVolumePercent(); |
216 string16 tooltip_text = (volume_percent == 0) | 189 string16 tooltip_text = (volume_percent == 0) |
217 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) | 190 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) |
218 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, | 191 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, |
219 base::IntToString16(volume_percent)); | 192 base::IntToString16(volume_percent)); |
220 SetTooltipText(tooltip_text); | 193 SetTooltipText(tooltip_text); |
221 SetAccessibleName(tooltip_text); | 194 SetAccessibleName(tooltip_text); |
222 | 195 |
223 SetIcon(*GetIcon()); | 196 SetIcon(*GetIcon()); |
224 SchedulePaint(); | 197 SchedulePaint(); |
225 } | 198 } |
226 | 199 |
227 void VolumeMenuButton::OnLocaleChanged() { | 200 void VolumeMenuButton::OnLocaleChanged() { |
228 UpdateIcon(); | 201 UpdateIcon(); |
229 } | 202 } |
230 | 203 |
231 void VolumeMenuButton::OnVolumeChanged() { | |
232 UpdateIcon(); | |
233 } | |
234 | |
235 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { | 204 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { |
236 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide | 205 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide |
237 // for our purposes here. | 206 // for our purposes here. |
238 views::MenuItemView* menu = new views::MenuItemView(this); | 207 views::MenuItemView* menu = new views::MenuItemView(this); |
239 // MenuRunner takes ownership of |menu|. | 208 // MenuRunner takes ownership of |menu|. |
240 views::MenuRunner* menu_runner = new views::MenuRunner(menu); | 209 views::MenuRunner* menu_runner = new views::MenuRunner(menu); |
241 views::MenuItemView* submenu = menu->AppendMenuItem( | 210 views::MenuItemView* submenu = menu->AppendMenuItem( |
242 kMenuItemId, | 211 kMenuItemId, |
243 string16(), | 212 string16(), |
244 views::MenuItemView::NORMAL); | 213 views::MenuItemView::NORMAL); |
(...skipping 13 matching lines...) Expand all Loading... |
258 this, | 227 this, |
259 bounds, | 228 bounds, |
260 views::MenuItemView::TOPRIGHT, | 229 views::MenuItemView::TOPRIGHT, |
261 views::MenuRunner::HAS_MNEMONICS); | 230 views::MenuRunner::HAS_MNEMONICS); |
262 | 231 |
263 if (result != views::MenuRunner::MENU_DELETED) | 232 if (result != views::MenuRunner::MENU_DELETED) |
264 delete menu_runner; | 233 delete menu_runner; |
265 } | 234 } |
266 | 235 |
267 } // namespace chromeos | 236 } // namespace chromeos |
OLD | NEW |