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

Unified Diff: ui/wm/core/window_animations.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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
« no previous file with comments | « ui/wm/core/window_animations.h ('k') | ui/wm/core/window_animations_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/wm/core/window_animations.cc
diff --git a/ui/wm/core/window_animations.cc b/ui/wm/core/window_animations.cc
deleted file mode 100644
index fa5e6daedf6eb6c8441b6302580e5221b5a5e40b..0000000000000000000000000000000000000000
--- a/ui/wm/core/window_animations.cc
+++ /dev/null
@@ -1,672 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/wm/core/window_animations.h"
-
-#include <math.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/stl_util.h"
-#include "base/time/time.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_delegate.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_property.h"
-#include "ui/compositor/compositor_observer.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_animation_observer.h"
-#include "ui/compositor/layer_animation_sequence.h"
-#include "ui/compositor/layer_animator.h"
-#include "ui/compositor/layer_tree_owner.h"
-#include "ui/compositor/scoped_animation_duration_scale_mode.h"
-#include "ui/compositor/scoped_layer_animation_settings.h"
-#include "ui/gfx/animation/animation.h"
-#include "ui/gfx/interpolated_transform.h"
-#include "ui/gfx/rect_conversions.h"
-#include "ui/gfx/screen.h"
-#include "ui/gfx/vector2d.h"
-#include "ui/gfx/vector3d_f.h"
-#include "ui/wm/core/window_util.h"
-#include "ui/wm/core/wm_core_switches.h"
-#include "ui/wm/public/animation_host.h"
-
-DECLARE_WINDOW_PROPERTY_TYPE(int)
-DECLARE_WINDOW_PROPERTY_TYPE(wm::WindowVisibilityAnimationType)
-DECLARE_WINDOW_PROPERTY_TYPE(wm::WindowVisibilityAnimationTransition)
-DECLARE_WINDOW_PROPERTY_TYPE(float)
-DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(WM_EXPORT, bool)
-
-namespace wm {
-namespace {
-const float kWindowAnimation_Vertical_TranslateY = 15.f;
-
-// A base class for hiding animation observer which has two roles:
-// 1) Notifies AnimationHost at the end of hiding animation.
-// 2) Detaches the window's layers for hiding animation and deletes
-// them upon completion of the animation. This is necessary to a)
-// ensure that the animation continues in the event of the window being
-// deleted, and b) to ensure that the animation is visible even if the
-// window gets restacked below other windows when focus or activation
-// changes.
-// The subclass will determine when the animation is completed.
-class HidingWindowAnimationObserverBase : public aura::WindowObserver {
- public:
- explicit HidingWindowAnimationObserverBase(aura::Window* window)
- : window_(window) {
- window_->AddObserver(this);
- }
- virtual ~HidingWindowAnimationObserverBase() {
- if (window_)
- window_->RemoveObserver(this);
- }
-
- // aura::WindowObserver:
- virtual void OnWindowDestroying(aura::Window* window) override {
- DCHECK_EQ(window, window_);
- WindowInvalid();
- }
-
- virtual void OnWindowDestroyed(aura::Window* window) override {
- DCHECK_EQ(window, window_);
- WindowInvalid();
- }
-
- // Detach the current layers and create new layers for |window_|.
- // Stack the original layers above |window_| and its transient
- // children. If the window has transient children, the original
- // layers will be moved above the top most transient child so that
- // activation change does not put the window above the animating
- // layer.
- void DetachAndRecreateLayers() {
- layer_owner_ = RecreateLayers(window_);
- if (window_->parent()) {
- const aura::Window::Windows& transient_children =
- GetTransientChildren(window_);
- aura::Window::Windows::const_iterator iter =
- std::find(window_->parent()->children().begin(),
- window_->parent()->children().end(),
- window_);
- DCHECK(iter != window_->parent()->children().end());
- aura::Window* topmost_transient_child = NULL;
- for (++iter; iter != window_->parent()->children().end(); ++iter) {
- if (std::find(transient_children.begin(),
- transient_children.end(),
- *iter) != transient_children.end()) {
- topmost_transient_child = *iter;
- }
- }
- if (topmost_transient_child) {
- window_->parent()->layer()->StackAbove(
- layer_owner_->root(), topmost_transient_child->layer());
- }
- }
- }
-
- protected:
- // Invoked when the hiding animation is completed. It will delete
- // 'this', and no operation should be made on this object after this
- // point.
- void OnAnimationCompleted() {
- // Window may have been destroyed by this point.
- if (window_) {
- aura::client::AnimationHost* animation_host =
- aura::client::GetAnimationHost(window_);
- if (animation_host)
- animation_host->OnWindowHidingAnimationCompleted();
- window_->RemoveObserver(this);
- }
- delete this;
- }
-
- private:
- // Invoked when the window is destroyed (or destroying).
- void WindowInvalid() {
- layer_owner_->root()->SuppressPaint();
-
- window_->RemoveObserver(this);
- window_ = NULL;
- }
-
- aura::Window* window_;
-
- // The owner of detached layers.
- scoped_ptr<ui::LayerTreeOwner> layer_owner_;
-
- DISALLOW_COPY_AND_ASSIGN(HidingWindowAnimationObserverBase);
-};
-
-} // namespace
-
-DEFINE_WINDOW_PROPERTY_KEY(int,
- kWindowVisibilityAnimationTypeKey,
- WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT);
-DEFINE_WINDOW_PROPERTY_KEY(int, kWindowVisibilityAnimationDurationKey, 0);
-DEFINE_WINDOW_PROPERTY_KEY(WindowVisibilityAnimationTransition,
- kWindowVisibilityAnimationTransitionKey,
- ANIMATE_BOTH);
-DEFINE_WINDOW_PROPERTY_KEY(float,
- kWindowVisibilityAnimationVerticalPositionKey,
- kWindowAnimation_Vertical_TranslateY);
-
-// A HidingWindowAnimationObserver that deletes observer and detached
-// layers upon the completion of the implicit animation.
-class ImplicitHidingWindowAnimationObserver
- : public HidingWindowAnimationObserverBase,
- public ui::ImplicitAnimationObserver {
- public:
- ImplicitHidingWindowAnimationObserver(
- aura::Window* window,
- ui::ScopedLayerAnimationSettings* settings);
- virtual ~ImplicitHidingWindowAnimationObserver() {}
-
- // ui::ImplicitAnimationObserver:
- virtual void OnImplicitAnimationsCompleted() override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ImplicitHidingWindowAnimationObserver);
-};
-
-namespace {
-
-const int kDefaultAnimationDurationForMenuMS = 150;
-
-const float kWindowAnimation_HideOpacity = 0.f;
-const float kWindowAnimation_ShowOpacity = 1.f;
-const float kWindowAnimation_TranslateFactor = 0.5f;
-const float kWindowAnimation_ScaleFactor = .95f;
-
-const int kWindowAnimation_Rotate_DurationMS = 180;
-const int kWindowAnimation_Rotate_OpacityDurationPercent = 90;
-const float kWindowAnimation_Rotate_TranslateY = -20.f;
-const float kWindowAnimation_Rotate_PerspectiveDepth = 500.f;
-const float kWindowAnimation_Rotate_DegreesX = 5.f;
-const float kWindowAnimation_Rotate_ScaleFactor = .99f;
-
-const float kWindowAnimation_Bounce_Scale = 1.02f;
-const int kWindowAnimation_Bounce_DurationMS = 180;
-const int kWindowAnimation_Bounce_GrowShrinkDurationPercent = 40;
-
-base::TimeDelta GetWindowVisibilityAnimationDuration(
- const aura::Window& window) {
- int duration =
- window.GetProperty(kWindowVisibilityAnimationDurationKey);
- if (duration == 0 && window.type() == ui::wm::WINDOW_TYPE_MENU) {
- return base::TimeDelta::FromMilliseconds(
- kDefaultAnimationDurationForMenuMS);
- }
- return base::TimeDelta::FromInternalValue(duration);
-}
-
-// Gets/sets the WindowVisibilityAnimationType associated with a window.
-// TODO(beng): redundant/fold into method on public api?
-int GetWindowVisibilityAnimationType(aura::Window* window) {
- int type = window->GetProperty(kWindowVisibilityAnimationTypeKey);
- if (type == WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT) {
- return (window->type() == ui::wm::WINDOW_TYPE_MENU ||
- window->type() == ui::wm::WINDOW_TYPE_TOOLTIP)
- ? WINDOW_VISIBILITY_ANIMATION_TYPE_FADE
- : WINDOW_VISIBILITY_ANIMATION_TYPE_DROP;
- }
- return type;
-}
-
-void GetTransformRelativeToRoot(ui::Layer* layer, gfx::Transform* transform) {
- const ui::Layer* root = layer;
- while (root->parent())
- root = root->parent();
- layer->GetTargetTransformRelativeTo(root, transform);
-}
-
-gfx::Rect GetLayerWorldBoundsAfterTransform(ui::Layer* layer,
- const gfx::Transform& transform) {
- gfx::Transform in_world = transform;
- GetTransformRelativeToRoot(layer, &in_world);
-
- gfx::RectF transformed = layer->bounds();
- in_world.TransformRect(&transformed);
-
- return gfx::ToEnclosingRect(transformed);
-}
-
-// Augment the host window so that the enclosing bounds of the full
-// animation will fit inside of it.
-void AugmentWindowSize(aura::Window* window,
- const gfx::Transform& end_transform) {
- aura::client::AnimationHost* animation_host =
- aura::client::GetAnimationHost(window);
- if (!animation_host)
- return;
-
- const gfx::Rect& world_at_start = window->bounds();
- gfx::Rect world_at_end =
- GetLayerWorldBoundsAfterTransform(window->layer(), end_transform);
- gfx::Rect union_in_window_space =
- gfx::UnionRects(world_at_start, world_at_end);
-
- // Calculate the top left and bottom right deltas to be added to the window
- // bounds.
- gfx::Vector2d top_left_delta(world_at_start.x() - union_in_window_space.x(),
- world_at_start.y() - union_in_window_space.y());
-
- gfx::Vector2d bottom_right_delta(
- union_in_window_space.x() + union_in_window_space.width() -
- (world_at_start.x() + world_at_start.width()),
- union_in_window_space.y() + union_in_window_space.height() -
- (world_at_start.y() + world_at_start.height()));
-
- DCHECK(top_left_delta.x() >= 0 && top_left_delta.y() >= 0 &&
- bottom_right_delta.x() >= 0 && bottom_right_delta.y() >= 0);
-
- animation_host->SetHostTransitionOffsets(top_left_delta, bottom_right_delta);
-}
-
-// Shows a window using an animation, animating its opacity from 0.f to 1.f,
-// its visibility to true, and its transform from |start_transform| to
-// |end_transform|.
-void AnimateShowWindowCommon(aura::Window* window,
- const gfx::Transform& start_transform,
- const gfx::Transform& end_transform) {
- AugmentWindowSize(window, end_transform);
-
- window->layer()->SetOpacity(kWindowAnimation_HideOpacity);
- window->layer()->SetTransform(start_transform);
- window->layer()->SetVisible(true);
-
- {
- // Property sets within this scope will be implicitly animated.
- ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
- base::TimeDelta duration = GetWindowVisibilityAnimationDuration(*window);
- if (duration.ToInternalValue() > 0)
- settings.SetTransitionDuration(duration);
-
- window->layer()->SetTransform(end_transform);
- window->layer()->SetOpacity(kWindowAnimation_ShowOpacity);
- }
-}
-
-// Hides a window using an animation, animating its opacity from 1.f to 0.f,
-// its visibility to false, and its transform to |end_transform|.
-void AnimateHideWindowCommon(aura::Window* window,
- const gfx::Transform& end_transform) {
- AugmentWindowSize(window, end_transform);
-
- // Property sets within this scope will be implicitly animated.
- ScopedHidingAnimationSettings hiding_settings(window);
- base::TimeDelta duration = GetWindowVisibilityAnimationDuration(*window);
- if (duration.ToInternalValue() > 0)
- hiding_settings.layer_animation_settings()->SetTransitionDuration(duration);
-
- window->layer()->SetOpacity(kWindowAnimation_HideOpacity);
- window->layer()->SetTransform(end_transform);
- window->layer()->SetVisible(false);
-}
-
-static gfx::Transform GetScaleForWindow(aura::Window* window) {
- gfx::Rect bounds = window->bounds();
- gfx::Transform scale = gfx::GetScaleTransform(
- gfx::Point(kWindowAnimation_TranslateFactor * bounds.width(),
- kWindowAnimation_TranslateFactor * bounds.height()),
- kWindowAnimation_ScaleFactor);
- return scale;
-}
-
-// Show/Hide windows using a shrink animation.
-void AnimateShowWindow_Drop(aura::Window* window) {
- AnimateShowWindowCommon(window, GetScaleForWindow(window), gfx::Transform());
-}
-
-void AnimateHideWindow_Drop(aura::Window* window) {
- AnimateHideWindowCommon(window, GetScaleForWindow(window));
-}
-
-// Show/Hide windows using a vertical Glenimation.
-void AnimateShowWindow_Vertical(aura::Window* window) {
- gfx::Transform transform;
- transform.Translate(0, window->GetProperty(
- kWindowVisibilityAnimationVerticalPositionKey));
- AnimateShowWindowCommon(window, transform, gfx::Transform());
-}
-
-void AnimateHideWindow_Vertical(aura::Window* window) {
- gfx::Transform transform;
- transform.Translate(0, window->GetProperty(
- kWindowVisibilityAnimationVerticalPositionKey));
- AnimateHideWindowCommon(window, transform);
-}
-
-// Show/Hide windows using a fade.
-void AnimateShowWindow_Fade(aura::Window* window) {
- AnimateShowWindowCommon(window, gfx::Transform(), gfx::Transform());
-}
-
-void AnimateHideWindow_Fade(aura::Window* window) {
- AnimateHideWindowCommon(window, gfx::Transform());
-}
-
-ui::LayerAnimationElement* CreateGrowShrinkElement(
- aura::Window* window, bool grow) {
- scoped_ptr<ui::InterpolatedTransform> scale(new ui::InterpolatedScale(
- gfx::Point3F(kWindowAnimation_Bounce_Scale,
- kWindowAnimation_Bounce_Scale,
- 1),
- gfx::Point3F(1, 1, 1)));
- scoped_ptr<ui::InterpolatedTransform> scale_about_pivot(
- new ui::InterpolatedTransformAboutPivot(
- gfx::Point(window->bounds().width() * 0.5,
- window->bounds().height() * 0.5),
- scale.release()));
- scale_about_pivot->SetReversed(grow);
- scoped_ptr<ui::LayerAnimationElement> transition(
- ui::LayerAnimationElement::CreateInterpolatedTransformElement(
- scale_about_pivot.release(),
- base::TimeDelta::FromMilliseconds(
- kWindowAnimation_Bounce_DurationMS *
- kWindowAnimation_Bounce_GrowShrinkDurationPercent / 100)));
- transition->set_tween_type(grow ? gfx::Tween::EASE_OUT : gfx::Tween::EASE_IN);
- return transition.release();
-}
-
-void AnimateBounce(aura::Window* window) {
- ui::ScopedLayerAnimationSettings scoped_settings(
- window->layer()->GetAnimator());
- scoped_settings.SetPreemptionStrategy(
- ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
- scoped_ptr<ui::LayerAnimationSequence> sequence(
- new ui::LayerAnimationSequence);
- sequence->AddElement(CreateGrowShrinkElement(window, true));
- sequence->AddElement(ui::LayerAnimationElement::CreatePauseElement(
- ui::LayerAnimationElement::BOUNDS,
- base::TimeDelta::FromMilliseconds(
- kWindowAnimation_Bounce_DurationMS *
- (100 - 2 * kWindowAnimation_Bounce_GrowShrinkDurationPercent) /
- 100)));
- sequence->AddElement(CreateGrowShrinkElement(window, false));
- window->layer()->GetAnimator()->StartAnimation(sequence.release());
-}
-
-// A HidingWindowAnimationObserver that deletes observer and detached
-// layers when the last_sequence has been completed or aborted.
-class RotateHidingWindowAnimationObserver
- : public HidingWindowAnimationObserverBase,
- public ui::LayerAnimationObserver {
- public:
- explicit RotateHidingWindowAnimationObserver(aura::Window* window)
- : HidingWindowAnimationObserverBase(window) {}
- virtual ~RotateHidingWindowAnimationObserver() {}
-
- // Destroys itself after |last_sequence| ends or is aborted. Does not take
- // ownership of |last_sequence|, which should not be NULL.
- void SetLastSequence(ui::LayerAnimationSequence* last_sequence) {
- last_sequence->AddObserver(this);
- }
-
- // ui::LayerAnimationObserver:
- virtual void OnLayerAnimationEnded(
- ui::LayerAnimationSequence* sequence) override {
- OnAnimationCompleted();
- }
- virtual void OnLayerAnimationAborted(
- ui::LayerAnimationSequence* sequence) override {
- OnAnimationCompleted();
- }
- virtual void OnLayerAnimationScheduled(
- ui::LayerAnimationSequence* sequence) override {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(RotateHidingWindowAnimationObserver);
-};
-
-void AddLayerAnimationsForRotate(aura::Window* window, bool show) {
- if (show)
- window->layer()->SetOpacity(kWindowAnimation_HideOpacity);
-
- base::TimeDelta duration = base::TimeDelta::FromMilliseconds(
- kWindowAnimation_Rotate_DurationMS);
-
- RotateHidingWindowAnimationObserver* observer = NULL;
-
- if (!show) {
- observer = new RotateHidingWindowAnimationObserver(window);
- window->layer()->GetAnimator()->SchedulePauseForProperties(
- duration * (100 - kWindowAnimation_Rotate_OpacityDurationPercent) / 100,
- ui::LayerAnimationElement::OPACITY);
- }
- scoped_ptr<ui::LayerAnimationElement> opacity(
- ui::LayerAnimationElement::CreateOpacityElement(
- show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity,
- duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100));
- opacity->set_tween_type(gfx::Tween::EASE_IN_OUT);
- window->layer()->GetAnimator()->ScheduleAnimation(
- new ui::LayerAnimationSequence(opacity.release()));
-
- float xcenter = window->bounds().width() * 0.5;
-
- gfx::Transform transform;
- transform.Translate(xcenter, 0);
- transform.ApplyPerspectiveDepth(kWindowAnimation_Rotate_PerspectiveDepth);
- transform.Translate(-xcenter, 0);
- scoped_ptr<ui::InterpolatedTransform> perspective(
- new ui::InterpolatedConstantTransform(transform));
-
- scoped_ptr<ui::InterpolatedTransform> scale(
- new ui::InterpolatedScale(1, kWindowAnimation_Rotate_ScaleFactor));
- scoped_ptr<ui::InterpolatedTransform> scale_about_pivot(
- new ui::InterpolatedTransformAboutPivot(
- gfx::Point(xcenter, kWindowAnimation_Rotate_TranslateY),
- scale.release()));
-
- scoped_ptr<ui::InterpolatedTransform> translation(
- new ui::InterpolatedTranslation(gfx::Point(), gfx::Point(
- 0, kWindowAnimation_Rotate_TranslateY)));
-
- scoped_ptr<ui::InterpolatedTransform> rotation(
- new ui::InterpolatedAxisAngleRotation(
- gfx::Vector3dF(1, 0, 0), 0, kWindowAnimation_Rotate_DegreesX));
-
- scale_about_pivot->SetChild(perspective.release());
- translation->SetChild(scale_about_pivot.release());
- rotation->SetChild(translation.release());
- rotation->SetReversed(show);
-
- scoped_ptr<ui::LayerAnimationElement> transition(
- ui::LayerAnimationElement::CreateInterpolatedTransformElement(
- rotation.release(), duration));
- ui::LayerAnimationSequence* last_sequence =
- new ui::LayerAnimationSequence(transition.release());
- window->layer()->GetAnimator()->ScheduleAnimation(last_sequence);
-
- if (observer) {
- observer->SetLastSequence(last_sequence);
- observer->DetachAndRecreateLayers();
- }
-}
-
-void AnimateShowWindow_Rotate(aura::Window* window) {
- AddLayerAnimationsForRotate(window, true);
-}
-
-void AnimateHideWindow_Rotate(aura::Window* window) {
- AddLayerAnimationsForRotate(window, false);
-}
-
-bool AnimateShowWindow(aura::Window* window) {
- if (!HasWindowVisibilityAnimationTransition(window, ANIMATE_SHOW)) {
- if (HasWindowVisibilityAnimationTransition(window, ANIMATE_HIDE)) {
- // Since hide animation may have changed opacity and transform,
- // reset them to show the window.
- window->layer()->SetOpacity(kWindowAnimation_ShowOpacity);
- window->layer()->SetTransform(gfx::Transform());
- }
- return false;
- }
-
- switch (GetWindowVisibilityAnimationType(window)) {
- case WINDOW_VISIBILITY_ANIMATION_TYPE_DROP:
- AnimateShowWindow_Drop(window);
- return true;
- case WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL:
- AnimateShowWindow_Vertical(window);
- return true;
- case WINDOW_VISIBILITY_ANIMATION_TYPE_FADE:
- AnimateShowWindow_Fade(window);
- return true;
- case WINDOW_VISIBILITY_ANIMATION_TYPE_ROTATE:
- AnimateShowWindow_Rotate(window);
- return true;
- default:
- return false;
- }
-}
-
-bool AnimateHideWindow(aura::Window* window) {
- if (!HasWindowVisibilityAnimationTransition(window, ANIMATE_HIDE)) {
- if (HasWindowVisibilityAnimationTransition(window, ANIMATE_SHOW)) {
- // Since show animation may have changed opacity and transform,
- // reset them, though the change should be hidden.
- window->layer()->SetOpacity(kWindowAnimation_HideOpacity);
- window->layer()->SetTransform(gfx::Transform());
- }
- return false;
- }
-
- switch (GetWindowVisibilityAnimationType(window)) {
- case WINDOW_VISIBILITY_ANIMATION_TYPE_DROP:
- AnimateHideWindow_Drop(window);
- return true;
- case WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL:
- AnimateHideWindow_Vertical(window);
- return true;
- case WINDOW_VISIBILITY_ANIMATION_TYPE_FADE:
- AnimateHideWindow_Fade(window);
- return true;
- case WINDOW_VISIBILITY_ANIMATION_TYPE_ROTATE:
- AnimateHideWindow_Rotate(window);
- return true;
- default:
- return false;
- }
-}
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// ImplicitHidingWindowAnimationObserver
-
-ImplicitHidingWindowAnimationObserver::ImplicitHidingWindowAnimationObserver(
- aura::Window* window,
- ui::ScopedLayerAnimationSettings* settings)
- : HidingWindowAnimationObserverBase(window) {
- settings->AddObserver(this);
-}
-
-void ImplicitHidingWindowAnimationObserver::OnImplicitAnimationsCompleted() {
- OnAnimationCompleted();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ScopedHidingAnimationSettings
-
-ScopedHidingAnimationSettings::ScopedHidingAnimationSettings(
- aura::Window* window)
- : layer_animation_settings_(window->layer()->GetAnimator()),
- observer_(new ImplicitHidingWindowAnimationObserver(
- window,
- &layer_animation_settings_)) {
-}
-
-ScopedHidingAnimationSettings::~ScopedHidingAnimationSettings() {
- observer_->DetachAndRecreateLayers();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// External interface
-
-void SetWindowVisibilityAnimationType(aura::Window* window, int type) {
- window->SetProperty(kWindowVisibilityAnimationTypeKey, type);
-}
-
-int GetWindowVisibilityAnimationType(aura::Window* window) {
- return window->GetProperty(kWindowVisibilityAnimationTypeKey);
-}
-
-void SetWindowVisibilityAnimationTransition(
- aura::Window* window,
- WindowVisibilityAnimationTransition transition) {
- window->SetProperty(kWindowVisibilityAnimationTransitionKey, transition);
-}
-
-bool HasWindowVisibilityAnimationTransition(
- aura::Window* window,
- WindowVisibilityAnimationTransition transition) {
- WindowVisibilityAnimationTransition prop = window->GetProperty(
- kWindowVisibilityAnimationTransitionKey);
- return (prop & transition) != 0;
-}
-
-void SetWindowVisibilityAnimationDuration(aura::Window* window,
- const base::TimeDelta& duration) {
- window->SetProperty(kWindowVisibilityAnimationDurationKey,
- static_cast<int>(duration.ToInternalValue()));
-}
-
-base::TimeDelta GetWindowVisibilityAnimationDuration(
- const aura::Window& window) {
- return base::TimeDelta::FromInternalValue(
- window.GetProperty(kWindowVisibilityAnimationDurationKey));
-}
-
-void SetWindowVisibilityAnimationVerticalPosition(aura::Window* window,
- float position) {
- window->SetProperty(kWindowVisibilityAnimationVerticalPositionKey, position);
-}
-
-bool AnimateOnChildWindowVisibilityChanged(aura::Window* window, bool visible) {
- if (WindowAnimationsDisabled(window))
- return false;
- if (visible)
- return AnimateShowWindow(window);
- // Don't start hiding the window again if it's already being hidden.
- return window->layer()->GetTargetOpacity() != 0.0f &&
- AnimateHideWindow(window);
-}
-
-bool AnimateWindow(aura::Window* window, WindowAnimationType type) {
- switch (type) {
- case WINDOW_ANIMATION_TYPE_BOUNCE:
- AnimateBounce(window);
- return true;
- default:
- NOTREACHED();
- return false;
- }
-}
-
-bool WindowAnimationsDisabled(aura::Window* window) {
- // Individual windows can choose to skip animations.
- if (window && window->GetProperty(aura::client::kAnimationsDisabledKey))
- return true;
-
- // Animations can be disabled globally for testing.
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kWindowAnimationsDisabled))
- return true;
-
- // Tests of animations themselves should still run even if the machine is
- // being accessed via Remote Desktop.
- if (ui::ScopedAnimationDurationScaleMode::duration_scale_mode() ==
- ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION)
- return false;
-
- // Let the user decide whether or not to play the animation.
- return !gfx::Animation::ShouldRenderRichAnimation();
-}
-
-} // namespace wm
« no previous file with comments | « ui/wm/core/window_animations.h ('k') | ui/wm/core/window_animations_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698