Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(947)

Unified Diff: views/animator.cc

Issue 42490: Experiments with a new tabstrip + animator (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: '' Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/animator.h ('k') | views/views.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/animator.cc
===================================================================
--- views/animator.cc (revision 0)
+++ views/animator.cc (revision 0)
@@ -0,0 +1,151 @@
+// Copyright (c) 2009 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 "views/animator.h"
+
+#include <algorithm>
+
+#include "app/slide_animation.h"
+#include "views/view.h"
+
+namespace views {
+
+////////////////////////////////////////////////////////////////////////////////
+// Animator, public:
+
+Animator::Animator(View* host)
+ : host_(host),
+ delegate_(NULL),
+ direction_(ANIMATE_NONE) {
+ InitAnimation();
+}
+
+Animator::Animator(View* host, AnimatorDelegate* delegate)
+ : host_(host),
+ animation_(NULL),
+ delegate_(delegate),
+ direction_(ANIMATE_NONE) {
+ InitAnimation();
+}
+
+Animator::~Animator() {
+ // Explicitly NULL the delegate so we don't call back through to the delegate
+ // when the animation is stopped. The Animator is designed to be owned by a
+ // View and at this point the View is dust.
+ delegate_ = NULL;
+ animation_->Stop();
+}
+
+bool Animator::IsAnimating() const {
+ return animation_->IsAnimating();
+}
+
+void Animator::AnimateToBounds(const gfx::Rect& bounds, int direction) {
+ direction_ = direction;
+ start_bounds_ = host_->bounds();
+ target_bounds_ = bounds;
+
+ // Stop any running animation before we have a chance to return.
+ animation_->Stop();
+
+ if (bounds == host_->bounds())
+ return;
+
+ if (direction_ == ANIMATE_NONE) {
+ host_->SetBounds(bounds);
+ return;
+ }
+
+ if (direction_ & ANIMATE_X) {
+ if (direction_ & ANIMATE_CLAMP)
+ start_bounds_.set_x(GetClampedX());
+ } else {
+ start_bounds_.set_x(target_bounds_.x());
+ }
+
+ if (direction_ & ANIMATE_Y) {
+ if (direction_ & ANIMATE_CLAMP)
+ start_bounds_.set_y(GetClampedY());
+ } else {
+ start_bounds_.set_y(target_bounds_.y());
+ }
+
+ if (!(direction_ & ANIMATE_WIDTH))
+ start_bounds_.set_width(target_bounds_.width());
+ if (!(direction_ & ANIMATE_HEIGHT))
+ start_bounds_.set_height(target_bounds_.height());
+
+ // Make sure the host view has the start bounds to avoid a flicker.
+ host_->SetBounds(start_bounds_);
+
+ // Start the animation from the beginning.
+ animation_->Reset(0.0);
+ animation_->Show();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Animator, AnimationDelegate:
+
+void Animator::AnimationEnded(const Animation* animation) {
+ // |delegate_| could be NULL if we're called back from the destructor.
+ if (delegate_)
+ delegate_->AnimationCompletedForHost(host_);
+}
+
+void Animator::AnimationProgressed(const Animation* animation) {
+ int delta_x = target_bounds_.x() - start_bounds_.x();
+ int delta_y = target_bounds_.y() - start_bounds_.y();
+ int delta_width = target_bounds_.width() - start_bounds_.width();
+ int delta_height = target_bounds_.height() - start_bounds_.height();
+
+ // The current frame's position and size is the animation's progress percent
+ // multiplied by the delta between the start and target position/size...
+ double cv = animation_->GetCurrentValue();
+ int frame_x = start_bounds_.x() + static_cast<int>(delta_x * cv);
+ int frame_y = start_bounds_.y() + static_cast<int>(delta_y * cv);
+ // ... except for clamped positions, which remain clamped at the right/bottom
+ // edge of the previous view in the layout flow.
+ if (direction_ & ANIMATE_CLAMP && direction_ & ANIMATE_X)
+ frame_x = GetClampedX();
+ if (direction_ & ANIMATE_CLAMP && direction_ & ANIMATE_Y)
+ frame_y = GetClampedY();
+ int frame_width = start_bounds_.width() + static_cast<int>(delta_width * cv);
+ int frame_height =
+ start_bounds_.height() + static_cast<int>(delta_height * cv);
+ host_->SetBounds(frame_x, frame_y, frame_width, frame_height);
+ host_->GetParent()->SchedulePaint();
+}
+
+void Animator::AnimationCanceled(const Animation* animation) {
+ AnimationEnded(animation);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Animator, private:
+
+void Animator::InitAnimation() {
+ animation_.reset(new SlideAnimation(this));
+ animation_->SetSlideDuration(150);
+ animation_->SetTweenType(SlideAnimation::EASE_OUT);
+}
+
+int Animator::GetClampedX() const {
+ if (delegate_ && direction_ & ANIMATE_CLAMP && direction_ & ANIMATE_X) {
+ View* previous_view = delegate_->GetClampedView(host_);
+ if (previous_view)
+ return previous_view->bounds().right();
+ }
+ return host_->x();
+}
+
+int Animator::GetClampedY() const {
+ if (delegate_ && direction_ & ANIMATE_CLAMP && direction_ & ANIMATE_Y) {
+ View* previous_view = delegate_->GetClampedView(host_);
+ if (previous_view)
+ return previous_view->bounds().bottom();
+ }
+ return host_->y();
+}
+
+} // namespace views
Property changes on: views\animator.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « views/animator.h ('k') | views/views.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698