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

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 fixes 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 static 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 static const int kVolumeMenuWidth = 27;
29 static const int kVolumeIconWidth = 20; 33 static const int kVolumeIconWidth = 20;
30 34
35 bool ShowStatusAreaVolume() {
Daniel Erat 2012/01/26 17:55:21 rename to "ShouldShowStatusAreaVolume"; otherwise
achuithb 2012/01/27 01:48:05 Done.
36 return CommandLine::ForCurrentProcess()->
37 HasSwitch(switches::kShowStatusAreaVolume);
38 }
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::GetInitialized();
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::GetInitialized();
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
55 //////////////////////////////////////////////////////////////////////////////// 60 ////////////////////////////////////////////////////////////////////////////////
56 // SkBitmap helpers 61 // SkBitmap helpers
57 62
58 const SkBitmap* GetImageNamed(int image_index) { 63 const SkBitmap* GetImageNamed(int image_index) {
59 return ResourceBundle::GetSharedInstance(). 64 return ResourceBundle::GetSharedInstance().
(...skipping 10 matching lines...) Expand all
70 image_index = IDR_STATUSBAR_VOLUME_ICON2; 75 image_index = IDR_STATUSBAR_VOLUME_ICON2;
71 else if (volume_percent > 0) 76 else if (volume_percent > 0)
72 image_index = IDR_STATUSBAR_VOLUME_ICON1; 77 image_index = IDR_STATUSBAR_VOLUME_ICON1;
73 78
74 return GetImageNamed(image_index); 79 return GetImageNamed(image_index);
75 } 80 }
76 81
77 //////////////////////////////////////////////////////////////////////////////// 82 ////////////////////////////////////////////////////////////////////////////////
78 // VolumeControlView 83 // VolumeControlView
79 84
80 class VolumeControlView : public views::View { 85 class VolumeControlView : public views::View,
86 public AudioHandler::VolumeObserver {
81 public: 87 public:
82 explicit VolumeControlView(chromeos::VolumeMenuButton* volume_menu_button); 88 explicit VolumeControlView(VolumeMenuButton* volume_menu_button);
83 89
84 private: 90 private:
85 // views::View overrides: 91 // views::View overrides:
86 virtual gfx::Size GetPreferredSize() OVERRIDE; 92 virtual gfx::Size GetPreferredSize() OVERRIDE;
87 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 93 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
88 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 94 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
89 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; 95 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
90 96
91 chromeos::VolumeMenuButton* volume_menu_button_; 97 // AudioHandler::VolumeObserver overrides:
98 virtual void OnVolumeChanged() OVERRIDE;
99
100 VolumeMenuButton* volume_menu_button_;
92 101
93 const SkBitmap* slider_empty_; 102 const SkBitmap* slider_empty_;
94 const SkBitmap* slider_full_; 103 const SkBitmap* slider_full_;
95 const SkBitmap* thumb_; 104 const SkBitmap* thumb_;
96 105
97 int slider_w_; 106 int slider_w_;
98 int slider_h_; 107 int slider_h_;
99 int thumb_h_; 108 int thumb_h_;
100 109
101 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); 110 DISALLOW_COPY_AND_ASSIGN(VolumeControlView);
102 }; 111 };
103 112
104 VolumeControlView::VolumeControlView( 113 VolumeControlView::VolumeControlView(
105 chromeos::VolumeMenuButton* volume_menu_button) 114 VolumeMenuButton* volume_menu_button)
106 : volume_menu_button_(volume_menu_button), 115 : volume_menu_button_(volume_menu_button),
107 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), 116 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)),
108 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), 117 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)),
109 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), 118 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)),
110 slider_w_(slider_empty_->width()), 119 slider_w_(slider_empty_->width()),
111 slider_h_(slider_empty_->height()), 120 slider_h_(slider_empty_->height()),
112 thumb_h_(thumb_->height()) { 121 thumb_h_(thumb_->height()) {
113 DCHECK_EQ(slider_w_, slider_full_->width()); 122 DCHECK_EQ(slider_w_, slider_full_->width());
114 } 123 }
115 124
(...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), 163 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y),
155 slider_h_), 0) * 100 / slider_h_); 164 slider_h_), 0) * 100 / slider_h_);
156 if (new_volume != GetVolumePercent()) { 165 if (new_volume != GetVolumePercent()) {
157 SetVolumePercent(new_volume); 166 SetVolumePercent(new_volume);
158 SchedulePaint(); 167 SchedulePaint();
159 volume_menu_button_->UpdateIcon(); 168 volume_menu_button_->UpdateIcon();
160 } 169 }
161 return true; 170 return true;
162 } 171 }
163 172
173 void VolumeControlView::OnVolumeChanged() {
174 SchedulePaint();
175 }
176
164 } // namespace 177 } // namespace
165 178
166 namespace chromeos {
167
168 //////////////////////////////////////////////////////////////////////////////// 179 ////////////////////////////////////////////////////////////////////////////////
169 // VolumeMenuButton 180 // VolumeMenuButton
170 181
171 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) 182 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate)
172 : StatusAreaButton(delegate, this) { 183 : StatusAreaButton(delegate, this) {
173 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); 184 set_id(VIEW_ID_STATUS_BUTTON_VOLUME);
174 UpdateIcon(); 185 UpdateIcon();
175 // TODO(achuith): Query SystemKeyEventListener to determine when we 186 SetVisible(ShowStatusAreaVolume());
176 // can show statusbar volume controls.
177 SetVisible(false);
178 } 187 }
179 188
180 VolumeMenuButton::~VolumeMenuButton() { 189 VolumeMenuButton::~VolumeMenuButton() {
181 } 190 }
182 191
183 int VolumeMenuButton::icon_width() { 192 int VolumeMenuButton::icon_width() {
184 return kVolumeIconWidth; 193 return kVolumeIconWidth;
185 } 194 }
186 195
187 void VolumeMenuButton::UpdateIcon() { 196 void VolumeMenuButton::UpdateIcon() {
188 const int volume_percent = GetVolumePercent(); 197 const int volume_percent = GetVolumePercent();
189 string16 tooltip_text = (volume_percent == 0) 198 string16 tooltip_text = (volume_percent == 0)
190 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) 199 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE)
191 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, 200 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE,
192 base::IntToString16(volume_percent)); 201 base::IntToString16(volume_percent));
193 SetTooltipText(tooltip_text); 202 SetTooltipText(tooltip_text);
194 SetAccessibleName(tooltip_text); 203 SetAccessibleName(tooltip_text);
195 204
196 SetIcon(*GetIcon()); 205 SetIcon(*GetIcon());
197 SchedulePaint(); 206 SchedulePaint();
198 } 207 }
199 208
200 void VolumeMenuButton::OnLocaleChanged() { 209 void VolumeMenuButton::OnLocaleChanged() {
201 UpdateIcon(); 210 UpdateIcon();
202 } 211 }
203 212
213 void VolumeMenuButton::OnVolumeChanged() {
214 UpdateIcon();
215 }
216
204 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { 217 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) {
205 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide 218 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide
206 // for our purposes here. 219 // for our purposes here.
207 views::MenuItemView* menu = new views::MenuItemView(this); 220 views::MenuItemView* menu = new views::MenuItemView(this);
208 // MenuRunner takes ownership of |menu|. 221 // MenuRunner takes ownership of |menu|.
209 views::MenuRunner* menu_runner = new views::MenuRunner(menu); 222 views::MenuRunner* menu_runner = new views::MenuRunner(menu);
210 views::MenuItemView* submenu = menu->AppendMenuItem( 223 views::MenuItemView* submenu = menu->AppendMenuItem(
211 kMenuItemId, 224 kMenuItemId,
212 string16(), 225 string16(),
213 views::MenuItemView::NORMAL); 226 views::MenuItemView::NORMAL);
(...skipping 13 matching lines...) Expand all
227 this, 240 this,
228 bounds, 241 bounds,
229 views::MenuItemView::TOPRIGHT, 242 views::MenuItemView::TOPRIGHT,
230 views::MenuRunner::HAS_MNEMONICS); 243 views::MenuRunner::HAS_MNEMONICS);
231 244
232 if (result != views::MenuRunner::MENU_DELETED) 245 if (result != views::MenuRunner::MENU_DELETED)
233 delete menu_runner; 246 delete menu_runner;
234 } 247 }
235 248
236 } // namespace chromeos 249 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698