| OLD | NEW |
| 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 "cc/input/top_controls_manager.h" | 5 #include "cc/input/top_controls_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "cc/animation/keyframed_animation_curve.h" | 10 #include "cc/animation/keyframed_animation_curve.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 top_controls_show_threshold, | 32 top_controls_show_threshold, |
| 33 top_controls_hide_threshold)); | 33 top_controls_hide_threshold)); |
| 34 } | 34 } |
| 35 | 35 |
| 36 TopControlsManager::TopControlsManager(TopControlsManagerClient* client, | 36 TopControlsManager::TopControlsManager(TopControlsManagerClient* client, |
| 37 float top_controls_show_threshold, | 37 float top_controls_show_threshold, |
| 38 float top_controls_hide_threshold) | 38 float top_controls_hide_threshold) |
| 39 : client_(client), | 39 : client_(client), |
| 40 animation_direction_(NO_ANIMATION), | 40 animation_direction_(NO_ANIMATION), |
| 41 permitted_state_(BOTH), | 41 permitted_state_(BOTH), |
| 42 current_scroll_delta_(0.f), | 42 accumulated_scroll_delta_(0.f), |
| 43 controls_scroll_begin_offset_(0.f), | 43 baseline_content_offset_(0.f), |
| 44 top_controls_show_threshold_(top_controls_hide_threshold), | 44 top_controls_show_threshold_(top_controls_hide_threshold), |
| 45 top_controls_hide_threshold_(top_controls_show_threshold), | 45 top_controls_hide_threshold_(top_controls_show_threshold), |
| 46 pinch_gesture_active_(false) { | 46 pinch_gesture_active_(false) { |
| 47 CHECK(client_); | 47 CHECK(client_); |
| 48 } | 48 } |
| 49 | 49 |
| 50 TopControlsManager::~TopControlsManager() { | 50 TopControlsManager::~TopControlsManager() { |
| 51 } | 51 } |
| 52 | 52 |
| 53 float TopControlsManager::ControlsTopOffset() const { | 53 float TopControlsManager::ControlsTopOffset() const { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 SetupAnimation(final_shown_ratio ? SHOWING_CONTROLS : HIDING_CONTROLS); | 89 SetupAnimation(final_shown_ratio ? SHOWING_CONTROLS : HIDING_CONTROLS); |
| 90 } else { | 90 } else { |
| 91 ResetAnimations(); | 91 ResetAnimations(); |
| 92 client_->SetCurrentTopControlsShownRatio(final_shown_ratio); | 92 client_->SetCurrentTopControlsShownRatio(final_shown_ratio); |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 | 95 |
| 96 void TopControlsManager::ScrollBegin() { | 96 void TopControlsManager::ScrollBegin() { |
| 97 DCHECK(!pinch_gesture_active_); | 97 DCHECK(!pinch_gesture_active_); |
| 98 ResetAnimations(); | 98 ResetAnimations(); |
| 99 current_scroll_delta_ = 0.f; | 99 ResetBaseline(); |
| 100 controls_scroll_begin_offset_ = ContentTopOffset(); | |
| 101 } | 100 } |
| 102 | 101 |
| 103 gfx::Vector2dF TopControlsManager::ScrollBy( | 102 gfx::Vector2dF TopControlsManager::ScrollBy( |
| 104 const gfx::Vector2dF& pending_delta) { | 103 const gfx::Vector2dF& pending_delta) { |
| 105 if (pinch_gesture_active_) | 104 if (pinch_gesture_active_) |
| 106 return pending_delta; | 105 return pending_delta; |
| 107 | 106 |
| 108 if (permitted_state_ == SHOWN && pending_delta.y() > 0) | 107 if (permitted_state_ == SHOWN && pending_delta.y() > 0) |
| 109 return pending_delta; | 108 return pending_delta; |
| 110 else if (permitted_state_ == HIDDEN && pending_delta.y() < 0) | 109 else if (permitted_state_ == HIDDEN && pending_delta.y() < 0) |
| 111 return pending_delta; | 110 return pending_delta; |
| 112 | 111 |
| 113 current_scroll_delta_ += pending_delta.y(); | 112 accumulated_scroll_delta_ += pending_delta.y(); |
| 114 | 113 |
| 115 float old_offset = ContentTopOffset(); | 114 float old_offset = ContentTopOffset(); |
| 116 client_->SetCurrentTopControlsShownRatio( | 115 client_->SetCurrentTopControlsShownRatio( |
| 117 (controls_scroll_begin_offset_ - current_scroll_delta_) / | 116 (baseline_content_offset_ - accumulated_scroll_delta_) / |
| 118 TopControlsHeight()); | 117 TopControlsHeight()); |
| 119 | 118 |
| 120 // If the controls are fully visible, treat the current position as the | 119 // If the controls are fully visible, treat the current position as the |
| 121 // new baseline even if the gesture didn't end. | 120 // new baseline even if the gesture didn't end. |
| 122 if (TopControlsShownRatio() == 1.f) { | 121 if (TopControlsShownRatio() == 1.f) |
| 123 current_scroll_delta_ = 0.f; | 122 ResetBaseline(); |
| 124 controls_scroll_begin_offset_ = ContentTopOffset(); | |
| 125 } | |
| 126 | 123 |
| 127 ResetAnimations(); | 124 ResetAnimations(); |
| 128 | 125 |
| 129 gfx::Vector2dF applied_delta(0.f, old_offset - ContentTopOffset()); | 126 gfx::Vector2dF applied_delta(0.f, old_offset - ContentTopOffset()); |
| 130 return pending_delta - applied_delta; | 127 return pending_delta - applied_delta; |
| 131 } | 128 } |
| 132 | 129 |
| 133 void TopControlsManager::ScrollEnd() { | 130 void TopControlsManager::ScrollEnd() { |
| 134 DCHECK(!pinch_gesture_active_); | 131 DCHECK(!pinch_gesture_active_); |
| 135 StartAnimationIfNecessary(); | 132 StartAnimationIfNecessary(); |
| 136 } | 133 } |
| 137 | 134 |
| 138 void TopControlsManager::PinchBegin() { | 135 void TopControlsManager::PinchBegin() { |
| 139 DCHECK(!pinch_gesture_active_); | 136 DCHECK(!pinch_gesture_active_); |
| 140 pinch_gesture_active_ = true; | 137 pinch_gesture_active_ = true; |
| 141 StartAnimationIfNecessary(); | 138 StartAnimationIfNecessary(); |
| 142 } | 139 } |
| 143 | 140 |
| 144 void TopControlsManager::PinchEnd() { | 141 void TopControlsManager::PinchEnd() { |
| 145 DCHECK(pinch_gesture_active_); | 142 DCHECK(pinch_gesture_active_); |
| 146 // Pinch{Begin,End} will always occur within the scope of Scroll{Begin,End}, | 143 // Pinch{Begin,End} will always occur within the scope of Scroll{Begin,End}, |
| 147 // so return to a state expected by the remaining scroll sequence. | 144 // so return to a state expected by the remaining scroll sequence. |
| 148 pinch_gesture_active_ = false; | 145 pinch_gesture_active_ = false; |
| 149 ScrollBegin(); | 146 ScrollBegin(); |
| 150 } | 147 } |
| 151 | 148 |
| 149 void TopControlsManager::MainThreadHasStoppedFlinging() { |
| 150 StartAnimationIfNecessary(); |
| 151 } |
| 152 |
| 152 gfx::Vector2dF TopControlsManager::Animate(base::TimeTicks monotonic_time) { | 153 gfx::Vector2dF TopControlsManager::Animate(base::TimeTicks monotonic_time) { |
| 153 if (!top_controls_animation_ || !client_->HaveRootScrollLayer()) | 154 if (!top_controls_animation_ || !client_->HaveRootScrollLayer()) |
| 154 return gfx::Vector2dF(); | 155 return gfx::Vector2dF(); |
| 155 | 156 |
| 156 base::TimeDelta time = monotonic_time - base::TimeTicks(); | 157 base::TimeDelta time = monotonic_time - base::TimeTicks(); |
| 157 | 158 |
| 158 float old_offset = ContentTopOffset(); | 159 float old_offset = ContentTopOffset(); |
| 159 client_->SetCurrentTopControlsShownRatio( | 160 client_->SetCurrentTopControlsShownRatio( |
| 160 top_controls_animation_->GetValue(time)); | 161 top_controls_animation_->GetValue(time)); |
| 161 | 162 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 if (TopControlsShownRatio() >= 1.f - top_controls_hide_threshold_) { | 200 if (TopControlsShownRatio() >= 1.f - top_controls_hide_threshold_) { |
| 200 // If we're showing so much that the hide threshold won't trigger, show. | 201 // If we're showing so much that the hide threshold won't trigger, show. |
| 201 SetupAnimation(SHOWING_CONTROLS); | 202 SetupAnimation(SHOWING_CONTROLS); |
| 202 } else if (TopControlsShownRatio() <= top_controls_show_threshold_) { | 203 } else if (TopControlsShownRatio() <= top_controls_show_threshold_) { |
| 203 // If we're showing so little that the show threshold won't trigger, hide. | 204 // If we're showing so little that the show threshold won't trigger, hide. |
| 204 SetupAnimation(HIDING_CONTROLS); | 205 SetupAnimation(HIDING_CONTROLS); |
| 205 } else { | 206 } else { |
| 206 // If we could be either showing or hiding, we determine which one to | 207 // If we could be either showing or hiding, we determine which one to |
| 207 // do based on whether or not the total scroll delta was moving up or | 208 // do based on whether or not the total scroll delta was moving up or |
| 208 // down. | 209 // down. |
| 209 SetupAnimation(current_scroll_delta_ <= 0.f ? SHOWING_CONTROLS | 210 SetupAnimation(accumulated_scroll_delta_ <= 0.f ? SHOWING_CONTROLS |
| 210 : HIDING_CONTROLS); | 211 : HIDING_CONTROLS); |
| 211 } | 212 } |
| 212 } | 213 } |
| 213 | 214 |
| 214 bool TopControlsManager::IsAnimationCompleteAtTime(base::TimeTicks time) { | 215 bool TopControlsManager::IsAnimationCompleteAtTime(base::TimeTicks time) { |
| 215 if (!top_controls_animation_) | 216 if (!top_controls_animation_) |
| 216 return true; | 217 return true; |
| 217 | 218 |
| 218 base::TimeDelta animation_time = time - base::TimeTicks(); | 219 base::TimeDelta animation_time = time - base::TimeTicks(); |
| 219 float new_ratio = top_controls_animation_->GetValue(animation_time); | 220 float new_ratio = top_controls_animation_->GetValue(animation_time); |
| 220 | 221 |
| 221 if ((animation_direction_ == SHOWING_CONTROLS && new_ratio >= 1.f) || | 222 if ((animation_direction_ == SHOWING_CONTROLS && new_ratio >= 1.f) || |
| 222 (animation_direction_ == HIDING_CONTROLS && new_ratio <= 0.f)) { | 223 (animation_direction_ == HIDING_CONTROLS && new_ratio <= 0.f)) { |
| 223 return true; | 224 return true; |
| 224 } | 225 } |
| 225 return false; | 226 return false; |
| 226 } | 227 } |
| 227 | 228 |
| 229 void TopControlsManager::ResetBaseline() { |
| 230 accumulated_scroll_delta_ = 0.f; |
| 231 baseline_content_offset_ = ContentTopOffset(); |
| 232 } |
| 233 |
| 228 } // namespace cc | 234 } // namespace cc |
| OLD | NEW |