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

Unified Diff: content/browser/web_contents/aura/overscroll_window_animation.cc

Issue 895543005: Refactor GestureNavigation to eliminate code redundancy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Following suggestions by Mikhail, rewritten OWA to use a delegate interface (to be implemented) Created 5 years, 10 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
Index: content/browser/web_contents/aura/overscroll_window_animation.cc
diff --git a/content/browser/web_contents/aura/overscroll_window_animation.cc b/content/browser/web_contents/aura/overscroll_window_animation.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1646a4d53bde3f694ccb5eee4d4aad13d84acc3b
--- /dev/null
+++ b/content/browser/web_contents/aura/overscroll_window_animation.cc
@@ -0,0 +1,117 @@
+// Copyright (c) 2015 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 "content/browser/web_contents/aura/overscroll_window_animation.h"
+
+#include "ui/compositor/layer_animation_observer.h"
+#include "ui/compositor/scoped_layer_animation_settings.h"
+
+namespace content {
+
+OverscrollWindowAnimation::OverscrollWindowAnimation(
+ Delegate* delegate)
+ : delegate_(delegate),
+ direction_(NONE),
+ overscroll_cancelled_(false),
+ animation_completed_(true) {
mfomitchev 2015/02/19 19:04:59 It's a bit weird initialized completed to true giv
Nina 2015/02/27 19:32:51 Done.
+}
+
+OverscrollWindowAnimation::~OverscrollWindowAnimation() {
+ LOG(ERROR) << "OWA destructor";
+}
+
+void OverscrollWindowAnimation::CancelOverscroll() {
+ LOG(ERROR) << "Cancelling animation";
+ overscroll_cancelled_ = true;
+ ui::ScopedLayerAnimationSettings settings(delegate_->GetAnimator());
+ settings.SetPreemptionStrategy(
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
+ settings.SetTweenType(gfx::Tween::EASE_OUT);
+ settings.AddObserver(this);
+ delegate_->SetTransform(gfx::Transform());
+ direction_ = NONE;
+}
+
+void OverscrollWindowAnimation::AbortAllAnimations() {
mfomitchev 2015/02/19 19:04:59 This method is called only once. Consider getting
Nina 2015/02/27 19:32:51 Done.
+ delegate_->GetAnimator()->AbortAllAnimations();
+}
+
+bool OverscrollWindowAnimation::IsSlideInProgress() const {
mfomitchev 2015/02/19 19:04:59 Lets call this something else. Perhaps IsAnimation
Nina 2015/02/27 19:32:51 Done.
+ return !animation_completed_;
+}
+
+void OverscrollWindowAnimation::OnImplicitAnimationsCompleted() {
+ animation_completed_ = true;
+ delegate_->OnAnimationCompleted();
+}
+
+gfx::Vector2dF OverscrollWindowAnimation::GetTranslationForOverscroll(
+ float delta_x) {
+ DCHECK(direction_ != NONE);
+ const float bounds_width = delegate_->GetContentsBounds().width();
+ if (direction_ == FORWARD)
+ return gfx::Vector2dF(std::max(-bounds_width, delta_x), 0);
+ else
+ return gfx::Vector2dF(std::min(bounds_width, delta_x), 0);
+}
+
+gfx::Rect OverscrollWindowAnimation::GetVisibleBounds() const {
+ return delegate_->GetContentsBounds();
+}
+
+bool OverscrollWindowAnimation::OnOverscrollUpdate(float delta_x,
+ float delta_y) {
+ if (direction_ == NONE)
+ return false;
+ LOG(ERROR) << "OWA: OnOverscrollUpdate";
+ gfx::Vector2dF translate = GetTranslationForOverscroll(delta_x);
+ gfx::Transform transform;
+ transform.Translate(translate.x(), translate.y());
+ delegate_->SetTransform(transform);
+ return true;
+}
+
+void OverscrollWindowAnimation::OnOverscrollModeChange(
+ OverscrollMode old_mode,
+ OverscrollMode new_mode) {
+ LOG(ERROR) << "OWA: OnOverscrollModeChange";
+ AbortAllAnimations();
mfomitchev 2015/02/19 19:04:59 Seems like an overkill to call this every time. We
Nina 2015/02/27 19:32:51 Done.
+ direction_ = delegate_->StartNavigation(new_mode);
mfomitchev 2015/02/19 19:04:59 StartNavigation(OVERSCROLL_NONE) sounds a bit misl
Nina 2015/02/27 19:32:51 This should no longer be the case after changing t
+
+ if (direction_ == NONE) {
+ // The user cancelled the in progress overscroll gesture.
+ // TODO(nsatragno): in this case, show a feedback animation.
+ if (IsSlideInProgress())
+ CancelOverscroll();
+ return;
+ }
+ StartAnimating();
+}
+
+void OverscrollWindowAnimation::StartAnimating() {
mfomitchev 2015/02/19 19:04:59 I don't see much reason for the existence of this
Nina 2015/02/27 19:32:51 Removed.
+ LOG(ERROR) << "OWA: StartAnimating";
+ overscroll_cancelled_ = false;
+ animation_completed_ = false;
+}
+
+void OverscrollWindowAnimation::OnOverscrollComplete(
+ OverscrollMode overscroll_mode) {
+ LOG(ERROR) << "OWA: OnOverscrollComplete";
+ delegate_->OnAnimationCompleting();
+ ui::ScopedLayerAnimationSettings settings(delegate_->GetAnimator());
+ settings.SetPreemptionStrategy(
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
+ settings.SetTweenType(gfx::Tween::EASE_OUT);
+ settings.AddObserver(this);
+ gfx::Transform transform;
+ int content_width = delegate_->GetContentsBounds().width();
+ float translate_x = static_cast<float>(
+ direction_ == FORWARD ? -content_width
+ : content_width);
+ transform.Translate(translate_x, 0);
+ delegate_->SetTransform(transform);
+ direction_ = NONE;
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698