summaryrefslogtreecommitdiff
path: root/chromium/ash/desktop_background/desktop_background_widget_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/desktop_background/desktop_background_widget_controller.cc')
-rw-r--r--chromium/ash/desktop_background/desktop_background_widget_controller.cc148
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