| 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/views/corewm/window_animations.h" | 5 #include "ui/views/corewm/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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 | 49 |
| 50 namespace views { | 50 namespace views { |
| 51 namespace corewm { | 51 namespace corewm { |
| 52 namespace { | 52 namespace { |
| 53 const float kWindowAnimation_Vertical_TranslateY = 15.f; | 53 const float kWindowAnimation_Vertical_TranslateY = 15.f; |
| 54 } // namespace | 54 } // namespace |
| 55 | 55 |
| 56 DEFINE_WINDOW_PROPERTY_KEY(int, | 56 DEFINE_WINDOW_PROPERTY_KEY(int, |
| 57 kWindowVisibilityAnimationTypeKey, | 57 kWindowVisibilityAnimationTypeKey, |
| 58 WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT); | 58 WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT); |
| 59 DEFINE_WINDOW_PROPERTY_KEY(int, kWindowShowAnimationDurationKey, 0); | 59 DEFINE_WINDOW_PROPERTY_KEY(int, kWindowVisibilityAnimationDurationKey, 0); |
| 60 DEFINE_WINDOW_PROPERTY_KEY(int, kWindowHideAnimationDurationKey, 0); | |
| 61 DEFINE_WINDOW_PROPERTY_KEY(WindowVisibilityAnimationTransition, | 60 DEFINE_WINDOW_PROPERTY_KEY(WindowVisibilityAnimationTransition, |
| 62 kWindowVisibilityAnimationTransitionKey, | 61 kWindowVisibilityAnimationTransitionKey, |
| 63 ANIMATE_BOTH); | 62 ANIMATE_BOTH); |
| 64 DEFINE_WINDOW_PROPERTY_KEY(float, | 63 DEFINE_WINDOW_PROPERTY_KEY(float, |
| 65 kWindowVisibilityAnimationVerticalPositionKey, | 64 kWindowVisibilityAnimationVerticalPositionKey, |
| 66 kWindowAnimation_Vertical_TranslateY); | 65 kWindowAnimation_Vertical_TranslateY); |
| 67 | 66 |
| 68 namespace { | 67 namespace { |
| 69 | 68 |
| 70 const int kDefaultAnimationDurationMS = 200; | |
| 71 const int kDefaultAnimationDurationForMenuMS = 150; | 69 const int kDefaultAnimationDurationForMenuMS = 150; |
| 72 | 70 |
| 73 const float kWindowAnimation_HideOpacity = 0.f; | 71 const float kWindowAnimation_HideOpacity = 0.f; |
| 74 const float kWindowAnimation_ShowOpacity = 1.f; | 72 const float kWindowAnimation_ShowOpacity = 1.f; |
| 75 const float kWindowAnimation_TranslateFactor = 0.5f; | 73 const float kWindowAnimation_TranslateFactor = 0.5f; |
| 76 const float kWindowAnimation_ScaleFactor = .95f; | 74 const float kWindowAnimation_ScaleFactor = .95f; |
| 77 | 75 |
| 78 const int kWindowAnimation_Rotate_DurationMS = 180; | 76 const int kWindowAnimation_Rotate_DurationMS = 180; |
| 79 const int kWindowAnimation_Rotate_OpacityDurationPercent = 90; | 77 const int kWindowAnimation_Rotate_OpacityDurationPercent = 90; |
| 80 const float kWindowAnimation_Rotate_TranslateY = -20.f; | 78 const float kWindowAnimation_Rotate_TranslateY = -20.f; |
| 81 const float kWindowAnimation_Rotate_PerspectiveDepth = 500.f; | 79 const float kWindowAnimation_Rotate_PerspectiveDepth = 500.f; |
| 82 const float kWindowAnimation_Rotate_DegreesX = 5.f; | 80 const float kWindowAnimation_Rotate_DegreesX = 5.f; |
| 83 const float kWindowAnimation_Rotate_ScaleFactor = .99f; | 81 const float kWindowAnimation_Rotate_ScaleFactor = .99f; |
| 84 | 82 |
| 85 const float kWindowAnimation_Bounce_Scale = 1.02f; | 83 const float kWindowAnimation_Bounce_Scale = 1.02f; |
| 86 const int kWindowAnimation_Bounce_DurationMS = 180; | 84 const int kWindowAnimation_Bounce_DurationMS = 180; |
| 87 const int kWindowAnimation_Bounce_GrowShrinkDurationPercent = 40; | 85 const int kWindowAnimation_Bounce_GrowShrinkDurationPercent = 40; |
| 88 | 86 |
| 89 base::TimeDelta GetDefaultWindowVisibilityAnimationDuration( | 87 base::TimeDelta GetWindowVisibilityAnimationDuration(aura::Window* window) { |
| 90 aura::Window* window) { | 88 int duration = |
| 91 int duration_ms = (window->type() == ui::wm::WINDOW_TYPE_MENU) ? | 89 window->GetProperty(kWindowVisibilityAnimationDurationKey); |
| 92 kDefaultAnimationDurationForMenuMS : kDefaultAnimationDurationMS; | 90 if (duration == 0 && window->type() == ui::wm::WINDOW_TYPE_MENU) { |
| 93 return base::TimeDelta::FromMilliseconds(duration_ms); | 91 return base::TimeDelta::FromMilliseconds( |
| 92 kDefaultAnimationDurationForMenuMS); |
| 93 } |
| 94 return TimeDelta::FromInternalValue(duration); |
| 94 } | 95 } |
| 95 | 96 |
| 96 // Gets/sets the WindowVisibilityAnimationType associated with a window. | 97 // Gets/sets the WindowVisibilityAnimationType associated with a window. |
| 97 // TODO(beng): redundant/fold into method on public api? | 98 // TODO(beng): redundant/fold into method on public api? |
| 98 int GetWindowVisibilityAnimationType(aura::Window* window) { | 99 int GetWindowVisibilityAnimationType(aura::Window* window) { |
| 99 int type = window->GetProperty(kWindowVisibilityAnimationTypeKey); | 100 int type = window->GetProperty(kWindowVisibilityAnimationTypeKey); |
| 100 if (type == WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT) { | 101 if (type == WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT) { |
| 101 return (window->type() == ui::wm::WINDOW_TYPE_MENU || | 102 return (window->type() == ui::wm::WINDOW_TYPE_MENU || |
| 102 window->type() == ui::wm::WINDOW_TYPE_TOOLTIP) | 103 window->type() == ui::wm::WINDOW_TYPE_TOOLTIP) |
| 103 ? WINDOW_VISIBILITY_ANIMATION_TYPE_FADE | 104 ? WINDOW_VISIBILITY_ANIMATION_TYPE_FADE |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 | 248 |
| 248 AugmentWindowSize(window, end_transform); | 249 AugmentWindowSize(window, end_transform); |
| 249 | 250 |
| 250 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); | 251 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); |
| 251 window->layer()->SetTransform(start_transform); | 252 window->layer()->SetTransform(start_transform); |
| 252 window->layer()->SetVisible(true); | 253 window->layer()->SetVisible(true); |
| 253 | 254 |
| 254 { | 255 { |
| 255 // Property sets within this scope will be implicitly animated. | 256 // Property sets within this scope will be implicitly animated. |
| 256 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); | 257 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
| 257 base::TimeDelta duration = GetWindowShowAnimationDuration(window, | 258 base::TimeDelta duration = GetWindowVisibilityAnimationDuration(window); |
| 258 GetDefaultWindowVisibilityAnimationDuration(window)); | 259 if (duration.ToInternalValue() > 0) |
| 259 settings.SetTransitionDuration(duration); | 260 settings.SetTransitionDuration(duration); |
| 260 | 261 |
| 261 window->layer()->SetTransform(end_transform); | 262 window->layer()->SetTransform(end_transform); |
| 262 window->layer()->SetOpacity(kWindowAnimation_ShowOpacity); | 263 window->layer()->SetOpacity(kWindowAnimation_ShowOpacity); |
| 263 } | 264 } |
| 264 } | 265 } |
| 265 | 266 |
| 266 // Hides a window using an animation, animating its opacity from 1.f to 0.f, | 267 // Hides a window using an animation, animating its opacity from 1.f to 0.f, |
| 267 // its visibility to false, and its transform to |end_transform|. | 268 // its visibility to false, and its transform to |end_transform|. |
| 268 void AnimateHideWindowCommon(aura::Window* window, | 269 void AnimateHideWindowCommon(aura::Window* window, |
| 269 const gfx::Transform& end_transform) { | 270 const gfx::Transform& end_transform) { |
| 270 AugmentWindowSize(window, end_transform); | 271 AugmentWindowSize(window, end_transform); |
| 271 window->layer()->set_delegate(NULL); | 272 window->layer()->set_delegate(NULL); |
| 272 | 273 |
| 273 // Property sets within this scope will be implicitly animated. | 274 // Property sets within this scope will be implicitly animated. |
| 274 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); | 275 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
| 275 settings.AddObserver(CreateHidingWindowAnimationObserver(window)); | 276 settings.AddObserver(new HidingWindowAnimationObserver(window)); |
| 276 base::TimeDelta duration = GetWindowHideAnimationDuration(window, | 277 |
| 277 GetDefaultWindowVisibilityAnimationDuration(window)); | 278 base::TimeDelta duration = GetWindowVisibilityAnimationDuration(window); |
| 278 settings.SetTransitionDuration(duration); | 279 if (duration.ToInternalValue() > 0) |
| 280 settings.SetTransitionDuration(duration); |
| 279 | 281 |
| 280 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); | 282 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); |
| 281 window->layer()->SetTransform(end_transform); | 283 window->layer()->SetTransform(end_transform); |
| 282 window->layer()->SetVisible(false); | 284 window->layer()->SetVisible(false); |
| 283 } | 285 } |
| 284 | 286 |
| 285 static gfx::Transform GetScaleForWindow(aura::Window* window) { | 287 static gfx::Transform GetScaleForWindow(aura::Window* window) { |
| 286 gfx::Rect bounds = window->bounds(); | 288 gfx::Rect bounds = window->bounds(); |
| 287 gfx::Transform scale = gfx::GetScaleTransform( | 289 gfx::Transform scale = gfx::GetScaleTransform( |
| 288 gfx::Point(kWindowAnimation_TranslateFactor * bounds.width(), | 290 gfx::Point(kWindowAnimation_TranslateFactor * bounds.width(), |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 base::TimeDelta::FromMilliseconds( | 363 base::TimeDelta::FromMilliseconds( |
| 362 kWindowAnimation_Bounce_DurationMS * | 364 kWindowAnimation_Bounce_DurationMS * |
| 363 (100 - 2 * kWindowAnimation_Bounce_GrowShrinkDurationPercent) / | 365 (100 - 2 * kWindowAnimation_Bounce_GrowShrinkDurationPercent) / |
| 364 100))); | 366 100))); |
| 365 sequence->AddElement(CreateGrowShrinkElement(window, false)); | 367 sequence->AddElement(CreateGrowShrinkElement(window, false)); |
| 366 window->layer()->GetAnimator()->StartAnimation(sequence.release()); | 368 window->layer()->GetAnimator()->StartAnimation(sequence.release()); |
| 367 } | 369 } |
| 368 | 370 |
| 369 void AddLayerAnimationsForRotate(aura::Window* window, bool show) { | 371 void AddLayerAnimationsForRotate(aura::Window* window, bool show) { |
| 370 window->layer()->set_delegate(window); | 372 window->layer()->set_delegate(window); |
| 371 if (show) { | 373 if (show) |
| 372 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); | 374 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); |
| 373 window->layer()->SetVisible(true); | |
| 374 } | |
| 375 | 375 |
| 376 base::TimeDelta default_duration = base::TimeDelta::FromMilliseconds( | 376 base::TimeDelta duration = base::TimeDelta::FromMilliseconds( |
| 377 kWindowAnimation_Rotate_DurationMS); | 377 kWindowAnimation_Rotate_DurationMS); |
| 378 base::TimeDelta duration = show ? | |
| 379 GetWindowShowAnimationDuration(window, default_duration) : | |
| 380 GetWindowHideAnimationDuration(window, default_duration); | |
| 381 | |
| 382 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); | |
| 383 settings.SetTransitionDuration(duration); | |
| 384 | 378 |
| 385 if (!show) { | 379 if (!show) { |
| 386 settings.AddObserver(CreateHidingWindowAnimationObserver(window)); | 380 new HidingWindowAnimationObserver(window); |
| 387 window->layer()->GetAnimator()->SchedulePauseForProperties( | 381 window->layer()->GetAnimator()->SchedulePauseForProperties( |
| 388 duration * (100 - kWindowAnimation_Rotate_OpacityDurationPercent) / 100, | 382 duration * (100 - kWindowAnimation_Rotate_OpacityDurationPercent) / 100, |
| 389 ui::LayerAnimationElement::OPACITY); | 383 ui::LayerAnimationElement::OPACITY); |
| 390 window->layer()->SetVisible(false); | |
| 391 } | 384 } |
| 392 scoped_ptr<ui::LayerAnimationElement> opacity( | 385 scoped_ptr<ui::LayerAnimationElement> opacity( |
| 393 ui::LayerAnimationElement::CreateOpacityElement( | 386 ui::LayerAnimationElement::CreateOpacityElement( |
| 394 show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity, | 387 show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity, |
| 395 duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100)); | 388 duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100)); |
| 396 opacity->set_tween_type(gfx::Tween::EASE_IN_OUT); | 389 opacity->set_tween_type(gfx::Tween::EASE_IN_OUT); |
| 397 window->layer()->GetAnimator()->ScheduleAnimation( | 390 window->layer()->GetAnimator()->ScheduleAnimation( |
| 398 new ui::LayerAnimationSequence(opacity.release())); | 391 new ui::LayerAnimationSequence(opacity.release())); |
| 399 | 392 |
| 400 float xcenter = window->bounds().width() * 0.5; | 393 float xcenter = window->bounds().width() * 0.5; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 } | 515 } |
| 523 | 516 |
| 524 bool HasWindowVisibilityAnimationTransition( | 517 bool HasWindowVisibilityAnimationTransition( |
| 525 aura::Window* window, | 518 aura::Window* window, |
| 526 WindowVisibilityAnimationTransition transition) { | 519 WindowVisibilityAnimationTransition transition) { |
| 527 WindowVisibilityAnimationTransition prop = window->GetProperty( | 520 WindowVisibilityAnimationTransition prop = window->GetProperty( |
| 528 kWindowVisibilityAnimationTransitionKey); | 521 kWindowVisibilityAnimationTransitionKey); |
| 529 return (prop & transition) != 0; | 522 return (prop & transition) != 0; |
| 530 } | 523 } |
| 531 | 524 |
| 532 void SetWindowShowAnimationDuration(aura::Window* window, | 525 void SetWindowVisibilityAnimationDuration(aura::Window* window, |
| 533 const base::TimeDelta& duration) { | 526 const TimeDelta& duration) { |
| 534 window->SetProperty(kWindowShowAnimationDurationKey, | 527 window->SetProperty(kWindowVisibilityAnimationDurationKey, |
| 535 static_cast<int>(duration.ToInternalValue())); | 528 static_cast<int>(duration.ToInternalValue())); |
| 536 } | 529 } |
| 537 | 530 |
| 538 void SetWindowHideAnimationDuration(aura::Window* window, | |
| 539 const base::TimeDelta& duration) { | |
| 540 window->SetProperty(kWindowHideAnimationDurationKey, | |
| 541 static_cast<int>(duration.ToInternalValue())); | |
| 542 } | |
| 543 | |
| 544 base::TimeDelta GetWindowShowAnimationDuration( | |
| 545 aura::Window* window, | |
| 546 const base::TimeDelta& default_duration) { | |
| 547 int duration = window->GetProperty(kWindowShowAnimationDurationKey); | |
| 548 return (duration == 0) ? | |
| 549 default_duration : base::TimeDelta::FromInternalValue(duration); | |
| 550 } | |
| 551 | |
| 552 base::TimeDelta GetWindowHideAnimationDuration( | |
| 553 aura::Window* window, | |
| 554 const base::TimeDelta& default_duration) { | |
| 555 int duration = window->GetProperty(kWindowHideAnimationDurationKey); | |
| 556 return (duration == 0) ? | |
| 557 default_duration : base::TimeDelta::FromInternalValue(duration); | |
| 558 } | |
| 559 | |
| 560 void SetWindowVisibilityAnimationVerticalPosition(aura::Window* window, | 531 void SetWindowVisibilityAnimationVerticalPosition(aura::Window* window, |
| 561 float position) { | 532 float position) { |
| 562 window->SetProperty(kWindowVisibilityAnimationVerticalPositionKey, position); | 533 window->SetProperty(kWindowVisibilityAnimationVerticalPositionKey, position); |
| 563 } | 534 } |
| 564 | 535 |
| 565 ui::ImplicitAnimationObserver* CreateHidingWindowAnimationObserver( | 536 ui::ImplicitAnimationObserver* CreateHidingWindowAnimationObserver( |
| 566 aura::Window* window) { | 537 aura::Window* window) { |
| 567 return new HidingWindowAnimationObserver(window); | 538 return new HidingWindowAnimationObserver(window); |
| 568 } | 539 } |
| 569 | 540 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 590 | 561 |
| 591 bool WindowAnimationsDisabled(aura::Window* window) { | 562 bool WindowAnimationsDisabled(aura::Window* window) { |
| 592 return (window && | 563 return (window && |
| 593 window->GetProperty(aura::client::kAnimationsDisabledKey)) || | 564 window->GetProperty(aura::client::kAnimationsDisabledKey)) || |
| 594 CommandLine::ForCurrentProcess()->HasSwitch( | 565 CommandLine::ForCurrentProcess()->HasSwitch( |
| 595 switches::kWindowAnimationsDisabled); | 566 switches::kWindowAnimationsDisabled); |
| 596 } | 567 } |
| 597 | 568 |
| 598 } // namespace corewm | 569 } // namespace corewm |
| 599 } // namespace views | 570 } // namespace views |
| OLD | NEW |