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