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