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

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

Issue 9310018: Revert 119948 - Support for showing/hiding status area volume controls in desktop devices. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: 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"
10 #include "base/string_number_conversions.h" 9 #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"
13 #include "chrome/browser/chromeos/view_ids.h" 12 #include "chrome/browser/chromeos/view_ids.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "grit/generated_resources.h" 13 #include "grit/generated_resources.h"
16 #include "grit/theme_resources.h" 14 #include "grit/theme_resources.h"
17 #include "ui/base/l10n/l10n_util.h" 15 #include "ui/base/l10n/l10n_util.h"
18 #include "ui/base/resource/resource_bundle.h" 16 #include "ui/base/resource/resource_bundle.h"
19 #include "ui/gfx/canvas.h" 17 #include "ui/gfx/canvas.h"
20 #include "ui/gfx/canvas_skia.h" 18 #include "ui/gfx/canvas_skia.h"
21 #include "ui/gfx/image/image.h" 19 #include "ui/gfx/image/image.h"
22 #include "ui/views/controls/menu/menu_item_view.h" 20 #include "ui/views/controls/menu/menu_item_view.h"
23 #include "ui/views/controls/menu/menu_runner.h" 21 #include "ui/views/controls/menu/menu_runner.h"
24 #include "ui/views/controls/menu/submenu_view.h" 22 #include "ui/views/controls/menu/submenu_view.h"
25 23
26 namespace chromeos {
27
28 namespace { 24 namespace {
29 25
30 const int kMenuItemId = 100; // arbitrary menu id. 26 static const int kMenuItemId = 100; // arbitrary menu id.
31 // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide. 27 // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide.
32 const int kVolumeMenuWidth = 27; 28 static const int kVolumeMenuWidth = 27;
33 const int kVolumeIconWidth = 20; 29 static const int kVolumeIconWidth = 20;
34
35 bool ShouldShowStatusAreaVolume() {
36 return CommandLine::ForCurrentProcess()->
37 HasSwitch(switches::kShowVolumeStatus);
38 }
39 30
40 //////////////////////////////////////////////////////////////////////////////// 31 ////////////////////////////////////////////////////////////////////////////////
41 // AudioHandler helpers 32 // AudioHandler helpers
42 33
43 // Used when not running on a ChromeOS device. 34 // Used when not running on a ChromeOS device.
44 static int g_volume_percent = 0; 35 static int g_volume_percent = 0;
45 36
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
46 int GetVolumePercent() { 43 int GetVolumePercent() {
47 AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized(); 44 chromeos::AudioHandler* audio_handler = GetAudioHandler();
48 if (audio_handler) 45 return audio_handler ? audio_handler->GetVolumePercent() : g_volume_percent;
49 return audio_handler->IsMuted() ? 0 : audio_handler->GetVolumePercent();
50 return g_volume_percent;
51 } 46 }
52 47
53 void SetVolumePercent(int percent) { 48 void SetVolumePercent(int percent) {
54 AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized(); 49 chromeos::AudioHandler* audio_handler = GetAudioHandler();
55 if (audio_handler) 50 if (audio_handler)
56 audio_handler->SetVolumePercent(percent); 51 audio_handler->SetVolumePercent(percent);
57 g_volume_percent = percent; 52 g_volume_percent = percent;
58 } 53 }
59 54
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
70 //////////////////////////////////////////////////////////////////////////////// 55 ////////////////////////////////////////////////////////////////////////////////
71 // SkBitmap helpers 56 // SkBitmap helpers
72 57
73 const SkBitmap* GetImageNamed(int image_index) { 58 const SkBitmap* GetImageNamed(int image_index) {
74 return ResourceBundle::GetSharedInstance(). 59 return ResourceBundle::GetSharedInstance().
75 GetImageNamed(image_index).ToSkBitmap(); 60 GetImageNamed(image_index).ToSkBitmap();
76 } 61 }
77 62
78 const SkBitmap* GetIcon() { 63 const SkBitmap* GetIcon() {
79 const int volume_percent = GetVolumePercent(); 64 const int volume_percent = GetVolumePercent();
80 int image_index = IDR_STATUSBAR_VOLUME_ICON_MUTE; 65 int image_index = IDR_STATUSBAR_VOLUME_ICON_MUTE;
81 66
82 if (volume_percent > 67) 67 if (volume_percent > 67)
83 image_index = IDR_STATUSBAR_VOLUME_ICON3; 68 image_index = IDR_STATUSBAR_VOLUME_ICON3;
84 else if (volume_percent > 33) 69 else if (volume_percent > 33)
85 image_index = IDR_STATUSBAR_VOLUME_ICON2; 70 image_index = IDR_STATUSBAR_VOLUME_ICON2;
86 else if (volume_percent > 0) 71 else if (volume_percent > 0)
87 image_index = IDR_STATUSBAR_VOLUME_ICON1; 72 image_index = IDR_STATUSBAR_VOLUME_ICON1;
88 73
89 return GetImageNamed(image_index); 74 return GetImageNamed(image_index);
90 } 75 }
91 76
92 //////////////////////////////////////////////////////////////////////////////// 77 ////////////////////////////////////////////////////////////////////////////////
93 // VolumeControlView 78 // VolumeControlView
94 79
95 class VolumeControlView : public views::View, 80 class VolumeControlView : public views::View {
96 public AudioHandler::VolumeObserver {
97 public: 81 public:
98 explicit VolumeControlView(VolumeMenuButton* volume_menu_button); 82 explicit VolumeControlView(chromeos::VolumeMenuButton* volume_menu_button);
99 virtual ~VolumeControlView();
100 83
101 private: 84 private:
102 // views::View overrides: 85 // views::View overrides:
103 virtual gfx::Size GetPreferredSize() OVERRIDE; 86 virtual gfx::Size GetPreferredSize() OVERRIDE;
104 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 87 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
105 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 88 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
106 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; 89 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
107 90
108 // AudioHandler::VolumeObserver overrides: 91 chromeos::VolumeMenuButton* volume_menu_button_;
109 virtual void OnVolumeChanged() OVERRIDE;
110
111 VolumeMenuButton* volume_menu_button_; // not owned.
112 92
113 const SkBitmap* slider_empty_; 93 const SkBitmap* slider_empty_;
114 const SkBitmap* slider_full_; 94 const SkBitmap* slider_full_;
115 const SkBitmap* thumb_; 95 const SkBitmap* thumb_;
116 96
117 int slider_w_; 97 int slider_w_;
118 int slider_h_; 98 int slider_h_;
119 int thumb_h_; 99 int thumb_h_;
120 100
121 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); 101 DISALLOW_COPY_AND_ASSIGN(VolumeControlView);
122 }; 102 };
123 103
124 VolumeControlView::VolumeControlView( 104 VolumeControlView::VolumeControlView(
125 VolumeMenuButton* volume_menu_button) 105 chromeos::VolumeMenuButton* volume_menu_button)
126 : volume_menu_button_(volume_menu_button), 106 : volume_menu_button_(volume_menu_button),
127 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), 107 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)),
128 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), 108 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)),
129 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), 109 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)),
130 slider_w_(slider_empty_->width()), 110 slider_w_(slider_empty_->width()),
131 slider_h_(slider_empty_->height()), 111 slider_h_(slider_empty_->height()),
132 thumb_h_(thumb_->height()) { 112 thumb_h_(thumb_->height()) {
133 DCHECK_EQ(slider_w_, slider_full_->width()); 113 DCHECK_EQ(slider_w_, slider_full_->width());
134 AddVolumeObserver(this);
135 }
136
137 VolumeControlView::~VolumeControlView() {
138 RemoveVolumeObserver(this);
139 } 114 }
140 115
141 gfx::Size VolumeControlView::GetPreferredSize() { 116 gfx::Size VolumeControlView::GetPreferredSize() {
142 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_); 117 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_);
143 } 118 }
144 119
145 void VolumeControlView::OnPaint(gfx::Canvas* canvas) { 120 void VolumeControlView::OnPaint(gfx::Canvas* canvas) {
146 const int slider_x = (width() - slider_w_) / 2; 121 const int slider_x = (width() - slider_w_) / 2;
147 const int thumb_x = (width() - thumb_->width()) / 2; 122 const int thumb_x = (width() - thumb_->width()) / 2;
148 const int slider_empty_y = thumb_->height() / 2.0; 123 const int slider_empty_y = thumb_->height() / 2.0;
(...skipping 30 matching lines...) Expand all
179 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y), 154 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y),
180 slider_h_), 0) * 100 / slider_h_); 155 slider_h_), 0) * 100 / slider_h_);
181 if (new_volume != GetVolumePercent()) { 156 if (new_volume != GetVolumePercent()) {
182 SetVolumePercent(new_volume); 157 SetVolumePercent(new_volume);
183 SchedulePaint(); 158 SchedulePaint();
184 volume_menu_button_->UpdateIcon(); 159 volume_menu_button_->UpdateIcon();
185 } 160 }
186 return true; 161 return true;
187 } 162 }
188 163
189 void VolumeControlView::OnVolumeChanged() {
190 SchedulePaint();
191 }
192
193 } // namespace 164 } // namespace
194 165
166 namespace chromeos {
167
195 //////////////////////////////////////////////////////////////////////////////// 168 ////////////////////////////////////////////////////////////////////////////////
196 // VolumeMenuButton 169 // VolumeMenuButton
197 170
198 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) 171 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate)
199 : StatusAreaButton(delegate, this) { 172 : StatusAreaButton(delegate, this) {
200 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); 173 set_id(VIEW_ID_STATUS_BUTTON_VOLUME);
201 UpdateIcon(); 174 UpdateIcon();
202 SetVisible(ShouldShowStatusAreaVolume()); 175 // TODO(achuith): Query SystemKeyEventListener to determine when we
203 AddVolumeObserver(this); 176 // can show statusbar volume controls.
177 SetVisible(false);
204 } 178 }
205 179
206 VolumeMenuButton::~VolumeMenuButton() { 180 VolumeMenuButton::~VolumeMenuButton() {
207 RemoveVolumeObserver(this);
208 } 181 }
209 182
210 int VolumeMenuButton::icon_width() { 183 int VolumeMenuButton::icon_width() {
211 return kVolumeIconWidth; 184 return kVolumeIconWidth;
212 } 185 }
213 186
214 void VolumeMenuButton::UpdateIcon() { 187 void VolumeMenuButton::UpdateIcon() {
215 const int volume_percent = GetVolumePercent(); 188 const int volume_percent = GetVolumePercent();
216 string16 tooltip_text = (volume_percent == 0) 189 string16 tooltip_text = (volume_percent == 0)
217 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) 190 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE)
218 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, 191 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE,
219 base::IntToString16(volume_percent)); 192 base::IntToString16(volume_percent));
220 SetTooltipText(tooltip_text); 193 SetTooltipText(tooltip_text);
221 SetAccessibleName(tooltip_text); 194 SetAccessibleName(tooltip_text);
222 195
223 SetIcon(*GetIcon()); 196 SetIcon(*GetIcon());
224 SchedulePaint(); 197 SchedulePaint();
225 } 198 }
226 199
227 void VolumeMenuButton::OnLocaleChanged() { 200 void VolumeMenuButton::OnLocaleChanged() {
228 UpdateIcon(); 201 UpdateIcon();
229 } 202 }
230 203
231 void VolumeMenuButton::OnVolumeChanged() {
232 UpdateIcon();
233 }
234
235 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { 204 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) {
236 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide 205 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide
237 // for our purposes here. 206 // for our purposes here.
238 views::MenuItemView* menu = new views::MenuItemView(this); 207 views::MenuItemView* menu = new views::MenuItemView(this);
239 // MenuRunner takes ownership of |menu|. 208 // MenuRunner takes ownership of |menu|.
240 views::MenuRunner* menu_runner = new views::MenuRunner(menu); 209 views::MenuRunner* menu_runner = new views::MenuRunner(menu);
241 views::MenuItemView* submenu = menu->AppendMenuItem( 210 views::MenuItemView* submenu = menu->AppendMenuItem(
242 kMenuItemId, 211 kMenuItemId,
243 string16(), 212 string16(),
244 views::MenuItemView::NORMAL); 213 views::MenuItemView::NORMAL);
(...skipping 13 matching lines...) Expand all
258 this, 227 this,
259 bounds, 228 bounds,
260 views::MenuItemView::TOPRIGHT, 229 views::MenuItemView::TOPRIGHT,
261 views::MenuRunner::HAS_MNEMONICS); 230 views::MenuRunner::HAS_MNEMONICS);
262 231
263 if (result != views::MenuRunner::MENU_DELETED) 232 if (result != views::MenuRunner::MENU_DELETED)
264 delete menu_runner; 233 delete menu_runner;
265 } 234 }
266 235
267 } // namespace chromeos 236 } // 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