| 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" |
| 11 #include "cc/animation/timing_function.h" | 11 #include "cc/animation/timing_function.h" |
| 12 #include "cc/input/top_controls_manager_client.h" | 12 #include "cc/input/top_controls_manager_client.h" |
| 13 #include "cc/output/begin_frame_args.h" | 13 #include "cc/output/begin_frame_args.h" |
| 14 #include "cc/trees/layer_tree_impl.h" | 14 #include "cc/trees/layer_tree_impl.h" |
| 15 #include "ui/gfx/frame_time.h" | 15 #include "ui/gfx/frame_time.h" |
| 16 #include "ui/gfx/geometry/vector2d_f.h" | 16 #include "ui/gfx/geometry/vector2d_f.h" |
| 17 #include "ui/gfx/transform.h" | 17 #include "ui/gfx/transform.h" |
| 18 | 18 |
| 19 namespace cc { | 19 namespace cc { |
| 20 namespace { | 20 namespace { |
| 21 // These constants were chosen empirically for their visually pleasant behavior. | 21 // These constants were chosen empirically for their visually pleasant behavior. |
| 22 // Contact tedchoc@chromium.org for questions about changing these values. | 22 // Contact tedchoc@chromium.org for questions about changing these values. |
| 23 const int64 kShowHideMaxDurationMs = 200; | 23 const int64 kShowHideMaxDurationMs = 200; |
| 24 } | 24 } |
| 25 | 25 |
| 26 // static | 26 // static |
| 27 scoped_ptr<TopControlsManager> TopControlsManager::Create( | 27 scoped_ptr<TopControlsManager> TopControlsManager::Create( |
| 28 TopControlsManagerClient* client, | 28 TopControlsManagerClient* client, |
| 29 float top_controls_height, | |
| 30 float top_controls_show_threshold, | 29 float top_controls_show_threshold, |
| 31 float top_controls_hide_threshold) { | 30 float top_controls_hide_threshold) { |
| 32 return make_scoped_ptr(new TopControlsManager(client, | 31 return make_scoped_ptr(new TopControlsManager(client, |
| 33 top_controls_height, | |
| 34 top_controls_show_threshold, | 32 top_controls_show_threshold, |
| 35 top_controls_hide_threshold)); | 33 top_controls_hide_threshold)); |
| 36 } | 34 } |
| 37 | 35 |
| 38 TopControlsManager::TopControlsManager(TopControlsManagerClient* client, | 36 TopControlsManager::TopControlsManager(TopControlsManagerClient* client, |
| 39 float top_controls_height, | |
| 40 float top_controls_show_threshold, | 37 float top_controls_show_threshold, |
| 41 float top_controls_hide_threshold) | 38 float top_controls_hide_threshold) |
| 42 : client_(client), | 39 : client_(client), |
| 43 animation_direction_(NO_ANIMATION), | 40 animation_direction_(NO_ANIMATION), |
| 44 permitted_state_(BOTH), | 41 permitted_state_(BOTH), |
| 45 top_controls_height_(top_controls_height), | 42 top_controls_height_(0.f), |
| 46 current_scroll_delta_(0.f), | 43 current_scroll_delta_(0.f), |
| 47 controls_scroll_begin_offset_(0.f), | 44 controls_scroll_begin_offset_(0.f), |
| 48 top_controls_show_height_( | 45 top_controls_show_threshold_(top_controls_hide_threshold), |
| 49 top_controls_height * top_controls_hide_threshold), | 46 top_controls_hide_threshold_(top_controls_show_threshold), |
| 50 top_controls_hide_height_( | |
| 51 top_controls_height * (1.f - top_controls_show_threshold)), | |
| 52 pinch_gesture_active_(false) { | 47 pinch_gesture_active_(false) { |
| 53 CHECK(client_); | 48 CHECK(client_); |
| 54 } | 49 } |
| 55 | 50 |
| 56 TopControlsManager::~TopControlsManager() { | 51 TopControlsManager::~TopControlsManager() { |
| 57 } | 52 } |
| 58 | 53 |
| 59 float TopControlsManager::ControlsTopOffset() { | 54 float TopControlsManager::ControlsTopOffset() { |
| 60 return client_->ControlsTopOffset(); | 55 return client_->ControlsTopOffset(); |
| 61 } | 56 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 controls_top_offset = std::min(controls_top_offset, 0.f); | 151 controls_top_offset = std::min(controls_top_offset, 0.f); |
| 157 | 152 |
| 158 if (client_->ControlsTopOffset() == controls_top_offset) | 153 if (client_->ControlsTopOffset() == controls_top_offset) |
| 159 return; | 154 return; |
| 160 | 155 |
| 161 client_->SetControlsTopOffset(controls_top_offset); | 156 client_->SetControlsTopOffset(controls_top_offset); |
| 162 | 157 |
| 163 client_->DidChangeTopControlsPosition(); | 158 client_->DidChangeTopControlsPosition(); |
| 164 } | 159 } |
| 165 | 160 |
| 161 void TopControlsManager::SetTopControlsHeight(float top_controls_height) { |
| 162 DCHECK_GE(top_controls_height, 0); |
| 163 |
| 164 if (top_controls_height == top_controls_height_) |
| 165 return; |
| 166 |
| 167 ResetAnimations(); |
| 168 float top_controls_offset = client_->ControlsTopOffset(); |
| 169 top_controls_height_ = top_controls_height; |
| 170 SetControlsTopOffset(top_controls_offset); |
| 171 StartAnimationIfNecessary(); |
| 172 } |
| 173 |
| 166 gfx::Vector2dF TopControlsManager::Animate(base::TimeTicks monotonic_time) { | 174 gfx::Vector2dF TopControlsManager::Animate(base::TimeTicks monotonic_time) { |
| 167 if (!top_controls_animation_ || !client_->HaveRootScrollLayer()) | 175 if (!top_controls_animation_ || !client_->HaveRootScrollLayer()) |
| 168 return gfx::Vector2dF(); | 176 return gfx::Vector2dF(); |
| 169 | 177 |
| 170 base::TimeDelta time = monotonic_time - base::TimeTicks(); | 178 base::TimeDelta time = monotonic_time - base::TimeTicks(); |
| 171 | 179 |
| 172 float old_offset = client_->ControlsTopOffset(); | 180 float old_offset = client_->ControlsTopOffset(); |
| 173 SetControlsTopOffset(top_controls_animation_->GetValue(time)); | 181 SetControlsTopOffset(top_controls_animation_->GetValue(time)); |
| 174 | 182 |
| 175 if (IsAnimationCompleteAtTime(monotonic_time)) | 183 if (IsAnimationCompleteAtTime(monotonic_time)) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 EaseTimingFunction::Create())); | 218 EaseTimingFunction::Create())); |
| 211 animation_direction_ = direction; | 219 animation_direction_ = direction; |
| 212 client_->DidChangeTopControlsPosition(); | 220 client_->DidChangeTopControlsPosition(); |
| 213 } | 221 } |
| 214 | 222 |
| 215 void TopControlsManager::StartAnimationIfNecessary() { | 223 void TopControlsManager::StartAnimationIfNecessary() { |
| 216 if (client_->ControlsTopOffset() != 0 | 224 if (client_->ControlsTopOffset() != 0 |
| 217 && client_->ControlsTopOffset() != -top_controls_height_) { | 225 && client_->ControlsTopOffset() != -top_controls_height_) { |
| 218 AnimationDirection show_controls = NO_ANIMATION; | 226 AnimationDirection show_controls = NO_ANIMATION; |
| 219 | 227 |
| 220 if (client_->ControlsTopOffset() >= -top_controls_show_height_) { | 228 float top_controls_show_height = |
| 229 top_controls_height_ * top_controls_hide_threshold_; |
| 230 float top_controls_hide_height = |
| 231 top_controls_height_ * (1.f - top_controls_show_threshold_); |
| 232 if (client_->ControlsTopOffset() >= -top_controls_show_height) { |
| 221 // If we're showing so much that the hide threshold won't trigger, show. | 233 // If we're showing so much that the hide threshold won't trigger, show. |
| 222 show_controls = SHOWING_CONTROLS; | 234 show_controls = SHOWING_CONTROLS; |
| 223 } else if (client_->ControlsTopOffset() <= -top_controls_hide_height_) { | 235 } else if (client_->ControlsTopOffset() <= -top_controls_hide_height) { |
| 224 // If we're showing so little that the show threshold won't trigger, hide. | 236 // If we're showing so little that the show threshold won't trigger, hide. |
| 225 show_controls = HIDING_CONTROLS; | 237 show_controls = HIDING_CONTROLS; |
| 226 } else { | 238 } else { |
| 227 // If we could be either showing or hiding, we determine which one to | 239 // If we could be either showing or hiding, we determine which one to |
| 228 // do based on whether or not the total scroll delta was moving up or | 240 // do based on whether or not the total scroll delta was moving up or |
| 229 // down. | 241 // down. |
| 230 show_controls = current_scroll_delta_ <= 0.f ? | 242 show_controls = current_scroll_delta_ <= 0.f ? |
| 231 SHOWING_CONTROLS : HIDING_CONTROLS; | 243 SHOWING_CONTROLS : HIDING_CONTROLS; |
| 232 } | 244 } |
| 233 | 245 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 245 | 257 |
| 246 if ((animation_direction_ == SHOWING_CONTROLS && new_offset >= 0) || | 258 if ((animation_direction_ == SHOWING_CONTROLS && new_offset >= 0) || |
| 247 (animation_direction_ == HIDING_CONTROLS | 259 (animation_direction_ == HIDING_CONTROLS |
| 248 && new_offset <= -top_controls_height_)) { | 260 && new_offset <= -top_controls_height_)) { |
| 249 return true; | 261 return true; |
| 250 } | 262 } |
| 251 return false; | 263 return false; |
| 252 } | 264 } |
| 253 | 265 |
| 254 } // namespace cc | 266 } // namespace cc |
| OLD | NEW |