Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |