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

Side by Side Diff: chrome/browser/chromeos/status/volume_menu_button.cc

Issue 9169033: Support for showing/hiding status area volume controls in desktop devices (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: move IsMixerInitialized Created 8 years, 11 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 "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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698