diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-07 17:33:39 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-07 17:33:39 +0000 |
commit | f676780687464428e340d008a0d1ca13d9944628 (patch) | |
tree | 489e8bd8188e31a7f6c53f15e8d1d9c6ba36d023 /ui/base/animation/multi_animation.cc | |
parent | 3b65bfd55c56cf8a6db025087d937494f49dc15f (diff) | |
download | chromium_src-f676780687464428e340d008a0d1ca13d9944628.zip chromium_src-f676780687464428e340d008a0d1ca13d9944628.tar.gz chromium_src-f676780687464428e340d008a0d1ca13d9944628.tar.bz2 |
Move animation code to new ui/base/animation directory.
BUG=none
TEST=none
TBR=brettw
Review URL: http://codereview.chromium.org/6154001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70743 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/base/animation/multi_animation.cc')
-rw-r--r-- | ui/base/animation/multi_animation.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/ui/base/animation/multi_animation.cc b/ui/base/animation/multi_animation.cc new file mode 100644 index 0000000..5a0c1e1 --- /dev/null +++ b/ui/base/animation/multi_animation.cc @@ -0,0 +1,88 @@ +// 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/multi_animation.h" + +#include "base/logging.h" +#include "ui/base/animation/animation_delegate.h" + +namespace ui { + +// Default interval, in ms. +static const int kDefaultInterval = 20; + +static int TotalTime(const MultiAnimation::Parts& parts) { + int time_ms = 0; + for (size_t i = 0; i < parts.size(); ++i) { + DCHECK(parts[i].end_time_ms - parts[i].start_time_ms >= parts[i].time_ms); + time_ms += parts[i].time_ms; + } + return time_ms; +} + +MultiAnimation::MultiAnimation(const Parts& parts) + : Animation(base::TimeDelta::FromMilliseconds(kDefaultInterval)), + parts_(parts), + cycle_time_ms_(TotalTime(parts)), + current_value_(0), + current_part_index_(0), + continuous_(true) { + DCHECK(!parts_.empty()); +} + +MultiAnimation::~MultiAnimation() {} + +double MultiAnimation::GetCurrentValue() const { + return current_value_; +} + +void MultiAnimation::Step(base::TimeTicks time_now) { + double last_value = current_value_; + size_t last_index = current_part_index_; + + int delta = static_cast<int>((time_now - start_time()).InMilliseconds()); + if (delta >= cycle_time_ms_ && !continuous_) { + current_part_index_ = parts_.size() - 1; + current_value_ = Tween::CalculateValue(parts_[current_part_index_].type, 1); + Stop(); + return; + } + delta %= cycle_time_ms_; + const Part& part = GetPart(&delta, ¤t_part_index_); + double percent = static_cast<double>(delta + part.start_time_ms) / + static_cast<double>(part.end_time_ms); + DCHECK(percent <= 1); + current_value_ = Tween::CalculateValue(part.type, percent); + + if ((current_value_ != last_value || current_part_index_ != last_index) && + delegate()) { + delegate()->AnimationProgressed(this); + } +} + +void MultiAnimation::SetStartTime(base::TimeTicks start_time) { + Animation::SetStartTime(start_time); + current_value_ = 0; + current_part_index_ = 0; +} + +const MultiAnimation::Part& MultiAnimation::GetPart(int* time_ms, + size_t* part_index) { + DCHECK(*time_ms < cycle_time_ms_); + + for (size_t i = 0; i < parts_.size(); ++i) { + if (*time_ms < parts_[i].time_ms) { + *part_index = i; + return parts_[i]; + } + + *time_ms -= parts_[i].time_ms; + } + NOTREACHED(); + *time_ms = 0; + *part_index = 0; + return parts_[0]; +} + +} // namespace ui |