Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/scrollbar_animation_controller.h" | 5 #include "cc/input/scrollbar_animation_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "cc/trees/layer_tree_impl.h" | 10 #include "cc/trees/layer_tree_impl.h" |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 39 ScrollbarAnimationController::ScrollbarAnimationController( | 39 ScrollbarAnimationController::ScrollbarAnimationController( |
| 40 ElementId scroll_element_id, | 40 ElementId scroll_element_id, |
| 41 ScrollbarAnimationControllerClient* client, | 41 ScrollbarAnimationControllerClient* client, |
| 42 base::TimeDelta fade_delay, | 42 base::TimeDelta fade_delay, |
| 43 base::TimeDelta fade_out_resize_delay, | 43 base::TimeDelta fade_out_resize_delay, |
| 44 base::TimeDelta fade_duration) | 44 base::TimeDelta fade_duration) |
| 45 : client_(client), | 45 : client_(client), |
| 46 fade_delay_(fade_delay), | 46 fade_delay_(fade_delay), |
| 47 fade_out_resize_delay_(fade_out_resize_delay), | 47 fade_out_resize_delay_(fade_out_resize_delay), |
| 48 fade_duration_(fade_duration), | 48 fade_duration_(fade_duration), |
| 49 need_trigger_scrollbar_show_(false), | 49 need_trigger_scrollbar_fade_in_(false), |
| 50 is_animating_(false), | 50 is_animating_(false), |
| 51 animation_change_(NONE), | 51 animation_change_(NONE), |
| 52 scroll_element_id_(scroll_element_id), | 52 scroll_element_id_(scroll_element_id), |
| 53 currently_scrolling_(false), | 53 currently_scrolling_(false), |
| 54 show_in_fast_scroll_(false), | 54 show_in_fast_scroll_(false), |
| 55 opacity_(0.0f), | 55 opacity_(0.0f), |
| 56 show_scrollbars_on_scroll_gesture_(false), | 56 show_scrollbars_on_scroll_gesture_(false), |
| 57 need_thinning_animation_(false), | 57 need_thinning_animation_(false), |
| 58 weak_factory_(this) { | 58 weak_factory_(this) { |
| 59 ApplyOpacityToScrollbars(0.0f); | 59 ApplyOpacityToScrollbars(0.0f); |
| 60 } | 60 } |
| 61 | 61 |
| 62 ScrollbarAnimationController::ScrollbarAnimationController( | 62 ScrollbarAnimationController::ScrollbarAnimationController( |
| 63 ElementId scroll_element_id, | 63 ElementId scroll_element_id, |
| 64 ScrollbarAnimationControllerClient* client, | 64 ScrollbarAnimationControllerClient* client, |
| 65 base::TimeDelta fade_delay, | 65 base::TimeDelta fade_delay, |
| 66 base::TimeDelta fade_out_resize_delay, | 66 base::TimeDelta fade_out_resize_delay, |
| 67 base::TimeDelta fade_duration, | 67 base::TimeDelta fade_duration, |
| 68 base::TimeDelta thinning_duration) | 68 base::TimeDelta thinning_duration) |
| 69 : client_(client), | 69 : client_(client), |
| 70 fade_delay_(fade_delay), | 70 fade_delay_(fade_delay), |
| 71 fade_out_resize_delay_(fade_out_resize_delay), | 71 fade_out_resize_delay_(fade_out_resize_delay), |
| 72 fade_duration_(fade_duration), | 72 fade_duration_(fade_duration), |
| 73 need_trigger_scrollbar_show_(false), | 73 need_trigger_scrollbar_fade_in_(false), |
| 74 is_animating_(false), | 74 is_animating_(false), |
| 75 animation_change_(NONE), | 75 animation_change_(NONE), |
| 76 scroll_element_id_(scroll_element_id), | 76 scroll_element_id_(scroll_element_id), |
| 77 currently_scrolling_(false), | 77 currently_scrolling_(false), |
| 78 show_in_fast_scroll_(false), | 78 show_in_fast_scroll_(false), |
| 79 opacity_(0.0f), | 79 opacity_(0.0f), |
| 80 show_scrollbars_on_scroll_gesture_(true), | 80 show_scrollbars_on_scroll_gesture_(true), |
| 81 need_thinning_animation_(true), | 81 need_thinning_animation_(true), |
| 82 weak_factory_(this) { | 82 weak_factory_(this) { |
| 83 vertical_controller_ = SingleScrollbarAnimationControllerThinning::Create( | 83 vertical_controller_ = SingleScrollbarAnimationControllerThinning::Create( |
| 84 scroll_element_id, ScrollbarOrientation::VERTICAL, client, | 84 scroll_element_id, ScrollbarOrientation::VERTICAL, client, |
| 85 thinning_duration); | 85 thinning_duration); |
| 86 horizontal_controller_ = SingleScrollbarAnimationControllerThinning::Create( | 86 horizontal_controller_ = SingleScrollbarAnimationControllerThinning::Create( |
| 87 scroll_element_id, ScrollbarOrientation::HORIZONTAL, client, | 87 scroll_element_id, ScrollbarOrientation::HORIZONTAL, client, |
| 88 thinning_duration); | 88 thinning_duration); |
| 89 | |
| 89 ApplyOpacityToScrollbars(0.0f); | 90 ApplyOpacityToScrollbars(0.0f); |
| 90 } | 91 } |
| 91 | 92 |
| 92 ScrollbarAnimationController::~ScrollbarAnimationController() {} | 93 ScrollbarAnimationController::~ScrollbarAnimationController() {} |
| 93 | 94 |
| 94 ScrollbarSet ScrollbarAnimationController::Scrollbars() const { | 95 ScrollbarSet ScrollbarAnimationController::Scrollbars() const { |
| 95 return client_->ScrollbarsFor(scroll_element_id_); | 96 return client_->ScrollbarsFor(scroll_element_id_); |
| 96 } | 97 } |
| 97 | 98 |
| 98 SingleScrollbarAnimationControllerThinning& | 99 SingleScrollbarAnimationControllerThinning& |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 } | 267 } |
| 267 | 268 |
| 268 void ScrollbarAnimationController::DidMouseLeave() { | 269 void ScrollbarAnimationController::DidMouseLeave() { |
| 269 if (!need_thinning_animation_) | 270 if (!need_thinning_animation_) |
| 270 return; | 271 return; |
| 271 | 272 |
| 272 vertical_controller_->DidMouseLeave(); | 273 vertical_controller_->DidMouseLeave(); |
| 273 horizontal_controller_->DidMouseLeave(); | 274 horizontal_controller_->DidMouseLeave(); |
| 274 | 275 |
| 275 delayed_scrollbar_animation_.Cancel(); | 276 delayed_scrollbar_animation_.Cancel(); |
| 276 need_trigger_scrollbar_show_ = false; | 277 need_trigger_scrollbar_fade_in_ = false; |
| 277 | 278 |
| 278 if (ScrollbarsHidden() || Captured()) | 279 if (ScrollbarsHidden() || Captured()) |
| 279 return; | 280 return; |
| 280 | 281 |
| 281 PostDelayedAnimation(FADE_OUT, false); | 282 PostDelayedAnimation(FADE_OUT, false); |
| 282 } | 283 } |
| 283 | 284 |
| 284 void ScrollbarAnimationController::DidMouseMoveNear( | 285 void ScrollbarAnimationController::DidMouseMove( |
| 285 ScrollbarOrientation orientation, | 286 const gfx::PointF& device_viewport_point) { |
| 286 float distance) { | |
| 287 if (!need_thinning_animation_) | 287 if (!need_thinning_animation_) |
| 288 return; | 288 return; |
| 289 | 289 |
| 290 bool need_trigger_scrollbar_show_before = need_trigger_scrollbar_show_; | 290 bool need_trigger_scrollbar_fade_in_before = need_trigger_scrollbar_fade_in_; |
| 291 | 291 |
| 292 GetScrollbarAnimationController(orientation).DidMouseMoveNear(distance); | 292 const ScrollbarOrientation orientations[] = {HORIZONTAL, VERTICAL}; |
|
bokan
2017/04/28 18:08:11
No need for loop, just:
vertical_controller_->Di
| |
| 293 for (ScrollbarOrientation orientation : orientations) { | |
| 294 GetScrollbarAnimationController(orientation) | |
| 295 .DidMouseMove(device_viewport_point); | |
| 296 } | |
| 293 | 297 |
| 294 need_trigger_scrollbar_show_ = | 298 need_trigger_scrollbar_fade_in_ = MouseIsNearAnyScrollbar(); |
| 295 CalcNeedTriggerScrollbarShow(orientation, distance); | |
| 296 | 299 |
| 297 if (Captured()) | 300 if (Captured()) |
| 298 return; | 301 return; |
| 299 | 302 |
| 300 if (ScrollbarsHidden()) { | 303 if (ScrollbarsHidden()) { |
| 301 if (need_trigger_scrollbar_show_before != need_trigger_scrollbar_show_) { | 304 if (need_trigger_scrollbar_fade_in_before != |
| 302 if (need_trigger_scrollbar_show_) { | 305 need_trigger_scrollbar_fade_in_) { |
| 306 if (need_trigger_scrollbar_fade_in_) { | |
| 303 PostDelayedAnimation(FADE_IN, false); | 307 PostDelayedAnimation(FADE_IN, false); |
| 304 } else { | 308 } else { |
| 305 delayed_scrollbar_animation_.Cancel(); | 309 delayed_scrollbar_animation_.Cancel(); |
| 306 } | 310 } |
| 307 } | 311 } |
| 308 } else { | 312 } else { |
| 309 if (MouseIsNearAnyScrollbar()) { | 313 if (MouseIsNearAnyScrollbar()) { |
| 310 Show(); | 314 Show(); |
| 311 StopAnimation(); | 315 StopAnimation(); |
| 312 } else if (!is_animating_) { | 316 } else if (!is_animating_) { |
| 313 PostDelayedAnimation(FADE_OUT, false); | 317 PostDelayedAnimation(FADE_OUT, false); |
| 314 } | 318 } |
| 315 } | 319 } |
| 316 } | 320 } |
| 317 | 321 |
| 318 bool ScrollbarAnimationController::CalcNeedTriggerScrollbarShow( | 322 bool ScrollbarAnimationController::MouseIsOverScrollbarThumb( |
| 319 ScrollbarOrientation orientation, | 323 ScrollbarOrientation orientation) const { |
| 320 float distance) const { | |
| 321 DCHECK(need_thinning_animation_); | 324 DCHECK(need_thinning_animation_); |
| 322 | 325 return GetScrollbarAnimationController(orientation) |
| 323 if (vertical_controller_->mouse_is_over_scrollbar() || | 326 .mouse_is_over_scrollbar_thumb(); |
| 324 horizontal_controller_->mouse_is_over_scrollbar()) | |
| 325 return true; | |
| 326 | |
| 327 for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) { | |
| 328 if (scrollbar->orientation() != orientation) | |
| 329 continue; | |
| 330 | |
| 331 if (distance < kMouseMoveDistanceToTriggerFadeIn) | |
| 332 return true; | |
| 333 } | |
| 334 | |
| 335 return false; | |
| 336 } | 327 } |
| 337 | 328 |
| 338 bool ScrollbarAnimationController::MouseIsOverScrollbar( | 329 bool ScrollbarAnimationController::MouseIsNearScrollbarThumb( |
| 339 ScrollbarOrientation orientation) const { | 330 ScrollbarOrientation orientation) const { |
| 340 DCHECK(need_thinning_animation_); | 331 DCHECK(need_thinning_animation_); |
| 341 return GetScrollbarAnimationController(orientation).mouse_is_over_scrollbar(); | 332 return GetScrollbarAnimationController(orientation) |
| 333 .mouse_is_near_scrollbar_thumb(); | |
| 342 } | 334 } |
| 343 | 335 |
| 344 bool ScrollbarAnimationController::MouseIsNearScrollbar( | 336 bool ScrollbarAnimationController::MouseIsNearScrollbar( |
| 345 ScrollbarOrientation orientation) const { | 337 ScrollbarOrientation orientation) const { |
| 346 DCHECK(need_thinning_animation_); | 338 DCHECK(need_thinning_animation_); |
| 347 return GetScrollbarAnimationController(orientation).mouse_is_near_scrollbar(); | 339 return GetScrollbarAnimationController(orientation) |
| 340 .mouse_is_near_scrollbar_track(); | |
| 348 } | 341 } |
| 349 | 342 |
| 350 bool ScrollbarAnimationController::MouseIsNearAnyScrollbar() const { | 343 bool ScrollbarAnimationController::MouseIsNearAnyScrollbar() const { |
| 351 DCHECK(need_thinning_animation_); | 344 DCHECK(need_thinning_animation_); |
| 352 return vertical_controller_->mouse_is_near_scrollbar() || | 345 return vertical_controller_->mouse_is_near_scrollbar_track() || |
| 353 horizontal_controller_->mouse_is_near_scrollbar(); | 346 horizontal_controller_->mouse_is_near_scrollbar_track(); |
| 354 } | 347 } |
| 355 | 348 |
| 356 bool ScrollbarAnimationController::ScrollbarsHidden() const { | 349 bool ScrollbarAnimationController::ScrollbarsHidden() const { |
| 357 return opacity_ == 0.0f; | 350 return opacity_ == 0.0f; |
| 358 } | 351 } |
| 359 | 352 |
| 360 bool ScrollbarAnimationController::Captured() const { | 353 bool ScrollbarAnimationController::Captured() const { |
| 361 DCHECK(need_thinning_animation_); | 354 DCHECK(need_thinning_animation_); |
| 362 return vertical_controller_->captured() || horizontal_controller_->captured(); | 355 return GetScrollbarAnimationController(VERTICAL).captured() || |
| 356 GetScrollbarAnimationController(HORIZONTAL).captured(); | |
| 363 } | 357 } |
| 364 | 358 |
| 365 void ScrollbarAnimationController::Show() { | 359 void ScrollbarAnimationController::Show() { |
| 366 delayed_scrollbar_animation_.Cancel(); | 360 delayed_scrollbar_animation_.Cancel(); |
| 367 ApplyOpacityToScrollbars(1.0f); | 361 ApplyOpacityToScrollbars(1.0f); |
| 368 } | 362 } |
| 369 | 363 |
| 370 void ScrollbarAnimationController::ApplyOpacityToScrollbars(float opacity) { | 364 void ScrollbarAnimationController::ApplyOpacityToScrollbars(float opacity) { |
| 371 for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) { | 365 for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) { |
| 372 if (!scrollbar->is_overlay_scrollbar()) | 366 if (!scrollbar->is_overlay_scrollbar()) |
| 373 continue; | 367 continue; |
| 374 float effective_opacity = scrollbar->CanScrollOrientation() ? opacity : 0; | 368 float effective_opacity = scrollbar->CanScrollOrientation() ? opacity : 0; |
| 375 scrollbar->SetOverlayScrollbarLayerOpacityAnimated(effective_opacity); | 369 scrollbar->SetOverlayScrollbarLayerOpacityAnimated(effective_opacity); |
| 376 } | 370 } |
| 377 | 371 |
| 378 bool previouslyVisible = opacity_ > 0.0f; | 372 bool previouslyVisible = opacity_ > 0.0f; |
| 379 bool currentlyVisible = opacity > 0.0f; | 373 bool currentlyVisible = opacity > 0.0f; |
| 380 | 374 |
| 381 if (opacity_ != opacity) | 375 if (opacity_ != opacity) |
| 382 client_->SetNeedsRedrawForScrollbarAnimation(); | 376 client_->SetNeedsRedrawForScrollbarAnimation(); |
| 383 | 377 |
| 384 opacity_ = opacity; | 378 opacity_ = opacity; |
| 385 | 379 |
| 386 if (previouslyVisible != currentlyVisible) | 380 if (previouslyVisible != currentlyVisible) |
| 387 client_->DidChangeScrollbarVisibility(); | 381 client_->DidChangeScrollbarVisibility(); |
| 388 } | 382 } |
| 389 | 383 |
| 390 } // namespace cc | 384 } // namespace cc |
| OLD | NEW |