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

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: minor Created 8 years, 10 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/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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/status/volume_menu_button.h ('k') | chrome/browser/chromeos/system_key_event_listener.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698