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

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: rebase 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 virtual ~VolumeControlView();
83 100
84 private: 101 private:
85 // views::View overrides: 102 // views::View overrides:
86 virtual gfx::Size GetPreferredSize() OVERRIDE; 103 virtual gfx::Size GetPreferredSize() OVERRIDE;
87 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 104 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
88 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 105 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
89 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; 106 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
90 107
91 chromeos::VolumeMenuButton* volume_menu_button_; 108 // AudioHandler::VolumeObserver overrides:
109 virtual void OnVolumeChanged() OVERRIDE;
110
111 VolumeMenuButton* volume_menu_button_; // not owned.
92 112
93 const SkBitmap* slider_empty_; 113 const SkBitmap* slider_empty_;
94 const SkBitmap* slider_full_; 114 const SkBitmap* slider_full_;
95 const SkBitmap* thumb_; 115 const SkBitmap* thumb_;
96 116
97 int slider_w_; 117 int slider_w_;
98 int slider_h_; 118 int slider_h_;
99 int thumb_h_; 119 int thumb_h_;
100 120
101 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); 121 DISALLOW_COPY_AND_ASSIGN(VolumeControlView);
102 }; 122 };
103 123
104 VolumeControlView::VolumeControlView( 124 VolumeControlView::VolumeControlView(
105 chromeos::VolumeMenuButton* volume_menu_button) 125 VolumeMenuButton* volume_menu_button)
106 : volume_menu_button_(volume_menu_button), 126 : volume_menu_button_(volume_menu_button),
107 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), 127 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)),
108 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), 128 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)),
109 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), 129 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)),
110 slider_w_(slider_empty_->width()), 130 slider_w_(slider_empty_->width()),
111 slider_h_(slider_empty_->height()), 131 slider_h_(slider_empty_->height()),
112 thumb_h_(thumb_->height()) { 132 thumb_h_(thumb_->height()) {
113 DCHECK_EQ(slider_w_, slider_full_->width()); 133 DCHECK_EQ(slider_w_, slider_full_->width());
134 AddVolumeObserver(this);
135 }
136
137 VolumeControlView::~VolumeControlView() {
138 RemoveVolumeObserver(this);
114 } 139 }
115 140
116 gfx::Size VolumeControlView::GetPreferredSize() { 141 gfx::Size VolumeControlView::GetPreferredSize() {
117 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_); 142 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_);
118 } 143 }
119 144
120 void VolumeControlView::OnPaint(gfx::Canvas* canvas) { 145 void VolumeControlView::OnPaint(gfx::Canvas* canvas) {
121 const int slider_x = (width() - slider_w_) / 2; 146 const int slider_x = (width() - slider_w_) / 2;
122 const int thumb_x = (width() - thumb_->width()) / 2; 147 const int thumb_x = (width() - thumb_->width()) / 2;
123 const int slider_empty_y = thumb_->height() / 2.0; 148 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), 179 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y),
155 slider_h_), 0) * 100 / slider_h_); 180 slider_h_), 0) * 100 / slider_h_);
156 if (new_volume != GetVolumePercent()) { 181 if (new_volume != GetVolumePercent()) {
157 SetVolumePercent(new_volume); 182 SetVolumePercent(new_volume);
158 SchedulePaint(); 183 SchedulePaint();
159 volume_menu_button_->UpdateIcon(); 184 volume_menu_button_->UpdateIcon();
160 } 185 }
161 return true; 186 return true;
162 } 187 }
163 188
189 void VolumeControlView::OnVolumeChanged() {
190 SchedulePaint();
191 }
192
164 } // namespace 193 } // namespace
165 194
166 namespace chromeos {
167
168 //////////////////////////////////////////////////////////////////////////////// 195 ////////////////////////////////////////////////////////////////////////////////
169 // VolumeMenuButton 196 // VolumeMenuButton
170 197
171 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) 198 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate)
172 : StatusAreaButton(delegate, this) { 199 : StatusAreaButton(delegate, this) {
173 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); 200 set_id(VIEW_ID_STATUS_BUTTON_VOLUME);
174 UpdateIcon(); 201 UpdateIcon();
175 // TODO(achuith): Query SystemKeyEventListener to determine when we 202 SetVisible(ShouldShowStatusAreaVolume());
176 // can show statusbar volume controls. 203 AddVolumeObserver(this);
177 SetVisible(false);
178 } 204 }
179 205
180 VolumeMenuButton::~VolumeMenuButton() { 206 VolumeMenuButton::~VolumeMenuButton() {
207 RemoveVolumeObserver(this);
181 } 208 }
182 209
183 int VolumeMenuButton::icon_width() { 210 int VolumeMenuButton::icon_width() {
184 return kVolumeIconWidth; 211 return kVolumeIconWidth;
185 } 212 }
186 213
187 void VolumeMenuButton::UpdateIcon() { 214 void VolumeMenuButton::UpdateIcon() {
188 const int volume_percent = GetVolumePercent(); 215 const int volume_percent = GetVolumePercent();
189 string16 tooltip_text = (volume_percent == 0) 216 string16 tooltip_text = (volume_percent == 0)
190 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) 217 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE)
191 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, 218 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE,
192 base::IntToString16(volume_percent)); 219 base::IntToString16(volume_percent));
193 SetTooltipText(tooltip_text); 220 SetTooltipText(tooltip_text);
194 SetAccessibleName(tooltip_text); 221 SetAccessibleName(tooltip_text);
195 222
196 SetIcon(*GetIcon()); 223 SetIcon(*GetIcon());
197 SchedulePaint(); 224 SchedulePaint();
198 } 225 }
199 226
200 void VolumeMenuButton::OnLocaleChanged() { 227 void VolumeMenuButton::OnLocaleChanged() {
201 UpdateIcon(); 228 UpdateIcon();
202 } 229 }
203 230
231 void VolumeMenuButton::OnVolumeChanged() {
232 UpdateIcon();
233 }
234
204 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { 235 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) {
205 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide 236 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide
206 // for our purposes here. 237 // for our purposes here.
207 views::MenuItemView* menu = new views::MenuItemView(this); 238 views::MenuItemView* menu = new views::MenuItemView(this);
208 // MenuRunner takes ownership of |menu|. 239 // MenuRunner takes ownership of |menu|.
209 views::MenuRunner* menu_runner = new views::MenuRunner(menu); 240 views::MenuRunner* menu_runner = new views::MenuRunner(menu);
210 views::MenuItemView* submenu = menu->AppendMenuItem( 241 views::MenuItemView* submenu = menu->AppendMenuItem(
211 kMenuItemId, 242 kMenuItemId,
212 string16(), 243 string16(),
213 views::MenuItemView::NORMAL); 244 views::MenuItemView::NORMAL);
(...skipping 13 matching lines...) Expand all
227 this, 258 this,
228 bounds, 259 bounds,
229 views::MenuItemView::TOPRIGHT, 260 views::MenuItemView::TOPRIGHT,
230 views::MenuRunner::HAS_MNEMONICS); 261 views::MenuRunner::HAS_MNEMONICS);
231 262
232 if (result != views::MenuRunner::MENU_DELETED) 263 if (result != views::MenuRunner::MENU_DELETED)
233 delete menu_runner; 264 delete menu_runner;
234 } 265 }
235 266
236 } // namespace chromeos 267 } // 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