diff options
Diffstat (limited to 'chromium/ash/system/brightness/tray_brightness.cc')
-rw-r--r-- | chromium/ash/system/brightness/tray_brightness.cc | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/chromium/ash/system/brightness/tray_brightness.cc b/chromium/ash/system/brightness/tray_brightness.cc new file mode 100644 index 00000000000..93e415fd2ed --- /dev/null +++ b/chromium/ash/system/brightness/tray_brightness.cc @@ -0,0 +1,219 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/brightness/tray_brightness.h" + +#include "ash/accelerators/accelerator_controller.h" +#include "ash/ash_constants.h" +#include "ash/shell.h" +#include "ash/system/brightness/brightness_control_delegate.h" +#include "ash/system/tray/fixed_sized_image_view.h" +#include "ash/system/tray/system_tray_delegate.h" +#include "ash/system/tray/system_tray_notifier.h" +#include "ash/system/tray/tray_constants.h" +#include "base/bind.h" +#include "base/message_loop/message_loop.h" +#include "base/strings/utf_string_conversions.h" +#include "grit/ash_resources.h" +#include "grit/ash_strings.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/controls/label.h" +#include "ui/views/controls/slider.h" +#include "ui/views/layout/box_layout.h" +#include "ui/views/view.h" + +namespace ash { +namespace internal { + +namespace tray { + +namespace { + +// We don't let the screen brightness go lower than this when it's being +// adjusted via the slider. Otherwise, if the user doesn't know about the +// brightness keys, they may turn the backlight off and not know how to turn it +// back on. +const double kMinBrightnessPercent = 5.0; + +} // namespace + +class BrightnessView : public views::View, + public views::SliderListener { + public: + explicit BrightnessView(double initial_percent) + : dragging_(false), + last_percent_(initial_percent) { + SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, + kTrayPopupPaddingHorizontal, 0, kTrayPopupPaddingBetweenItems)); + + views::ImageView* icon = new FixedSizedImageView(0, kTrayPopupItemHeight); + gfx::Image image = ui::ResourceBundle::GetSharedInstance().GetImageNamed( + IDR_AURA_UBER_TRAY_BRIGHTNESS); + icon->SetImage(image.ToImageSkia()); + AddChildView(icon); + + slider_ = new views::Slider(this, views::Slider::HORIZONTAL); + slider_->set_focus_border_color(kFocusBorderColor); + slider_->SetValue(static_cast<float>(initial_percent / 100.0)); + slider_->SetAccessibleName( + ui::ResourceBundle::GetSharedInstance().GetLocalizedString( + IDS_ASH_STATUS_TRAY_BRIGHTNESS)); + AddChildView(slider_); + } + + virtual ~BrightnessView() {} + + // |percent| is in the range [0.0, 100.0]. + void SetBrightnessPercent(double percent) { + last_percent_ = percent; + if (!dragging_) + slider_->SetValue(static_cast<float>(percent / 100.0)); + } + + private: + // Overridden from views::View. + virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE { + int w = width() - slider_->x(); + slider_->SetSize(gfx::Size(w, slider_->height())); + } + + // Overridden from views:SliderListener. + virtual void SliderValueChanged(views::Slider* sender, + float value, + float old_value, + views::SliderChangeReason reason) OVERRIDE { + DCHECK_EQ(sender, slider_); + if (reason != views::VALUE_CHANGED_BY_USER) + return; +#if !defined(OS_MACOSX) + AcceleratorController* ac = Shell::GetInstance()->accelerator_controller(); + if (ac->brightness_control_delegate()) { + double percent = std::max(value * 100.0, kMinBrightnessPercent); + ac->brightness_control_delegate()->SetBrightnessPercent(percent, true); + } +#endif // OS_MACOSX + } + + // Overridden from views:SliderListener. + virtual void SliderDragStarted(views::Slider* slider) OVERRIDE { + DCHECK_EQ(slider, slider_); + dragging_ = true; + } + + // Overridden from views:SliderListener. + virtual void SliderDragEnded(views::Slider* slider) OVERRIDE { + DCHECK_EQ(slider, slider_); + dragging_ = false; + slider_->SetValue(static_cast<float>(last_percent_ / 100.0)); + } + + views::Slider* slider_; + + // Is |slider_| currently being dragged? + bool dragging_; + + // Last brightness level that we observed, in the range [0.0, 100.0]. + double last_percent_; + + DISALLOW_COPY_AND_ASSIGN(BrightnessView); +}; + +} // namespace tray + +TrayBrightness::TrayBrightness(SystemTray* system_tray) + : SystemTrayItem(system_tray), + weak_ptr_factory_(this), + brightness_view_(NULL), + is_default_view_(false), + current_percent_(100.0), + got_current_percent_(false) { + // Post a task to get the initial brightness; the BrightnessControlDelegate + // isn't created yet. + base::MessageLoopForUI::current()->PostTask( + FROM_HERE, + base::Bind(&TrayBrightness::GetInitialBrightness, + weak_ptr_factory_.GetWeakPtr())); + Shell::GetInstance()->system_tray_notifier()->AddBrightnessObserver(this); +} + +TrayBrightness::~TrayBrightness() { + Shell::GetInstance()->system_tray_notifier()->RemoveBrightnessObserver(this); +} + +void TrayBrightness::GetInitialBrightness() { + BrightnessControlDelegate* delegate = + Shell::GetInstance()->accelerator_controller()-> + brightness_control_delegate(); + // Worrisome, but happens in unit tests, so don't log anything. + if (!delegate) + return; + delegate->GetBrightnessPercent( + base::Bind(&TrayBrightness::HandleInitialBrightness, + weak_ptr_factory_.GetWeakPtr())); +} + +void TrayBrightness::HandleInitialBrightness(double percent) { + if (!got_current_percent_) + OnBrightnessChanged(percent, false); +} + +views::View* TrayBrightness::CreateTrayView(user::LoginStatus status) { + return NULL; +} + +views::View* TrayBrightness::CreateDefaultView(user::LoginStatus status) { + return NULL; +} + +views::View* TrayBrightness::CreateDetailedView(user::LoginStatus status) { + CHECK(brightness_view_ == NULL); + brightness_view_ = new tray::BrightnessView(current_percent_); + is_default_view_ = false; + return brightness_view_; +} + +void TrayBrightness::DestroyTrayView() { +} + +void TrayBrightness::DestroyDefaultView() { + if (is_default_view_) + brightness_view_ = NULL; +} + +void TrayBrightness::DestroyDetailedView() { + if (!is_default_view_) + brightness_view_ = NULL; +} + +void TrayBrightness::UpdateAfterLoginStatusChange(user::LoginStatus status) { +} + +bool TrayBrightness::ShouldHideArrow() const { + return true; +} + +bool TrayBrightness::ShouldShowLauncher() const { + return false; +} + +void TrayBrightness::OnBrightnessChanged(double percent, bool user_initiated) { + current_percent_ = percent; + got_current_percent_ = true; + + if (brightness_view_) + brightness_view_->SetBrightnessPercent(percent); + if (!user_initiated) + return; + + if (brightness_view_) + SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); + else + PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); +} + +} // namespace internal +} // namespace ash |