| // 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 base::string16& tooltip_text) { |
| tooltip_text_ = tooltip_text; |
| } |
| |
| bool SystemTrayThrobber::GetTooltipText(const gfx::Point& p, |
| base::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, |
| base::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 base::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 |