Index: cc/input/scrollbar_animation_controller.cc |
diff --git a/cc/input/scrollbar_animation_controller.cc b/cc/input/scrollbar_animation_controller.cc |
index 68f98fb3bbbdadcb4af8f9207805735eb1719972..edd3ee6d24d3d1ed048d8139940f7b1a1d9e51f3 100644 |
--- a/cc/input/scrollbar_animation_controller.cc |
+++ b/cc/input/scrollbar_animation_controller.cc |
@@ -11,6 +11,42 @@ |
namespace cc { |
+namespace { |
+ |
+float DistanceToScrollbarTrack(const gfx::PointF& device_viewport_point, |
+ const ScrollbarLayerImplBase* scrollbar) { |
+ if (!scrollbar) |
+ 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(); |
+} |
+ |
+const ScrollbarOrientation orientations[] = {HORIZONTAL, VERTICAL}; |
bokan
2017/04/28 14:15:17
This is only used for one loop. Move this into the
|
+ |
+} // namespace |
+ |
std::unique_ptr<ScrollbarAnimationController> |
ScrollbarAnimationController::CreateScrollbarAnimationControllerAndroid( |
ElementId scroll_element_id, |
@@ -46,7 +82,7 @@ ScrollbarAnimationController::ScrollbarAnimationController( |
fade_delay_(fade_delay), |
fade_out_resize_delay_(fade_out_resize_delay), |
fade_duration_(fade_duration), |
- need_trigger_scrollbar_show_(false), |
+ need_trigger_scrollbar_fade_in_(false), |
is_animating_(false), |
animation_change_(NONE), |
scroll_element_id_(scroll_element_id), |
@@ -70,7 +106,7 @@ ScrollbarAnimationController::ScrollbarAnimationController( |
fade_delay_(fade_delay), |
fade_out_resize_delay_(fade_out_resize_delay), |
fade_duration_(fade_duration), |
- need_trigger_scrollbar_show_(false), |
+ need_trigger_scrollbar_fade_in_(false), |
is_animating_(false), |
animation_change_(NONE), |
scroll_element_id_(scroll_element_id), |
@@ -80,12 +116,18 @@ ScrollbarAnimationController::ScrollbarAnimationController( |
show_scrollbars_on_scroll_gesture_(true), |
need_thinning_animation_(true), |
weak_factory_(this) { |
- vertical_controller_ = SingleScrollbarAnimationControllerThinning::Create( |
- scroll_element_id, ScrollbarOrientation::VERTICAL, client, |
- thinning_duration); |
- horizontal_controller_ = SingleScrollbarAnimationControllerThinning::Create( |
- scroll_element_id, ScrollbarOrientation::HORIZONTAL, client, |
- thinning_duration); |
+ scrollbar_controllers_[ScrollbarOrientation::HORIZONTAL] = |
+ SingleScrollbarAnimationControllerThinning::Create( |
+ scroll_element_id, ScrollbarOrientation::HORIZONTAL, client, |
+ thinning_duration); |
+ scrollbar_controllers_[ScrollbarOrientation::VERTICAL] = |
+ SingleScrollbarAnimationControllerThinning::Create( |
+ scroll_element_id, ScrollbarOrientation::VERTICAL, client, |
+ thinning_duration); |
+ |
+ mouse_is_near_scrollbar_[ScrollbarOrientation::HORIZONTAL] = false; |
+ mouse_is_near_scrollbar_[ScrollbarOrientation::VERTICAL] = false; |
+ |
ApplyOpacityToScrollbars(0.0f); |
} |
@@ -95,14 +137,24 @@ ScrollbarSet ScrollbarAnimationController::Scrollbars() const { |
return client_->ScrollbarsFor(scroll_element_id_); |
} |
+ScrollbarLayerImplBase* ScrollbarAnimationController::GetScrollbar( |
+ ScrollbarOrientation orientation) const { |
+ for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) { |
+ if (!scrollbar->is_overlay_scrollbar()) |
+ continue; |
+ |
+ if (scrollbar->orientation() == orientation) |
+ return scrollbar; |
+ } |
+ |
+ return nullptr; |
+} |
+ |
SingleScrollbarAnimationControllerThinning& |
ScrollbarAnimationController::GetScrollbarAnimationController( |
ScrollbarOrientation orientation) const { |
DCHECK(need_thinning_animation_); |
- if (orientation == ScrollbarOrientation::VERTICAL) |
- return *(vertical_controller_.get()); |
- else |
- return *(horizontal_controller_.get()); |
+ return *scrollbar_controllers_[orientation].get(); |
} |
void ScrollbarAnimationController::StartAnimation() { |
@@ -151,8 +203,8 @@ bool ScrollbarAnimationController::Animate(base::TimeTicks now) { |
} |
if (need_thinning_animation_) { |
- animated |= vertical_controller_->Animate(now); |
- animated |= horizontal_controller_->Animate(now); |
+ for (auto& controller : scrollbar_controllers_) |
+ animated |= controller->Animate(now); |
} |
return animated; |
@@ -219,8 +271,8 @@ void ScrollbarAnimationController::DidScrollUpdate() { |
} |
if (need_thinning_animation_) { |
- vertical_controller_->UpdateThumbThicknessScale(); |
- horizontal_controller_->UpdateThumbThicknessScale(); |
+ for (auto& controller : scrollbar_controllers_) |
+ controller->UpdateThumbThicknessScale(); |
} |
} |
@@ -250,16 +302,16 @@ void ScrollbarAnimationController::DidMouseDown() { |
if (!need_thinning_animation_ || ScrollbarsHidden()) |
return; |
- vertical_controller_->DidMouseDown(); |
- horizontal_controller_->DidMouseDown(); |
+ for (auto& controller : scrollbar_controllers_) |
+ controller->DidMouseDown(); |
} |
void ScrollbarAnimationController::DidMouseUp() { |
if (!need_thinning_animation_ || !Captured()) |
return; |
- vertical_controller_->DidMouseUp(); |
- horizontal_controller_->DidMouseUp(); |
+ for (auto& controller : scrollbar_controllers_) |
+ controller->DidMouseUp(); |
if (!MouseIsNearAnyScrollbar()) |
PostDelayedAnimation(FADE_OUT, false); |
@@ -269,11 +321,14 @@ void ScrollbarAnimationController::DidMouseLeave() { |
if (!need_thinning_animation_) |
return; |
- vertical_controller_->DidMouseLeave(); |
- horizontal_controller_->DidMouseLeave(); |
+ for (auto& controller : scrollbar_controllers_) |
+ controller->DidMouseLeave(); |
+ |
+ for (bool& mouse_is_near_scrollbar : mouse_is_near_scrollbar_) |
+ mouse_is_near_scrollbar = false; |
delayed_scrollbar_animation_.Cancel(); |
- need_trigger_scrollbar_show_ = false; |
+ need_trigger_scrollbar_fade_in_ = false; |
if (ScrollbarsHidden() || Captured()) |
return; |
@@ -281,25 +336,36 @@ void ScrollbarAnimationController::DidMouseLeave() { |
PostDelayedAnimation(FADE_OUT, false); |
} |
-void ScrollbarAnimationController::DidMouseMoveNear( |
- ScrollbarOrientation orientation, |
- float distance) { |
+void ScrollbarAnimationController::DidMouseMove( |
+ const gfx::PointF& device_viewport_point) { |
if (!need_thinning_animation_) |
return; |
- bool need_trigger_scrollbar_show_before = need_trigger_scrollbar_show_; |
+ bool need_trigger_scrollbar_fade_in_before = need_trigger_scrollbar_fade_in_; |
+ |
+ for (ScrollbarOrientation orientation : orientations) { |
+ ScrollbarLayerImplBase* scrollbar = GetScrollbar(orientation); |
+ float distance_to_scrollbar_track = |
+ DistanceToScrollbarTrack(device_viewport_point, scrollbar); |
+ float distance_to_scrollbar_thumb = |
+ DistanceToScrollbarThumb(device_viewport_point, scrollbar); |
- GetScrollbarAnimationController(orientation).DidMouseMoveNear(distance); |
+ GetScrollbarAnimationController(orientation) |
+ .DidMouseMove(distance_to_scrollbar_thumb); |
+ |
+ mouse_is_near_scrollbar_[orientation] = |
+ distance_to_scrollbar_track < kMouseMoveDistanceToTriggerFadeIn; |
+ } |
- need_trigger_scrollbar_show_ = |
- CalcNeedTriggerScrollbarShow(orientation, distance); |
+ need_trigger_scrollbar_fade_in_ = MouseIsNearAnyScrollbar(); |
if (Captured()) |
return; |
if (ScrollbarsHidden()) { |
- if (need_trigger_scrollbar_show_before != need_trigger_scrollbar_show_) { |
- if (need_trigger_scrollbar_show_) { |
+ if (need_trigger_scrollbar_fade_in_before != |
+ need_trigger_scrollbar_fade_in_) { |
+ if (need_trigger_scrollbar_fade_in_) { |
PostDelayedAnimation(FADE_IN, false); |
} else { |
delayed_scrollbar_animation_.Cancel(); |
@@ -315,42 +381,29 @@ void ScrollbarAnimationController::DidMouseMoveNear( |
} |
} |
-bool ScrollbarAnimationController::CalcNeedTriggerScrollbarShow( |
- ScrollbarOrientation orientation, |
- float distance) const { |
+bool ScrollbarAnimationController::MouseIsOverScrollbarThumb( |
+ ScrollbarOrientation orientation) const { |
DCHECK(need_thinning_animation_); |
- |
- if (vertical_controller_->mouse_is_over_scrollbar() || |
- horizontal_controller_->mouse_is_over_scrollbar()) |
- return true; |
- |
- for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) { |
- if (scrollbar->orientation() != orientation) |
- continue; |
- |
- if (distance < kMouseMoveDistanceToTriggerFadeIn) |
- return true; |
- } |
- |
- return false; |
+ return GetScrollbarAnimationController(orientation) |
+ .mouse_is_over_scrollbar_thumb(); |
} |
-bool ScrollbarAnimationController::MouseIsOverScrollbar( |
+bool ScrollbarAnimationController::MouseIsNearScrollbarThumb( |
ScrollbarOrientation orientation) const { |
DCHECK(need_thinning_animation_); |
- return GetScrollbarAnimationController(orientation).mouse_is_over_scrollbar(); |
+ return GetScrollbarAnimationController(orientation) |
+ .mouse_is_near_scrollbar_thumb(); |
} |
bool ScrollbarAnimationController::MouseIsNearScrollbar( |
ScrollbarOrientation orientation) const { |
DCHECK(need_thinning_animation_); |
- return GetScrollbarAnimationController(orientation).mouse_is_near_scrollbar(); |
+ return mouse_is_near_scrollbar_[orientation]; |
} |
bool ScrollbarAnimationController::MouseIsNearAnyScrollbar() const { |
DCHECK(need_thinning_animation_); |
- return vertical_controller_->mouse_is_near_scrollbar() || |
- horizontal_controller_->mouse_is_near_scrollbar(); |
+ return MouseIsNearScrollbar(VERTICAL) || MouseIsNearScrollbar(HORIZONTAL); |
} |
bool ScrollbarAnimationController::ScrollbarsHidden() const { |
@@ -359,7 +412,8 @@ bool ScrollbarAnimationController::ScrollbarsHidden() const { |
bool ScrollbarAnimationController::Captured() const { |
DCHECK(need_thinning_animation_); |
- return vertical_controller_->captured() || horizontal_controller_->captured(); |
+ return GetScrollbarAnimationController(VERTICAL).captured() || |
+ GetScrollbarAnimationController(HORIZONTAL).captured(); |
} |
void ScrollbarAnimationController::Show() { |