| // Copyright 2015 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/wm/dim_window.h" |
| #include "base/time/time.h" |
| #include "ui/aura/client/aura_constants.h" |
| #include "ui/aura/window_property.h" |
| #include "ui/compositor/layer.h" |
| #include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/wm/core/visibility_controller.h" |
| #include "ui/wm/core/window_animations.h" |
| |
| DECLARE_WINDOW_PROPERTY_TYPE(ash::DimWindow*); |
| |
| namespace ash { |
| namespace { |
| |
| DEFINE_LOCAL_WINDOW_PROPERTY_KEY(DimWindow*, kDimWindowKey, nullptr); |
| |
| const int kDefaultDimAnimationDurationMs = 200; |
| |
| const float kDefaultDimOpacity = 0.5f; |
| |
| } // namespace |
| |
| // static |
| DimWindow* DimWindow::Get(aura::Window* container) { |
| return container->GetProperty(kDimWindowKey); |
| } |
| |
| DimWindow::DimWindow(aura::Window* parent) |
| : aura::Window(nullptr), parent_(parent) { |
| SetType(ui::wm::WINDOW_TYPE_NORMAL); |
| Init(ui::LAYER_SOLID_COLOR); |
| wm::SetWindowVisibilityChangesAnimated(this); |
| wm::SetWindowVisibilityAnimationType( |
| this, wm::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); |
| wm::SetWindowVisibilityAnimationDuration( |
| this, base::TimeDelta::FromMilliseconds(kDefaultDimAnimationDurationMs)); |
| |
| SetDimOpacity(kDefaultDimOpacity); |
| |
| parent->AddChild(this); |
| parent->AddObserver(this); |
| parent->SetProperty(kDimWindowKey, this); |
| parent->StackChildAtTop(this); |
| |
| SetBounds(parent->bounds()); |
| } |
| |
| DimWindow::~DimWindow() { |
| if (parent_) { |
| parent_->ClearProperty(kDimWindowKey); |
| parent_->RemoveObserver(this); |
| parent_ = nullptr; |
| } |
| } |
| |
| void DimWindow::SetDimOpacity(float target_opacity) { |
| layer()->SetColor(SkColorSetA(SK_ColorBLACK, 255 * target_opacity)); |
| } |
| |
| void DimWindow::OnWindowBoundsChanged(aura::Window* window, |
| const gfx::Rect& old_bounds, |
| const gfx::Rect& new_bounds) { |
| if (window == parent_) |
| SetBounds(new_bounds); |
| } |
| |
| void DimWindow::OnWindowDestroying(Window* window) { |
| if (window == parent_) { |
| window->ClearProperty(kDimWindowKey); |
| window->RemoveObserver(this); |
| parent_ = nullptr; |
| } |
| } |
| |
| } // namespace ash |