| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/browser_controls_offset_manager.h" | 5 #include "cc/input/browser_controls_offset_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 BrowserControlsOffsetManager::BrowserControlsOffsetManager( | 36 BrowserControlsOffsetManager::BrowserControlsOffsetManager( |
| 37 BrowserControlsOffsetManagerClient* client, | 37 BrowserControlsOffsetManagerClient* client, |
| 38 float controls_show_threshold, | 38 float controls_show_threshold, |
| 39 float controls_hide_threshold) | 39 float controls_hide_threshold) |
| 40 : client_(client), | 40 : client_(client), |
| 41 animation_start_value_(0.f), | 41 animation_start_value_(0.f), |
| 42 animation_stop_value_(0.f), | 42 animation_stop_value_(0.f), |
| 43 animation_direction_(NO_ANIMATION), | 43 animation_direction_(NO_ANIMATION), |
| 44 permitted_state_(BOTH), | 44 permitted_state_(BOTH), |
| 45 accumulated_scroll_delta_(0.f), | 45 accumulated_scroll_delta_(0.f), |
| 46 baseline_content_offset_(0.f), | 46 baseline_top_content_offset_(0.f), |
| 47 baseline_bottom_content_offset_(0.f), |
| 47 controls_show_threshold_(controls_hide_threshold), | 48 controls_show_threshold_(controls_hide_threshold), |
| 48 controls_hide_threshold_(controls_show_threshold), | 49 controls_hide_threshold_(controls_show_threshold), |
| 49 pinch_gesture_active_(false) { | 50 pinch_gesture_active_(false) { |
| 50 CHECK(client_); | 51 CHECK(client_); |
| 51 } | 52 } |
| 52 | 53 |
| 53 BrowserControlsOffsetManager::~BrowserControlsOffsetManager() {} | 54 BrowserControlsOffsetManager::~BrowserControlsOffsetManager() {} |
| 54 | 55 |
| 55 float BrowserControlsOffsetManager::ControlsTopOffset() const { | 56 float BrowserControlsOffsetManager::ControlsTopOffset() const { |
| 56 return ContentTopOffset() - TopControlsHeight(); | 57 return ContentTopOffset() - TopControlsHeight(); |
| 57 } | 58 } |
| 58 | 59 |
| 59 float BrowserControlsOffsetManager::ContentTopOffset() const { | 60 float BrowserControlsOffsetManager::ContentTopOffset() const { |
| 60 return TopControlsShownRatio() * TopControlsHeight(); | 61 return TopControlsShownRatio() * TopControlsHeight(); |
| 61 } | 62 } |
| 62 | 63 |
| 63 float BrowserControlsOffsetManager::ContentOffsetInternal() const { | |
| 64 if (!TopControlsHeight()) | |
| 65 return BottomControlsShownRatio() * BottomControlsHeight(); | |
| 66 return ContentTopOffset(); | |
| 67 } | |
| 68 | |
| 69 float BrowserControlsOffsetManager::TopControlsShownRatio() const { | 64 float BrowserControlsOffsetManager::TopControlsShownRatio() const { |
| 70 return client_->CurrentBrowserControlsShownRatio(); | 65 return client_->CurrentBrowserControlsShownRatio(); |
| 71 } | 66 } |
| 72 | 67 |
| 73 float BrowserControlsOffsetManager::TopControlsHeight() const { | 68 float BrowserControlsOffsetManager::TopControlsHeight() const { |
| 74 return client_->TopControlsHeight(); | 69 return client_->TopControlsHeight(); |
| 75 } | 70 } |
| 76 | 71 |
| 77 float BrowserControlsOffsetManager::BottomControlsHeight() const { | 72 float BrowserControlsOffsetManager::BottomControlsHeight() const { |
| 78 return client_->BottomControlsHeight(); | 73 return client_->BottomControlsHeight(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 if (pinch_gesture_active_) | 132 if (pinch_gesture_active_) |
| 138 return pending_delta; | 133 return pending_delta; |
| 139 | 134 |
| 140 if (permitted_state_ == SHOWN && pending_delta.y() > 0) | 135 if (permitted_state_ == SHOWN && pending_delta.y() > 0) |
| 141 return pending_delta; | 136 return pending_delta; |
| 142 else if (permitted_state_ == HIDDEN && pending_delta.y() < 0) | 137 else if (permitted_state_ == HIDDEN && pending_delta.y() < 0) |
| 143 return pending_delta; | 138 return pending_delta; |
| 144 | 139 |
| 145 accumulated_scroll_delta_ += pending_delta.y(); | 140 accumulated_scroll_delta_ += pending_delta.y(); |
| 146 | 141 |
| 147 float old_offset = ContentOffsetInternal(); | 142 float old_top_offset = ContentTopOffset(); |
| 143 float baseline_content_offset = TopControlsHeight() |
| 144 ? baseline_top_content_offset_ : baseline_bottom_content_offset_; |
| 148 client_->SetCurrentBrowserControlsShownRatio( | 145 client_->SetCurrentBrowserControlsShownRatio( |
| 149 (baseline_content_offset_ - accumulated_scroll_delta_) / controls_height); | 146 (baseline_content_offset - accumulated_scroll_delta_) / controls_height); |
| 150 | 147 |
| 151 // If the controls are fully visible, treat the current position as the | 148 // If the controls are fully visible, treat the current position as the |
| 152 // new baseline even if the gesture didn't end. | 149 // new baseline even if the gesture didn't end. |
| 153 if (TopControlsShownRatio() == 1.f) | 150 if (TopControlsShownRatio() == 1.f) |
| 154 ResetBaseline(); | 151 ResetBaseline(); |
| 155 | 152 |
| 156 ResetAnimations(); | 153 ResetAnimations(); |
| 157 | 154 |
| 158 gfx::Vector2dF applied_delta(0.f, old_offset - ContentOffsetInternal()); | 155 // applied_delta will negate any scroll on the content if the top browser |
| 156 // controls are showing in favor of hiding the controls and resizing the |
| 157 // content. If the top controls have no height, the content should scroll |
| 158 // immediately. |
| 159 gfx::Vector2dF applied_delta(0.f, |
| 160 TopControlsHeight() ? old_top_offset - ContentTopOffset() : 0.0f); |
| 159 return pending_delta - applied_delta; | 161 return pending_delta - applied_delta; |
| 160 } | 162 } |
| 161 | 163 |
| 162 void BrowserControlsOffsetManager::ScrollEnd() { | 164 void BrowserControlsOffsetManager::ScrollEnd() { |
| 163 if (pinch_gesture_active_) | 165 if (pinch_gesture_active_) |
| 164 return; | 166 return; |
| 165 | 167 |
| 166 StartAnimationIfNecessary(); | 168 StartAnimationIfNecessary(); |
| 167 } | 169 } |
| 168 | 170 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 182 | 184 |
| 183 void BrowserControlsOffsetManager::MainThreadHasStoppedFlinging() { | 185 void BrowserControlsOffsetManager::MainThreadHasStoppedFlinging() { |
| 184 StartAnimationIfNecessary(); | 186 StartAnimationIfNecessary(); |
| 185 } | 187 } |
| 186 | 188 |
| 187 gfx::Vector2dF BrowserControlsOffsetManager::Animate( | 189 gfx::Vector2dF BrowserControlsOffsetManager::Animate( |
| 188 base::TimeTicks monotonic_time) { | 190 base::TimeTicks monotonic_time) { |
| 189 if (!has_animation() || !client_->HaveRootScrollLayer()) | 191 if (!has_animation() || !client_->HaveRootScrollLayer()) |
| 190 return gfx::Vector2dF(); | 192 return gfx::Vector2dF(); |
| 191 | 193 |
| 192 float old_offset = ContentOffsetInternal(); | 194 float old_offset = ContentTopOffset(); |
| 193 float new_ratio = gfx::Tween::ClampedFloatValueBetween( | 195 float new_ratio = gfx::Tween::ClampedFloatValueBetween( |
| 194 monotonic_time, animation_start_time_, animation_start_value_, | 196 monotonic_time, animation_start_time_, animation_start_value_, |
| 195 animation_stop_time_, animation_stop_value_); | 197 animation_stop_time_, animation_stop_value_); |
| 196 client_->SetCurrentBrowserControlsShownRatio(new_ratio); | 198 client_->SetCurrentBrowserControlsShownRatio(new_ratio); |
| 197 | 199 |
| 198 if (IsAnimationComplete(new_ratio)) | 200 if (IsAnimationComplete(new_ratio)) |
| 199 ResetAnimations(); | 201 ResetAnimations(); |
| 200 | 202 |
| 201 gfx::Vector2dF scroll_delta(0.f, ContentOffsetInternal() - old_offset); | 203 // Don't move the content if the top controls aren't used. |
| 204 gfx::Vector2dF scroll_delta(0.f, |
| 205 TopControlsHeight() ? (ContentTopOffset() - old_offset) : 0.0f); |
| 202 return scroll_delta; | 206 return scroll_delta; |
| 203 } | 207 } |
| 204 | 208 |
| 205 void BrowserControlsOffsetManager::ResetAnimations() { | 209 void BrowserControlsOffsetManager::ResetAnimations() { |
| 206 animation_start_time_ = base::TimeTicks(); | 210 animation_start_time_ = base::TimeTicks(); |
| 207 animation_start_value_ = 0.f; | 211 animation_start_value_ = 0.f; |
| 208 animation_stop_time_ = base::TimeTicks(); | 212 animation_stop_time_ = base::TimeTicks(); |
| 209 animation_stop_value_ = 0.f; | 213 animation_stop_value_ = 0.f; |
| 210 | 214 |
| 211 animation_direction_ = NO_ANIMATION; | 215 animation_direction_ = NO_ANIMATION; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 } | 262 } |
| 259 } | 263 } |
| 260 | 264 |
| 261 bool BrowserControlsOffsetManager::IsAnimationComplete(float new_ratio) { | 265 bool BrowserControlsOffsetManager::IsAnimationComplete(float new_ratio) { |
| 262 return (animation_direction_ == SHOWING_CONTROLS && new_ratio >= 1.f) || | 266 return (animation_direction_ == SHOWING_CONTROLS && new_ratio >= 1.f) || |
| 263 (animation_direction_ == HIDING_CONTROLS && new_ratio <= 0.f); | 267 (animation_direction_ == HIDING_CONTROLS && new_ratio <= 0.f); |
| 264 } | 268 } |
| 265 | 269 |
| 266 void BrowserControlsOffsetManager::ResetBaseline() { | 270 void BrowserControlsOffsetManager::ResetBaseline() { |
| 267 accumulated_scroll_delta_ = 0.f; | 271 accumulated_scroll_delta_ = 0.f; |
| 268 baseline_content_offset_ = ContentOffsetInternal(); | 272 baseline_top_content_offset_ = ContentTopOffset(); |
| 273 baseline_bottom_content_offset_ = ContentBottomOffset(); |
| 269 } | 274 } |
| 270 | 275 |
| 271 } // namespace cc | 276 } // namespace cc |
| OLD | NEW |