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

Side by Side Diff: cc/input/scrollbar_animation_controller.cc

Issue 2841943002: Overlay scrollbars expand only when mouse is near thumb (Closed)
Patch Set: weiliangc comment addressed Created 3 years, 7 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 unified diff | Download patch
OLDNEW
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 22 matching lines...) Expand all
33 } 33 }
34 34
35 ScrollbarAnimationController::ScrollbarAnimationController( 35 ScrollbarAnimationController::ScrollbarAnimationController(
36 ElementId scroll_element_id, 36 ElementId scroll_element_id,
37 ScrollbarAnimationControllerClient* client, 37 ScrollbarAnimationControllerClient* client,
38 base::TimeDelta fade_delay, 38 base::TimeDelta fade_delay,
39 base::TimeDelta fade_duration) 39 base::TimeDelta fade_duration)
40 : client_(client), 40 : client_(client),
41 fade_delay_(fade_delay), 41 fade_delay_(fade_delay),
42 fade_duration_(fade_duration), 42 fade_duration_(fade_duration),
43 need_trigger_scrollbar_show_(false), 43 need_trigger_scrollbar_fade_in_(false),
44 is_animating_(false), 44 is_animating_(false),
45 animation_change_(NONE), 45 animation_change_(NONE),
46 scroll_element_id_(scroll_element_id), 46 scroll_element_id_(scroll_element_id),
47 currently_scrolling_(false), 47 currently_scrolling_(false),
48 show_in_fast_scroll_(false), 48 show_in_fast_scroll_(false),
49 opacity_(0.0f), 49 opacity_(0.0f),
50 show_scrollbars_on_scroll_gesture_(false), 50 show_scrollbars_on_scroll_gesture_(false),
51 need_thinning_animation_(false), 51 need_thinning_animation_(false),
52 weak_factory_(this) { 52 weak_factory_(this) {
53 ApplyOpacityToScrollbars(0.0f); 53 ApplyOpacityToScrollbars(0.0f);
54 } 54 }
55 55
56 ScrollbarAnimationController::ScrollbarAnimationController( 56 ScrollbarAnimationController::ScrollbarAnimationController(
57 ElementId scroll_element_id, 57 ElementId scroll_element_id,
58 ScrollbarAnimationControllerClient* client, 58 ScrollbarAnimationControllerClient* client,
59 base::TimeDelta fade_delay, 59 base::TimeDelta fade_delay,
60 base::TimeDelta fade_duration, 60 base::TimeDelta fade_duration,
61 base::TimeDelta thinning_duration) 61 base::TimeDelta thinning_duration)
62 : client_(client), 62 : client_(client),
63 fade_delay_(fade_delay), 63 fade_delay_(fade_delay),
64 fade_duration_(fade_duration), 64 fade_duration_(fade_duration),
65 need_trigger_scrollbar_show_(false), 65 need_trigger_scrollbar_fade_in_(false),
66 is_animating_(false), 66 is_animating_(false),
67 animation_change_(NONE), 67 animation_change_(NONE),
68 scroll_element_id_(scroll_element_id), 68 scroll_element_id_(scroll_element_id),
69 currently_scrolling_(false), 69 currently_scrolling_(false),
70 show_in_fast_scroll_(false), 70 show_in_fast_scroll_(false),
71 opacity_(0.0f), 71 opacity_(0.0f),
72 show_scrollbars_on_scroll_gesture_(true), 72 show_scrollbars_on_scroll_gesture_(true),
73 need_thinning_animation_(true), 73 need_thinning_animation_(true),
74 weak_factory_(this) { 74 weak_factory_(this) {
75 vertical_controller_ = SingleScrollbarAnimationControllerThinning::Create( 75 vertical_controller_ = SingleScrollbarAnimationControllerThinning::Create(
76 scroll_element_id, ScrollbarOrientation::VERTICAL, client, 76 scroll_element_id, ScrollbarOrientation::VERTICAL, client,
77 thinning_duration); 77 thinning_duration);
78 horizontal_controller_ = SingleScrollbarAnimationControllerThinning::Create( 78 horizontal_controller_ = SingleScrollbarAnimationControllerThinning::Create(
79 scroll_element_id, ScrollbarOrientation::HORIZONTAL, client, 79 scroll_element_id, ScrollbarOrientation::HORIZONTAL, client,
80 thinning_duration); 80 thinning_duration);
81
81 ApplyOpacityToScrollbars(0.0f); 82 ApplyOpacityToScrollbars(0.0f);
82 } 83 }
83 84
84 ScrollbarAnimationController::~ScrollbarAnimationController() {} 85 ScrollbarAnimationController::~ScrollbarAnimationController() {}
85 86
86 ScrollbarSet ScrollbarAnimationController::Scrollbars() const { 87 ScrollbarSet ScrollbarAnimationController::Scrollbars() const {
87 return client_->ScrollbarsFor(scroll_element_id_); 88 return client_->ScrollbarsFor(scroll_element_id_);
88 } 89 }
89 90
90 SingleScrollbarAnimationControllerThinning& 91 SingleScrollbarAnimationControllerThinning&
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 } 242 }
242 243
243 void ScrollbarAnimationController::DidMouseLeave() { 244 void ScrollbarAnimationController::DidMouseLeave() {
244 if (!need_thinning_animation_) 245 if (!need_thinning_animation_)
245 return; 246 return;
246 247
247 vertical_controller_->DidMouseLeave(); 248 vertical_controller_->DidMouseLeave();
248 horizontal_controller_->DidMouseLeave(); 249 horizontal_controller_->DidMouseLeave();
249 250
250 delayed_scrollbar_animation_.Cancel(); 251 delayed_scrollbar_animation_.Cancel();
251 need_trigger_scrollbar_show_ = false; 252 need_trigger_scrollbar_fade_in_ = false;
252 253
253 if (ScrollbarsHidden() || Captured()) 254 if (ScrollbarsHidden() || Captured())
254 return; 255 return;
255 256
256 PostDelayedAnimation(FADE_OUT); 257 PostDelayedAnimation(FADE_OUT);
257 } 258 }
258 259
259 void ScrollbarAnimationController::DidMouseMoveNear( 260 void ScrollbarAnimationController::DidMouseMove(
260 ScrollbarOrientation orientation, 261 const gfx::PointF& device_viewport_point) {
261 float distance) {
262 if (!need_thinning_animation_) 262 if (!need_thinning_animation_)
263 return; 263 return;
264 264
265 bool need_trigger_scrollbar_show_before = need_trigger_scrollbar_show_; 265 bool need_trigger_scrollbar_fade_in_before = need_trigger_scrollbar_fade_in_;
266 266
267 GetScrollbarAnimationController(orientation).DidMouseMoveNear(distance); 267 vertical_controller_->DidMouseMove(device_viewport_point);
268 horizontal_controller_->DidMouseMove(device_viewport_point);
268 269
269 need_trigger_scrollbar_show_ = 270 need_trigger_scrollbar_fade_in_ = MouseIsNearAnyScrollbar();
270 CalcNeedTriggerScrollbarShow(orientation, distance);
271 271
272 if (Captured()) 272 if (Captured())
273 return; 273 return;
274 274
275 if (ScrollbarsHidden()) { 275 if (ScrollbarsHidden()) {
276 if (need_trigger_scrollbar_show_before != need_trigger_scrollbar_show_) { 276 if (need_trigger_scrollbar_fade_in_before !=
277 if (need_trigger_scrollbar_show_) { 277 need_trigger_scrollbar_fade_in_) {
278 if (need_trigger_scrollbar_fade_in_) {
278 PostDelayedAnimation(FADE_IN); 279 PostDelayedAnimation(FADE_IN);
279 } else { 280 } else {
280 delayed_scrollbar_animation_.Cancel(); 281 delayed_scrollbar_animation_.Cancel();
281 } 282 }
282 } 283 }
283 } else { 284 } else {
284 if (MouseIsNearAnyScrollbar()) { 285 if (MouseIsNearAnyScrollbar()) {
285 Show(); 286 Show();
286 StopAnimation(); 287 StopAnimation();
287 } else if (!is_animating_) { 288 } else if (!is_animating_) {
288 PostDelayedAnimation(FADE_OUT); 289 PostDelayedAnimation(FADE_OUT);
289 } 290 }
290 } 291 }
291 } 292 }
292 293
293 bool ScrollbarAnimationController::CalcNeedTriggerScrollbarShow( 294 bool ScrollbarAnimationController::MouseIsOverScrollbarThumb(
294 ScrollbarOrientation orientation, 295 ScrollbarOrientation orientation) const {
295 float distance) const {
296 DCHECK(need_thinning_animation_); 296 DCHECK(need_thinning_animation_);
297 297 return GetScrollbarAnimationController(orientation)
298 if (vertical_controller_->mouse_is_over_scrollbar() || 298 .mouse_is_over_scrollbar_thumb();
299 horizontal_controller_->mouse_is_over_scrollbar())
300 return true;
301
302 for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) {
303 if (scrollbar->orientation() != orientation)
304 continue;
305
306 if (distance < kMouseMoveDistanceToTriggerFadeIn)
307 return true;
308 }
309
310 return false;
311 } 299 }
312 300
313 bool ScrollbarAnimationController::MouseIsOverScrollbar( 301 bool ScrollbarAnimationController::MouseIsNearScrollbarThumb(
314 ScrollbarOrientation orientation) const { 302 ScrollbarOrientation orientation) const {
315 DCHECK(need_thinning_animation_); 303 DCHECK(need_thinning_animation_);
316 return GetScrollbarAnimationController(orientation).mouse_is_over_scrollbar(); 304 return GetScrollbarAnimationController(orientation)
305 .mouse_is_near_scrollbar_thumb();
317 } 306 }
318 307
319 bool ScrollbarAnimationController::MouseIsNearScrollbar( 308 bool ScrollbarAnimationController::MouseIsNearScrollbar(
320 ScrollbarOrientation orientation) const { 309 ScrollbarOrientation orientation) const {
321 DCHECK(need_thinning_animation_); 310 DCHECK(need_thinning_animation_);
322 return GetScrollbarAnimationController(orientation).mouse_is_near_scrollbar(); 311 return GetScrollbarAnimationController(orientation)
312 .mouse_is_near_scrollbar_track();
323 } 313 }
324 314
325 bool ScrollbarAnimationController::MouseIsNearAnyScrollbar() const { 315 bool ScrollbarAnimationController::MouseIsNearAnyScrollbar() const {
326 DCHECK(need_thinning_animation_); 316 DCHECK(need_thinning_animation_);
327 return vertical_controller_->mouse_is_near_scrollbar() || 317 return vertical_controller_->mouse_is_near_scrollbar_track() ||
328 horizontal_controller_->mouse_is_near_scrollbar(); 318 horizontal_controller_->mouse_is_near_scrollbar_track();
329 } 319 }
330 320
331 bool ScrollbarAnimationController::ScrollbarsHidden() const { 321 bool ScrollbarAnimationController::ScrollbarsHidden() const {
332 return opacity_ == 0.0f; 322 return opacity_ == 0.0f;
333 } 323 }
334 324
335 bool ScrollbarAnimationController::Captured() const { 325 bool ScrollbarAnimationController::Captured() const {
336 DCHECK(need_thinning_animation_); 326 DCHECK(need_thinning_animation_);
337 return vertical_controller_->captured() || horizontal_controller_->captured(); 327 return GetScrollbarAnimationController(VERTICAL).captured() ||
328 GetScrollbarAnimationController(HORIZONTAL).captured();
338 } 329 }
339 330
340 void ScrollbarAnimationController::Show() { 331 void ScrollbarAnimationController::Show() {
341 delayed_scrollbar_animation_.Cancel(); 332 delayed_scrollbar_animation_.Cancel();
342 ApplyOpacityToScrollbars(1.0f); 333 ApplyOpacityToScrollbars(1.0f);
343 } 334 }
344 335
345 void ScrollbarAnimationController::ApplyOpacityToScrollbars(float opacity) { 336 void ScrollbarAnimationController::ApplyOpacityToScrollbars(float opacity) {
346 for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) { 337 for (ScrollbarLayerImplBase* scrollbar : Scrollbars()) {
347 if (!scrollbar->is_overlay_scrollbar()) 338 DCHECK(scrollbar->is_overlay_scrollbar());
348 continue;
349 float effective_opacity = scrollbar->CanScrollOrientation() ? opacity : 0; 339 float effective_opacity = scrollbar->CanScrollOrientation() ? opacity : 0;
350 scrollbar->SetOverlayScrollbarLayerOpacityAnimated(effective_opacity); 340 scrollbar->SetOverlayScrollbarLayerOpacityAnimated(effective_opacity);
351 } 341 }
352 342
353 bool previouslyVisible = opacity_ > 0.0f; 343 bool previouslyVisible = opacity_ > 0.0f;
354 bool currentlyVisible = opacity > 0.0f; 344 bool currentlyVisible = opacity > 0.0f;
355 345
356 if (opacity_ != opacity) 346 if (opacity_ != opacity)
357 client_->SetNeedsRedrawForScrollbarAnimation(); 347 client_->SetNeedsRedrawForScrollbarAnimation();
358 348
359 opacity_ = opacity; 349 opacity_ = opacity;
360 350
361 if (previouslyVisible != currentlyVisible) 351 if (previouslyVisible != currentlyVisible)
362 client_->DidChangeScrollbarVisibility(); 352 client_->DidChangeScrollbarVisibility();
363 } 353 }
364 354
365 } // namespace cc 355 } // namespace cc
OLDNEW
« no previous file with comments | « cc/input/scrollbar_animation_controller.h ('k') | cc/input/scrollbar_animation_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698