OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/wm/core/window_animations.h" | 5 #include "ui/wm/core/window_animations.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <vector> | 10 #include <vector> |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 class RotateHidingWindowAnimationObserver | 397 class RotateHidingWindowAnimationObserver |
398 : public HidingWindowAnimationObserverBase, | 398 : public HidingWindowAnimationObserverBase, |
399 public ui::LayerAnimationObserver { | 399 public ui::LayerAnimationObserver { |
400 public: | 400 public: |
401 explicit RotateHidingWindowAnimationObserver(aura::Window* window) | 401 explicit RotateHidingWindowAnimationObserver(aura::Window* window) |
402 : HidingWindowAnimationObserverBase(window) {} | 402 : HidingWindowAnimationObserverBase(window) {} |
403 ~RotateHidingWindowAnimationObserver() override {} | 403 ~RotateHidingWindowAnimationObserver() override {} |
404 | 404 |
405 // Destroys itself after |last_sequence| ends or is aborted. Does not take | 405 // Destroys itself after |last_sequence| ends or is aborted. Does not take |
406 // ownership of |last_sequence|, which should not be NULL. | 406 // ownership of |last_sequence|, which should not be NULL. |
407 void SetLastSequence(ui::LayerAnimationSequence* last_sequence) { | 407 void AddSequence(ui::LayerAnimationSequence* sequence) { |
408 last_sequence->AddObserver(this); | 408 sequences_.push_back(sequence); |
| 409 sequence->AddObserver(this); |
409 } | 410 } |
410 | 411 |
411 // ui::LayerAnimationObserver: | 412 // ui::LayerAnimationObserver: |
412 void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override { | 413 void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override { |
413 OnAnimationCompleted(); | 414 RemoveAnimation(sequence); |
414 } | 415 } |
415 void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override { | 416 void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override { |
416 OnAnimationCompleted(); | 417 RemoveAnimation(sequence); |
417 } | 418 } |
418 void OnLayerAnimationScheduled( | 419 void OnLayerAnimationScheduled( |
419 ui::LayerAnimationSequence* sequence) override {} | 420 ui::LayerAnimationSequence* sequence) override {} |
420 | 421 |
421 private: | 422 private: |
| 423 // Destroys itself after last sequence ends or is aborted. |
| 424 void RemoveAnimation(ui::LayerAnimationSequence *sequence) { |
| 425 auto it = std::remove(sequences_.begin(), sequences_.end(), sequence); |
| 426 if (it != sequences_.end()) { |
| 427 sequences_.erase(it); |
| 428 if (sequences_.empty()) |
| 429 OnAnimationCompleted(); |
| 430 } |
| 431 } |
| 432 |
| 433 std::vector<ui::LayerAnimationSequence *> sequences_; |
| 434 |
422 DISALLOW_COPY_AND_ASSIGN(RotateHidingWindowAnimationObserver); | 435 DISALLOW_COPY_AND_ASSIGN(RotateHidingWindowAnimationObserver); |
423 }; | 436 }; |
424 | 437 |
425 void AddLayerAnimationsForRotate(aura::Window* window, bool show) { | 438 void AddLayerAnimationsForRotate(aura::Window* window, bool show) { |
426 if (show) | 439 if (show) |
427 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); | 440 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); |
428 | 441 |
429 base::TimeDelta duration = base::TimeDelta::FromMilliseconds( | 442 base::TimeDelta duration = base::TimeDelta::FromMilliseconds( |
430 kWindowAnimation_Rotate_DurationMS); | 443 kWindowAnimation_Rotate_DurationMS); |
431 | 444 |
432 RotateHidingWindowAnimationObserver* observer = NULL; | 445 RotateHidingWindowAnimationObserver* observer = NULL; |
433 | 446 |
434 if (!show) { | 447 if (!show) { |
435 observer = new RotateHidingWindowAnimationObserver(window); | 448 observer = new RotateHidingWindowAnimationObserver(window); |
436 window->layer()->GetAnimator()->SchedulePauseForProperties( | 449 window->layer()->GetAnimator()->SchedulePauseForProperties( |
437 duration * (100 - kWindowAnimation_Rotate_OpacityDurationPercent) / 100, | 450 duration * (100 - kWindowAnimation_Rotate_OpacityDurationPercent) / 100, |
438 ui::LayerAnimationElement::OPACITY); | 451 ui::LayerAnimationElement::OPACITY); |
439 } | 452 } |
440 scoped_ptr<ui::LayerAnimationElement> opacity( | 453 scoped_ptr<ui::LayerAnimationElement> opacity( |
441 ui::LayerAnimationElement::CreateOpacityElement( | 454 ui::LayerAnimationElement::CreateOpacityElement( |
442 show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity, | 455 show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity, |
443 duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100)); | 456 duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100)); |
444 opacity->set_tween_type(gfx::Tween::EASE_IN_OUT); | 457 opacity->set_tween_type(gfx::Tween::EASE_IN_OUT); |
445 window->layer()->GetAnimator()->ScheduleAnimation( | 458 ui::LayerAnimationSequence *opacity_sequence = |
446 new ui::LayerAnimationSequence(opacity.release())); | 459 new ui::LayerAnimationSequence(opacity.release()); |
| 460 window->layer()->GetAnimator()->ScheduleAnimation(opacity_sequence); |
| 461 if (observer) |
| 462 observer->AddSequence(opacity_sequence); |
447 | 463 |
448 float xcenter = window->bounds().width() * 0.5; | 464 float xcenter = window->bounds().width() * 0.5; |
449 | 465 |
450 gfx::Transform transform; | 466 gfx::Transform transform; |
451 transform.Translate(xcenter, 0); | 467 transform.Translate(xcenter, 0); |
452 transform.ApplyPerspectiveDepth(kWindowAnimation_Rotate_PerspectiveDepth); | 468 transform.ApplyPerspectiveDepth(kWindowAnimation_Rotate_PerspectiveDepth); |
453 transform.Translate(-xcenter, 0); | 469 transform.Translate(-xcenter, 0); |
454 scoped_ptr<ui::InterpolatedTransform> perspective( | 470 scoped_ptr<ui::InterpolatedTransform> perspective( |
455 new ui::InterpolatedConstantTransform(transform)); | 471 new ui::InterpolatedConstantTransform(transform)); |
456 | 472 |
(...skipping 13 matching lines...) Expand all Loading... |
470 gfx::Vector3dF(1, 0, 0), 0, kWindowAnimation_Rotate_DegreesX)); | 486 gfx::Vector3dF(1, 0, 0), 0, kWindowAnimation_Rotate_DegreesX)); |
471 | 487 |
472 scale_about_pivot->SetChild(perspective.release()); | 488 scale_about_pivot->SetChild(perspective.release()); |
473 translation->SetChild(scale_about_pivot.release()); | 489 translation->SetChild(scale_about_pivot.release()); |
474 rotation->SetChild(translation.release()); | 490 rotation->SetChild(translation.release()); |
475 rotation->SetReversed(show); | 491 rotation->SetReversed(show); |
476 | 492 |
477 scoped_ptr<ui::LayerAnimationElement> transition( | 493 scoped_ptr<ui::LayerAnimationElement> transition( |
478 ui::LayerAnimationElement::CreateInterpolatedTransformElement( | 494 ui::LayerAnimationElement::CreateInterpolatedTransformElement( |
479 rotation.release(), duration)); | 495 rotation.release(), duration)); |
480 ui::LayerAnimationSequence* last_sequence = | 496 ui::LayerAnimationSequence* transition_sequence = |
481 new ui::LayerAnimationSequence(transition.release()); | 497 new ui::LayerAnimationSequence(transition.release()); |
482 window->layer()->GetAnimator()->ScheduleAnimation(last_sequence); | 498 window->layer()->GetAnimator()->ScheduleAnimation(transition_sequence); |
483 | 499 |
484 if (observer) { | 500 if (observer) { |
485 observer->SetLastSequence(last_sequence); | 501 observer->AddSequence(transition_sequence); |
486 observer->DetachAndRecreateLayers(); | 502 observer->DetachAndRecreateLayers(); |
487 } | 503 } |
488 } | 504 } |
489 | 505 |
490 void AnimateShowWindow_Rotate(aura::Window* window) { | 506 void AnimateShowWindow_Rotate(aura::Window* window) { |
491 AddLayerAnimationsForRotate(window, true); | 507 AddLayerAnimationsForRotate(window, true); |
492 } | 508 } |
493 | 509 |
494 void AnimateHideWindow_Rotate(aura::Window* window) { | 510 void AnimateHideWindow_Rotate(aura::Window* window) { |
495 AddLayerAnimationsForRotate(window, false); | 511 AddLayerAnimationsForRotate(window, false); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 // being accessed via Remote Desktop. | 677 // being accessed via Remote Desktop. |
662 if (ui::ScopedAnimationDurationScaleMode::duration_scale_mode() == | 678 if (ui::ScopedAnimationDurationScaleMode::duration_scale_mode() == |
663 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION) | 679 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION) |
664 return false; | 680 return false; |
665 | 681 |
666 // Let the user decide whether or not to play the animation. | 682 // Let the user decide whether or not to play the animation. |
667 return !gfx::Animation::ShouldRenderRichAnimation(); | 683 return !gfx::Animation::ShouldRenderRichAnimation(); |
668 } | 684 } |
669 | 685 |
670 } // namespace wm | 686 } // namespace wm |
OLD | NEW |