diff options
Diffstat (limited to 'ui/base/animation/animation.cc')
-rw-r--r-- | ui/base/animation/animation.cc | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/ui/base/animation/animation.cc b/ui/base/animation/animation.cc new file mode 100644 index 0000000..1824774 --- /dev/null +++ b/ui/base/animation/animation.cc @@ -0,0 +1,124 @@ +// Copyright (c) 2011 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 "ui/base/animation/animation.h" + +#include "gfx/rect.h" +#include "ui/base/animation/animation_container.h" +#include "ui/base/animation/animation_delegate.h" +#include "ui/base/animation/tween.h" + +#if defined(OS_WIN) +#include "base/win/windows_version.h" +#endif + +namespace ui { + +Animation::Animation(base::TimeDelta timer_interval) + : timer_interval_(timer_interval), + is_animating_(false), + delegate_(NULL) { +} + +Animation::~Animation() { + // Don't send out notification from the destructor. Chances are the delegate + // owns us and is being deleted as well. + if (is_animating_) + container_->Stop(this); +} + +void Animation::Start() { + if (is_animating_) + return; + + if (!container_.get()) + container_ = new AnimationContainer(); + + is_animating_ = true; + + container_->Start(this); + + AnimationStarted(); +} + +void Animation::Stop() { + if (!is_animating_) + return; + + is_animating_ = false; + + // Notify the container first as the delegate may delete us. + container_->Stop(this); + + AnimationStopped(); + + if (delegate_) { + if (ShouldSendCanceledFromStop()) + delegate_->AnimationCanceled(this); + else + delegate_->AnimationEnded(this); + } +} + +double Animation::CurrentValueBetween(double start, double target) const { + return Tween::ValueBetween(GetCurrentValue(), start, target); +} + +int Animation::CurrentValueBetween(int start, int target) const { + return Tween::ValueBetween(GetCurrentValue(), start, target); +} + +gfx::Rect Animation::CurrentValueBetween(const gfx::Rect& start_bounds, + const gfx::Rect& target_bounds) const { + return Tween::ValueBetween(GetCurrentValue(), start_bounds, target_bounds); +} + +void Animation::SetContainer(AnimationContainer* container) { + if (container == container_.get()) + return; + + if (is_animating_) + container_->Stop(this); + + if (container) + container_ = container; + else + container_ = new AnimationContainer(); + + if (is_animating_) + container_->Start(this); +} + +// static +bool Animation::ShouldRenderRichAnimation() { +#if defined(OS_WIN) + if (base::win::GetVersion() >= base::win::VERSION_VISTA) { + BOOL result; + // Get "Turn off all unnecessary animations" value. + if (::SystemParametersInfo(SPI_GETCLIENTAREAANIMATION, 0, &result, 0)) { + // There seems to be a typo in the MSDN document (as of May 2009): + // http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx + // The document states that the result is TRUE when animations are + // _disabled_, but in fact, it is TRUE when they are _enabled_. + return !!result; + } + } + return !::GetSystemMetrics(SM_REMOTESESSION); +#endif + return true; +} + +bool Animation::ShouldSendCanceledFromStop() { + return false; +} + +void Animation::SetStartTime(base::TimeTicks start_time) { + start_time_ = start_time; +} + +base::TimeDelta Animation::GetTimerInterval() const { + return timer_interval_; +} + +} // namespace ui |