Chromium Code Reviews| Index: cc/input/single_scrollbar_animation_controller_thinning.cc |
| diff --git a/cc/input/single_scrollbar_animation_controller_thinning.cc b/cc/input/single_scrollbar_animation_controller_thinning.cc |
| index f09756ee5e636571e659691d1c146f6424b18bc3..107783b825621c5679238aeffc516a88596d2c1d 100644 |
| --- a/cc/input/single_scrollbar_animation_controller_thinning.cc |
| +++ b/cc/input/single_scrollbar_animation_controller_thinning.cc |
| @@ -15,6 +15,40 @@ |
| namespace cc { |
| +namespace { |
| + |
| +float DistanceToScrollbarTrack(const gfx::PointF& device_viewport_point, |
| + const ScrollbarLayerImplBase* scrollbar) { |
| + if (!scrollbar) |
|
bokan
2017/04/28 18:08:11
Make the scrollbar param a ref and avoid calling t
|
| + return std::numeric_limits<float>::max(); |
| + |
| + gfx::Rect scrollbar_bounds(scrollbar->bounds()); |
| + |
| + gfx::RectF device_viewport_scrollbar_bounds = MathUtil::MapClippedRect( |
| + scrollbar->ScreenSpaceTransform(), gfx::RectF(scrollbar_bounds)); |
| + |
| + return device_viewport_scrollbar_bounds.ManhattanDistanceToPoint( |
| + device_viewport_point) / |
| + scrollbar->layer_tree_impl()->device_scale_factor(); |
| +} |
| + |
| +float DistanceToScrollbarThumb(const gfx::PointF& device_viewport_point, |
| + const ScrollbarLayerImplBase* scrollbar) { |
| + if (!scrollbar) |
| + return std::numeric_limits<float>::max(); |
| + |
| + gfx::Rect thumb_bounds(scrollbar->ComputeExpandedThumbQuadRect()); |
| + |
| + gfx::RectF device_viewport_scrollbar_thumb_bounds = MathUtil::MapClippedRect( |
| + scrollbar->ScreenSpaceTransform(), gfx::RectF(thumb_bounds)); |
| + |
| + return device_viewport_scrollbar_thumb_bounds.ManhattanDistanceToPoint( |
| + device_viewport_point) / |
| + scrollbar->layer_tree_impl()->device_scale_factor(); |
| +} |
| + |
| +} // namespace |
| + |
| std::unique_ptr<SingleScrollbarAnimationControllerThinning> |
| SingleScrollbarAnimationControllerThinning::Create( |
| ElementId scroll_element_id, |
| @@ -36,13 +70,28 @@ SingleScrollbarAnimationControllerThinning:: |
| scroll_element_id_(scroll_element_id), |
| orientation_(orientation), |
| captured_(false), |
| - mouse_is_over_scrollbar_(false), |
| - mouse_is_near_scrollbar_(false), |
| + mouse_is_over_scrollbar_thumb_(false), |
| + mouse_is_near_scrollbar_thumb_(false), |
| + mouse_is_near_scrollbar_track_(false), |
| thickness_change_(NONE), |
| thinning_duration_(thinning_duration) { |
| ApplyThumbThicknessScale(kIdleThicknessScale); |
| } |
| +ScrollbarLayerImplBase* |
| +SingleScrollbarAnimationControllerThinning::GetScrollbar() const { |
| + for (ScrollbarLayerImplBase* scrollbar : |
| + client_->ScrollbarsFor(scroll_element_id_)) { |
| + if (!scrollbar->is_overlay_scrollbar()) |
|
bokan
2017/04/28 18:08:11
This can be a DCHECK right? We should never have a
|
| + continue; |
| + |
| + if (scrollbar->orientation() == orientation_) |
| + return scrollbar; |
| + } |
| + |
| + return nullptr; |
| +} |
| + |
| bool SingleScrollbarAnimationControllerThinning::Animate(base::TimeTicks now) { |
| if (!is_animating_) |
| return false; |
| @@ -92,7 +141,7 @@ void SingleScrollbarAnimationControllerThinning::StopAnimation() { |
| } |
| void SingleScrollbarAnimationControllerThinning::DidMouseDown() { |
| - if (!mouse_is_over_scrollbar_) |
| + if (!mouse_is_over_scrollbar_thumb_) |
| return; |
| StopAnimation(); |
| @@ -107,7 +156,7 @@ void SingleScrollbarAnimationControllerThinning::DidMouseUp() { |
| captured_ = false; |
| StopAnimation(); |
| - if (!mouse_is_near_scrollbar_) { |
| + if (!mouse_is_near_scrollbar_thumb_) { |
| thickness_change_ = DECREASE; |
| StartAnimation(); |
| } else { |
| @@ -116,11 +165,12 @@ void SingleScrollbarAnimationControllerThinning::DidMouseUp() { |
| } |
| void SingleScrollbarAnimationControllerThinning::DidMouseLeave() { |
| - if (!mouse_is_over_scrollbar_ && !mouse_is_near_scrollbar_) |
| + if (!mouse_is_over_scrollbar_thumb_ && !mouse_is_near_scrollbar_thumb_) |
| return; |
| - mouse_is_over_scrollbar_ = false; |
| - mouse_is_near_scrollbar_ = false; |
| + mouse_is_over_scrollbar_thumb_ = false; |
| + mouse_is_near_scrollbar_thumb_ = false; |
| + mouse_is_near_scrollbar_track_ = false; |
| if (captured_) |
| return; |
| @@ -129,24 +179,36 @@ void SingleScrollbarAnimationControllerThinning::DidMouseLeave() { |
| StartAnimation(); |
| } |
| -void SingleScrollbarAnimationControllerThinning::DidMouseMoveNear( |
| - float distance) { |
| - bool mouse_is_over_scrollbar = distance == 0.0f; |
| - bool mouse_is_near_scrollbar = |
| - distance < kDefaultMouseMoveDistanceToTriggerAnimation; |
| +void SingleScrollbarAnimationControllerThinning::DidMouseMove( |
| + const gfx::PointF& device_viewport_point) { |
| + ScrollbarLayerImplBase* scrollbar = GetScrollbar(); |
| + |
| + float distance_to_scrollbar_track = |
| + DistanceToScrollbarTrack(device_viewport_point, scrollbar); |
| + float distance_to_scrollbar_thumb = |
| + DistanceToScrollbarThumb(device_viewport_point, scrollbar); |
| + |
| + mouse_is_near_scrollbar_track_ = |
| + distance_to_scrollbar_track < |
| + ScrollbarAnimationController::kMouseMoveDistanceToTriggerFadeIn; |
| + |
| + bool mouse_is_over_scrollbar_thumb = distance_to_scrollbar_thumb == 0.0f; |
| + bool mouse_is_near_scrollbar_thumb = |
| + distance_to_scrollbar_thumb < kMouseMoveDistanceToTriggerExpand; |
| - if (!captured_ && mouse_is_near_scrollbar != mouse_is_near_scrollbar_) { |
| - thickness_change_ = mouse_is_near_scrollbar ? INCREASE : DECREASE; |
| + if (!captured_ && |
| + mouse_is_near_scrollbar_thumb != mouse_is_near_scrollbar_thumb_) { |
| + thickness_change_ = mouse_is_near_scrollbar_thumb ? INCREASE : DECREASE; |
| StartAnimation(); |
| } |
| - mouse_is_near_scrollbar_ = mouse_is_near_scrollbar; |
| - mouse_is_over_scrollbar_ = mouse_is_over_scrollbar; |
| + mouse_is_near_scrollbar_thumb_ = mouse_is_near_scrollbar_thumb; |
| + mouse_is_over_scrollbar_thumb_ = mouse_is_over_scrollbar_thumb; |
| } |
| float SingleScrollbarAnimationControllerThinning::ThumbThicknessScaleAt( |
| float progress) { |
| if (thickness_change_ == NONE) |
| - return mouse_is_near_scrollbar_ ? 1.f : kIdleThicknessScale; |
| + return mouse_is_near_scrollbar_thumb_ ? 1.f : kIdleThicknessScale; |
| float factor = thickness_change_ == INCREASE ? progress : (1.f - progress); |
| return ((1.f - kIdleThicknessScale) * factor) + kIdleThicknessScale; |
| } |
| @@ -173,8 +235,8 @@ float SingleScrollbarAnimationControllerThinning::AdjustScale( |
| void SingleScrollbarAnimationControllerThinning::UpdateThumbThicknessScale() { |
| StopAnimation(); |
| - ApplyThumbThicknessScale(mouse_is_near_scrollbar_ ? 1.f |
| - : kIdleThicknessScale); |
| + ApplyThumbThicknessScale( |
| + mouse_is_near_scrollbar_thumb_ ? 1.f : kIdleThicknessScale); |
| } |
| void SingleScrollbarAnimationControllerThinning::ApplyThumbThicknessScale( |