diff options
Diffstat (limited to 'ash/system/tray/throbber_view.cc')
-rw-r--r-- | ash/system/tray/throbber_view.cc | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/ash/system/tray/throbber_view.cc b/ash/system/tray/throbber_view.cc new file mode 100644 index 0000000..89d4ed4 --- /dev/null +++ b/ash/system/tray/throbber_view.cc @@ -0,0 +1,110 @@ +// Copyright (c) 2013 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/tray/throbber_view.h" + +#include "ash/system/tray/tray_constants.h" +#include "grit/ash_resources.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/scoped_layer_animation_settings.h" + +namespace ash { +namespace internal { + +namespace { + +// Time in ms per throbber frame. +const int kThrobberFrameMs = 30; + +// Duration for showing/hiding animation in milliseconds. +const int kThrobberAnimationDurationMs = 200; + +} // namespace + +SystemTrayThrobber::SystemTrayThrobber(int frame_delay_ms) + : views::SmoothedThrobber(frame_delay_ms) { +} + +SystemTrayThrobber::~SystemTrayThrobber() { +} + +void SystemTrayThrobber::SetTooltipText(const string16& tooltip_text) { + tooltip_text_ = tooltip_text; +} + +bool SystemTrayThrobber::GetTooltipText(const gfx::Point& p, + string16* tooltip) const { + if (tooltip_text_.empty()) + return false; + + *tooltip = tooltip_text_; + return true; +} + +ThrobberView::ThrobberView() { + throbber_ = new SystemTrayThrobber(kThrobberFrameMs); + throbber_->SetFrames(ui::ResourceBundle::GetSharedInstance().GetImageNamed( + IDR_AURA_CROS_DEFAULT_THROBBER).ToImageSkia()); + throbber_->set_stop_delay_ms(kThrobberAnimationDurationMs); + AddChildView(throbber_); + + SetPaintToLayer(true); + layer()->SetFillsBoundsOpaquely(false); + layer()->SetOpacity(0.0); +} + +ThrobberView::~ThrobberView() { +} + +gfx::Size ThrobberView::GetPreferredSize() { + return gfx::Size(ash::kTrayPopupItemHeight, ash::kTrayPopupItemHeight); +} + +void ThrobberView::Layout() { + View* child = child_at(0); + gfx::Size ps = child->GetPreferredSize(); + child->SetBounds((width() - ps.width()) / 2, + (height() - ps.height()) / 2, + ps.width(), ps.height()); + SizeToPreferredSize(); +} + +bool ThrobberView::GetTooltipText(const gfx::Point& p, + string16* tooltip) const { + if (tooltip_text_.empty()) + return false; + + *tooltip = tooltip_text_; + return true; +} + +void ThrobberView::Start() { + ScheduleAnimation(true); + throbber_->Start(); +} + +void ThrobberView::Stop() { + ScheduleAnimation(false); + throbber_->Stop(); +} + +void ThrobberView::SetTooltipText(const string16& tooltip_text) { + tooltip_text_ = tooltip_text; + throbber_->SetTooltipText(tooltip_text); +} + +void ThrobberView::ScheduleAnimation(bool start_throbber) { + // Stop any previous animation. + layer()->GetAnimator()->StopAnimating(); + + ui::ScopedLayerAnimationSettings animation(layer()->GetAnimator()); + animation.SetTransitionDuration( + base::TimeDelta::FromMilliseconds(kThrobberAnimationDurationMs)); + + layer()->SetOpacity(start_throbber ? 1.0 : 0.0); +} + +} // namespace internal +} // namespace ash |