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

Side by Side Diff: chrome/browser/ui/views/frame/scroll_end_effect_controller_ash.cc

Issue 22265009: Implement initial version of scroll end effect Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed another compile issue :-/ Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/frame/scroll_end_effect_controller_ash.h" 5 #include "chrome/browser/ui/views/frame/scroll_end_effect_controller_ash.h"
6 6
7 ScrollEndEffectController* ScrollEndEffectController::Create() { 7 #include "chrome/browser/ui/views/download/download_shelf_view.h"
8 return new ScrollEndEffectControllerAsh(); 8 #include "chrome/browser/ui/views/frame/browser_frame.h"
9 #include "chrome/browser/ui/views/frame/browser_view.h"
10 #include "chrome/browser/ui/views/frame/contents_container.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/browser/web_contents_view.h"
13 #include "ui/aura/window.h"
14 #include "ui/compositor/layer_type.h"
15 #include "ui/gfx/animation/tween.h"
16 #include "ui/gfx/rect_conversions.h"
17 #include "ui/gfx/safe_integer_conversions.h"
18 #include "ui/views/controls/single_split_view.h"
19 #include "ui/views/controls/webview/webview.h"
20
21 namespace {
22 // This factor is used to control how much translation is applied relative to
23 // the size of the window. Specifically translation is limited to a max of
24 // window_size * factor.
25 const float kScrollEndEffectFactor = 0.05f;
26 } // namespace
27
28 ScrollEndEffectController* ScrollEndEffectController::Create(
29 ScrollEndEffectControllerDelegate* delegate) {
30 return new ScrollEndEffectControllerAsh(delegate);
9 } 31 }
10 32
11 ScrollEndEffectControllerAsh::ScrollEndEffectControllerAsh() { 33 ScrollEndEffectControllerAsh::ScrollEndEffectControllerAsh(
34 ScrollEndEffectControllerDelegate* delegate)
35 : delegate_(delegate),
36 is_effect_active_(false),
37 start_delta_y_(0),
38 current_delta_y_(0),
39 end_delta_y_(0) {
40 animation_.reset(new gfx::SlideAnimation(this));
41 animation_->SetSlideDuration(100);
42 animation_->SetTweenType(gfx::Tween::EASE_OUT);
12 } 43 }
13 44
14 ScrollEndEffectControllerAsh::~ScrollEndEffectControllerAsh() { 45 ScrollEndEffectControllerAsh::~ScrollEndEffectControllerAsh() {
15 } 46 }
16 47
17 void ScrollEndEffectControllerAsh::OverscrollUpdate(int delta_y) { 48 void ScrollEndEffectControllerAsh::OverscrollUpdate(int delta_y) {
18 // TODO(rharrison): Implement initial version of scroll end effect 49 if (!is_effect_active_ && delta_y == 0)
50 return;
51
52 if (!is_effect_active_) {
53 ActivateEffect();
sadrul 2013/10/25 18:28:25 no {}
rharrison 2013/11/18 21:52:26 Done.
54 }
55
56 int capped_delta_y = delta_y;
57 // Limiting the delta size being a proportion of the frame bounds size.
58 if (capped_delta_y > 0) {
59 capped_delta_y = std::min(gfx::ToRoundedInt((frame_bounds_.height() *
60 kScrollEndEffectFactor)),
61 capped_delta_y);
62 } else if (capped_delta_y < 0) {
63 capped_delta_y = -std::min(gfx::ToRoundedInt((frame_bounds_.height() *
64 kScrollEndEffectFactor)),
65 -capped_delta_y);
66 }
67
68 start_delta_y_ = current_delta_y_;
69 end_delta_y_ = capped_delta_y;
70 if (end_delta_y_ == 0) {
71 animation_->Reset();
72 animation_->Show();
73 if (animation_->GetSlideDuration() == 0) {
74 AnimationProgressed(animation_.get());
75 AnimationEnded(animation_.get());
76 }
77 } else {
78 animation_->Reset();
79 ApplyDelta(end_delta_y_);
80 }
19 } 81 }
82
83 void ScrollEndEffectControllerAsh::AnimationEnded(
84 const gfx::Animation* animation) {
85 if (current_delta_y_ == 0)
86 DeactivateEffect();
87 }
88
89 void ScrollEndEffectControllerAsh::AnimationProgressed(
90 const gfx::Animation* animation) {
91 ApplyDelta(gfx::Tween::IntValueBetween(animation_->GetCurrentValue(),
92 start_delta_y_,
93 end_delta_y_));
94 }
95
96 void ScrollEndEffectControllerAsh::ActivateEffect() {
97 is_effect_active_ = true;
98 frame_bounds_ = delegate_->GetFrameBounds();
99 delegate_->GetContentsContainer()->ActivateScrollEndEffect();
100 }
101
102 void ScrollEndEffectControllerAsh::DeactivateEffect() {
103 is_effect_active_ = false;
104 delegate_->SetFrameBounds(frame_bounds_);
105 delegate_->GetContentsContainer()->DeactivateScrollEndEffect();
106 }
107
108 void ScrollEndEffectControllerAsh::ApplyDelta(int delta_y) {
109 current_delta_y_ = delta_y;
110 gfx::Rect bounds = frame_bounds_;
111
112 float scale_factor = std::abs(current_delta_y_);
113 scale_factor /= bounds.height();
114 scale_factor = 1 - scale_factor;
sadrul 2013/10/25 18:28:25 float scale_factor = 1 - std::abs(current_delta_y_
rharrison 2013/11/18 21:52:26 Done.
115
116 bounds.set_height(gfx::ToRoundedInt(bounds.height() * scale_factor));
117 bool scrolling_down = current_delta_y_ > 0;
118 if (scrolling_down) {
119 gfx::Point bounds_orig = bounds.origin();
120 bounds_orig.set_y(bounds_orig.y() + current_delta_y_);
121 bounds.set_origin(bounds_orig);
122 }
123 delegate_->SetFrameBounds(bounds);
124 delegate_->GetContentsContainer()->
125 UpdateScrollEndEffectHeightDelta(frame_bounds_.height() - bounds.height(),
126 scrolling_down);
127 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698