Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1577)

Unified Diff: cc/input/scrollbar_animation_controller.cc

Issue 2841943002: Overlay scrollbars expand only when mouse is near thumb (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/input/scrollbar_animation_controller.cc
diff --git a/cc/input/scrollbar_animation_controller.cc b/cc/input/scrollbar_animation_controller.cc
index f3f1a48121f113abcdb926d304e04dee22d948b0..1e491fb6c8a6ed55733b2a5ad51c07f58a507271 100644
--- a/cc/input/scrollbar_animation_controller.cc
+++ b/cc/input/scrollbar_animation_controller.cc
@@ -9,6 +9,40 @@
#include "base/time/time.h"
#include "cc/trees/layer_tree_impl.h"
+namespace {
+
+float DistanceToScrollbar(const gfx::PointF& device_viewport_point,
bokan 2017/04/25 19:36:21 This should be called "DistanceToScrollbarTrack"
+ const cc::ScrollbarLayerImplBase* scrollbar) {
+ if (!scrollbar)
+ return std::numeric_limits<float>::max();
+
+ gfx::Rect scrollbar_bounds(scrollbar->bounds());
+
+ gfx::RectF device_viewport_scrollbar_bounds = cc::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 cc::ScrollbarLayerImplBase* scrollbar) {
+ if (!scrollbar)
+ return std::numeric_limits<float>::max();
+
+ gfx::Rect thumb_bounds(scrollbar->ComputeExpandedThumbQuadRect());
+
+ gfx::RectF device_viewport_scrollbar_bounds = cc::MathUtil::MapClippedRect(
+ scrollbar->ScreenSpaceTransform(), gfx::RectF(thumb_bounds));
+
+ return device_viewport_scrollbar_bounds.ManhattanDistanceToPoint(
+ device_viewport_point) /
+ scrollbar->layer_tree_impl()->device_scale_factor();
+}
+
+} // namespace
+
namespace cc {
std::unique_ptr<ScrollbarAnimationController>
@@ -95,6 +129,20 @@ 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;
+ }
+
+ NOTREACHED();
+ return nullptr;
+}
+
SingleScrollbarAnimationControllerThinning&
ScrollbarAnimationController::GetScrollbarAnimationController(
ScrollbarOrientation orientation) const {
@@ -283,16 +331,24 @@ void ScrollbarAnimationController::DidMouseLeave() {
void ScrollbarAnimationController::DidMouseMoveNear(
bokan 2017/04/25 19:36:21 This no longer cares about distance - lets just ca
ScrollbarOrientation orientation,
- float distance) {
+ const gfx::PointF& device_viewport_point) {
if (!need_thinning_animation_)
return;
bool need_trigger_scrollbar_show_before = need_trigger_scrollbar_show_;
- GetScrollbarAnimationController(orientation).DidMouseMoveNear(distance);
+ ScrollbarLayerImplBase* scrollbar = GetScrollbar(orientation);
+
+ float distance_to_scrollbar =
+ DistanceToScrollbar(device_viewport_point, scrollbar);
+ float distance_to_thumb =
+ DistanceToScrollbarThumb(device_viewport_point, scrollbar);
+
+ GetScrollbarAnimationController(orientation)
+ .DidMouseMoveNear(distance_to_scrollbar, distance_to_thumb);
need_trigger_scrollbar_show_ =
- CalcNeedTriggerScrollbarShow(orientation, distance);
+ CalcNeedTriggerScrollbarShow(orientation, distance_to_scrollbar);
if (Captured())
return;
@@ -320,8 +376,8 @@ bool ScrollbarAnimationController::CalcNeedTriggerScrollbarShow(
float distance) const {
DCHECK(need_thinning_animation_);
- if (vertical_controller_->mouse_is_over_scrollbar() ||
- horizontal_controller_->mouse_is_over_scrollbar())
+ if (vertical_controller_->mouse_is_over_scrollbar_thumb() ||
bokan 2017/04/25 19:36:21 I think the show should still happen for "over the
+ horizontal_controller_->mouse_is_over_scrollbar_thumb())
return true;
for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) {
@@ -335,10 +391,18 @@ bool ScrollbarAnimationController::CalcNeedTriggerScrollbarShow(
return false;
}
-bool ScrollbarAnimationController::MouseIsOverScrollbar(
+bool ScrollbarAnimationController::MouseIsOverScrollbarThumb(
+ ScrollbarOrientation orientation) const {
+ DCHECK(need_thinning_animation_);
+ return GetScrollbarAnimationController(orientation)
+ .mouse_is_over_scrollbar_thumb();
+}
+
+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(

Powered by Google App Engine
This is Rietveld 408576698