diff options
Diffstat (limited to 'chromium/ash/desktop_background/desktop_background_widget_controller.cc')
-rw-r--r-- | chromium/ash/desktop_background/desktop_background_widget_controller.cc | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/chromium/ash/desktop_background/desktop_background_widget_controller.cc b/chromium/ash/desktop_background/desktop_background_widget_controller.cc new file mode 100644 index 00000000000..8d0aa673818 --- /dev/null +++ b/chromium/ash/desktop_background/desktop_background_widget_controller.cc @@ -0,0 +1,148 @@ +// 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 "ash/desktop_background/desktop_background_widget_controller.h" + +#include "ash/ash_export.h" +#include "ash/desktop_background/user_wallpaper_delegate.h" +#include "ash/root_window_controller.h" +#include "ash/shell.h" +#include "ui/aura/root_window.h" +#include "ui/compositor/layer_animation_observer.h" +#include "ui/compositor/scoped_layer_animation_settings.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_observer.h" + +namespace ash { +namespace internal { +namespace { + +class ShowWallpaperAnimationObserver : public ui::ImplicitAnimationObserver, + public views::WidgetObserver { + public: + ShowWallpaperAnimationObserver(RootWindowController* root_window_controller, + views::Widget* desktop_widget, + bool is_initial_animation) + : root_window_controller_(root_window_controller), + desktop_widget_(desktop_widget), + is_initial_animation_(is_initial_animation) { + DCHECK(desktop_widget_); + desktop_widget_->AddObserver(this); + } + + virtual ~ShowWallpaperAnimationObserver() { + StopObservingImplicitAnimations(); + if (desktop_widget_) + desktop_widget_->RemoveObserver(this); + } + + private: + // Overridden from ui::ImplicitAnimationObserver: + virtual void OnImplicitAnimationsScheduled() OVERRIDE { + if (is_initial_animation_) { + root_window_controller_-> + HandleInitialDesktopBackgroundAnimationStarted(); + } + } + + virtual void OnImplicitAnimationsCompleted() OVERRIDE { + root_window_controller_->OnWallpaperAnimationFinished(desktop_widget_); + delete this; + } + + // Overridden from views::WidgetObserver. + virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE { + delete this; + } + + RootWindowController* root_window_controller_; + views::Widget* desktop_widget_; + + // Is this object observing the initial brightness/grayscale animation? + const bool is_initial_animation_; + + DISALLOW_COPY_AND_ASSIGN(ShowWallpaperAnimationObserver); +}; + +} // namespace + +DesktopBackgroundWidgetController::DesktopBackgroundWidgetController( + views::Widget* widget) : widget_(widget) { + DCHECK(widget_); + widget_->AddObserver(this); +} + +DesktopBackgroundWidgetController::~DesktopBackgroundWidgetController() { + if (widget_) { + widget_->RemoveObserver(this); + widget_->CloseNow(); + widget_ = NULL; + } +} + +void DesktopBackgroundWidgetController::OnWidgetDestroying( + views::Widget* widget) { + widget_->RemoveObserver(this); + widget_ = NULL; +} + +void DesktopBackgroundWidgetController::SetBounds(gfx::Rect bounds) { + if (widget_) + widget_->SetBounds(bounds); +} + +bool DesktopBackgroundWidgetController::Reparent(aura::Window* root_window, + int src_container, + int dest_container) { + if (widget_) { + views::Widget::ReparentNativeView(widget_->GetNativeView(), + root_window->GetChildById(dest_container)); + return true; + } + // Nothing to reparent. + return false; +} + +void DesktopBackgroundWidgetController::StartAnimating( + RootWindowController* root_window_controller) { + if (widget_) { + ui::ScopedLayerAnimationSettings settings( + widget_->GetNativeView()->layer()->GetAnimator()); + settings.AddObserver(new ShowWallpaperAnimationObserver( + root_window_controller, widget_, + Shell::GetInstance()->user_wallpaper_delegate()-> + ShouldShowInitialAnimation())); + // When |widget_| shows, AnimateShowWindowCommon() is called to do the + // animation. Sets transition duration to 0 to avoid animating to the + // show animation's initial values. + settings.SetTransitionDuration(base::TimeDelta()); + widget_->Show(); + widget_->GetNativeView()->SetName("DesktopBackgroundView"); + } +} + +AnimatingDesktopController::AnimatingDesktopController( + DesktopBackgroundWidgetController* component) { + controller_.reset(component); +} + +AnimatingDesktopController::~AnimatingDesktopController() { +} + +void AnimatingDesktopController::StopAnimating() { + if (controller_) { + ui::Layer* layer = controller_->widget()->GetNativeView()->layer(); + layer->GetAnimator()->StopAnimating(); + } +} + +DesktopBackgroundWidgetController* AnimatingDesktopController::GetController( + bool pass_ownership) { + if (pass_ownership) + return controller_.release(); + return controller_.get(); +} + +} // namespace internal +} // namespace ash |