Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ash/common/wm/overview/scoped_transform_overview_window.h" | 5 #include "ash/common/wm/overview/scoped_transform_overview_window.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "ash/common/material_design/material_design_controller.h" | 10 #include "ash/common/material_design/material_design_controller.h" |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 TransientDescendantIterator(GetTransientRoot(window))); | 173 TransientDescendantIterator(GetTransientRoot(window))); |
| 174 } | 174 } |
| 175 | 175 |
| 176 } // namespace | 176 } // namespace |
| 177 | 177 |
| 178 // Mask layer that clips the window's original header in overview mode. | 178 // Mask layer that clips the window's original header in overview mode. |
| 179 // Only used with Material Design. | 179 // Only used with Material Design. |
| 180 class ScopedTransformOverviewWindow::OverviewContentMask | 180 class ScopedTransformOverviewWindow::OverviewContentMask |
| 181 : public ui::LayerDelegate { | 181 : public ui::LayerDelegate { |
| 182 public: | 182 public: |
| 183 OverviewContentMask(int inset, int radius); | 183 OverviewContentMask(float radius); |
|
tdanderson
2016/07/09 21:23:21
Make this constructor explicit
varkha
2016/07/09 22:00:17
Done.
| |
| 184 ~OverviewContentMask() override; | 184 ~OverviewContentMask() override; |
| 185 | 185 |
| 186 ui::Layer* layer() { return &layer_; } | 186 ui::Layer* layer() { return &layer_; } |
| 187 | 187 |
| 188 // Overridden from LayerDelegate. | 188 // Overridden from LayerDelegate. |
| 189 void OnPaintLayer(const ui::PaintContext& context) override; | 189 void OnPaintLayer(const ui::PaintContext& context) override; |
| 190 void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} | 190 void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} |
| 191 void OnDeviceScaleFactorChanged(float device_scale_factor) override; | 191 void OnDeviceScaleFactorChanged(float device_scale_factor) override; |
| 192 base::Closure PrepareForLayerBoundsChange() override; | 192 base::Closure PrepareForLayerBoundsChange() override; |
| 193 | 193 |
| 194 private: | 194 private: |
| 195 ui::Layer layer_; | 195 ui::Layer layer_; |
| 196 int inset_; | 196 float radius_; |
| 197 int radius_; | |
| 198 | 197 |
| 199 DISALLOW_COPY_AND_ASSIGN(OverviewContentMask); | 198 DISALLOW_COPY_AND_ASSIGN(OverviewContentMask); |
| 200 }; | 199 }; |
| 201 | 200 |
| 202 ScopedTransformOverviewWindow::OverviewContentMask::OverviewContentMask( | 201 ScopedTransformOverviewWindow::OverviewContentMask::OverviewContentMask( |
| 203 int inset, | 202 float radius) |
| 204 int radius) | 203 : layer_(ui::LAYER_TEXTURED), radius_(radius) { |
| 205 : layer_(ui::LAYER_TEXTURED), inset_(inset), radius_(radius) { | |
| 206 layer_.set_delegate(this); | 204 layer_.set_delegate(this); |
| 207 } | 205 } |
| 208 | 206 |
| 209 ScopedTransformOverviewWindow::OverviewContentMask::~OverviewContentMask() { | 207 ScopedTransformOverviewWindow::OverviewContentMask::~OverviewContentMask() { |
| 210 layer_.set_delegate(nullptr); | 208 layer_.set_delegate(nullptr); |
| 211 } | 209 } |
| 212 | 210 |
| 213 void ScopedTransformOverviewWindow::OverviewContentMask::OnPaintLayer( | 211 void ScopedTransformOverviewWindow::OverviewContentMask::OnPaintLayer( |
| 214 const ui::PaintContext& context) { | 212 const ui::PaintContext& context) { |
| 215 ui::PaintRecorder recorder(context, layer()->size()); | 213 ui::PaintRecorder recorder(context, layer()->size()); |
| 216 gfx::Rect bounds(layer()->bounds().size()); | 214 gfx::Rect bounds(layer()->bounds().size()); |
| 217 bounds.Inset(0, inset_, 0, 0); | |
| 218 | 215 |
| 219 // Tile a window into an area, rounding the bottom corners. | 216 // Tile a window into an area, rounding the bottom corners. |
| 220 const SkRect rect = gfx::RectToSkRect(bounds); | 217 const SkRect rect = gfx::RectToSkRect(bounds); |
| 221 const SkScalar corner_radius_scalar = SkIntToScalar(radius_); | 218 const SkScalar corner_radius_scalar = SkIntToScalar(radius_); |
| 222 SkScalar radii[8] = {0, | 219 SkScalar radii[8] = {0, |
| 223 0, // top-left | 220 0, // top-left |
| 224 0, | 221 0, |
| 225 0, // top-right | 222 0, // top-right |
| 226 corner_radius_scalar, | 223 corner_radius_scalar, |
| 227 corner_radius_scalar, // bottom-right | 224 corner_radius_scalar, // bottom-right |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 243 // Redrawing will take care of scale factor change. | 240 // Redrawing will take care of scale factor change. |
| 244 } | 241 } |
| 245 | 242 |
| 246 base::Closure ScopedTransformOverviewWindow::OverviewContentMask:: | 243 base::Closure ScopedTransformOverviewWindow::OverviewContentMask:: |
| 247 PrepareForLayerBoundsChange() { | 244 PrepareForLayerBoundsChange() { |
| 248 return base::Closure(); | 245 return base::Closure(); |
| 249 } | 246 } |
| 250 | 247 |
| 251 ScopedTransformOverviewWindow::ScopedTransformOverviewWindow(WmWindow* window) | 248 ScopedTransformOverviewWindow::ScopedTransformOverviewWindow(WmWindow* window) |
| 252 : window_(window), | 249 : window_(window), |
| 250 alpha_shape_set_(false), | |
| 253 minimized_(window->GetShowState() == ui::SHOW_STATE_MINIMIZED), | 251 minimized_(window->GetShowState() == ui::SHOW_STATE_MINIMIZED), |
| 254 ignored_by_shelf_(window->GetWindowState()->ignored_by_shelf()), | 252 ignored_by_shelf_(window->GetWindowState()->ignored_by_shelf()), |
| 255 overview_started_(false), | 253 overview_started_(false), |
| 256 original_transform_(window->GetTargetTransform()), | 254 original_transform_(window->GetTargetTransform()), |
| 257 original_opacity_(window->GetTargetOpacity()), | 255 original_opacity_(window->GetTargetOpacity()), |
| 258 weak_ptr_factory_(this) {} | 256 weak_ptr_factory_(this) {} |
| 259 | 257 |
| 260 ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() {} | 258 ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() {} |
| 261 | 259 |
| 262 void ScopedTransformOverviewWindow::RestoreWindow() { | 260 void ScopedTransformOverviewWindow::RestoreWindow() { |
| 263 if (ash::MaterialDesignController::IsOverviewMaterial()) { | |
| 264 window()->GetLayer()->SetMaskLayer(nullptr); | |
| 265 mask_.reset(); | |
| 266 } | |
| 267 | |
| 268 ScopedAnimationSettings animation_settings_list; | 261 ScopedAnimationSettings animation_settings_list; |
| 269 BeginScopedAnimation(OverviewAnimationType::OVERVIEW_ANIMATION_RESTORE_WINDOW, | 262 BeginScopedAnimation(OverviewAnimationType::OVERVIEW_ANIMATION_RESTORE_WINDOW, |
| 270 &animation_settings_list); | 263 &animation_settings_list); |
| 271 SetTransform(window()->GetRootWindow(), original_transform_, 0); | 264 SetTransform(window()->GetRootWindow(), original_transform_, 0); |
| 272 | 265 |
| 273 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = | 266 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = |
| 274 CreateScopedOverviewAnimationSettings( | 267 CreateScopedOverviewAnimationSettings( |
| 275 OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS, | 268 OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS, |
| 276 window_); | 269 window_); |
| 277 gfx::Transform transform; | 270 gfx::Transform transform; |
| 278 if (minimized_ && window_->GetShowState() != ui::SHOW_STATE_MINIMIZED) { | 271 if (minimized_ && window_->GetShowState() != ui::SHOW_STATE_MINIMIZED) { |
| 279 // Setting opacity 0 and visible false ensures that the property change | 272 // Setting opacity 0 and visible false ensures that the property change |
| 280 // to SHOW_STATE_MINIMIZED will not animate the window from its original | 273 // to SHOW_STATE_MINIMIZED will not animate the window from its original |
| 281 // bounds to the minimized position. | 274 // bounds to the minimized position. |
| 282 // Hiding the window needs to be done before the target opacity is 0, | 275 // Hiding the window needs to be done before the target opacity is 0, |
| 283 // otherwise the layer's visibility will not be updated | 276 // otherwise the layer's visibility will not be updated |
| 284 // (See VisibilityController::UpdateLayerVisibility). | 277 // (See VisibilityController::UpdateLayerVisibility). |
| 285 window_->Hide(); | 278 window_->Hide(); |
| 286 window_->SetOpacity(0); | 279 window_->SetOpacity(0); |
| 287 window_->SetShowState(ui::SHOW_STATE_MINIMIZED); | 280 window_->SetShowState(ui::SHOW_STATE_MINIMIZED); |
| 288 } | 281 } |
| 289 window_->GetWindowState()->set_ignored_by_shelf(ignored_by_shelf_); | 282 window_->GetWindowState()->set_ignored_by_shelf(ignored_by_shelf_); |
| 290 SetOpacity(original_opacity_); | 283 SetOpacity(original_opacity_); |
| 284 | |
| 285 if (ash::MaterialDesignController::IsOverviewMaterial()) { | |
| 286 ui::Layer* layer = window()->GetLayer(); | |
| 287 layer->SetMaskLayer(nullptr); | |
| 288 mask_.reset(); | |
| 289 | |
| 290 if (original_alpha_shape_) { | |
| 291 layer->SetAlphaShape( | |
| 292 base::WrapUnique(new SkRegion(*original_alpha_shape_.get()))); | |
| 293 } else { | |
| 294 layer->SetAlphaShape(nullptr); | |
| 295 } | |
| 296 window()->SetMasksToBounds(false); | |
| 297 alpha_shape_set_ = false; | |
| 298 } | |
| 291 } | 299 } |
| 292 | 300 |
| 293 void ScopedTransformOverviewWindow::BeginScopedAnimation( | 301 void ScopedTransformOverviewWindow::BeginScopedAnimation( |
| 294 OverviewAnimationType animation_type, | 302 OverviewAnimationType animation_type, |
| 295 ScopedAnimationSettings* animation_settings) { | 303 ScopedAnimationSettings* animation_settings) { |
| 296 for (auto* window : GetTransientTreeIterator(window_)) { | 304 for (auto* window : GetTransientTreeIterator(window_)) { |
| 297 animation_settings->push_back( | 305 animation_settings->push_back( |
| 298 CreateScopedOverviewAnimationSettings(animation_type, window)); | 306 CreateScopedOverviewAnimationSettings(animation_type, window)); |
| 299 } | 307 } |
| 300 } | 308 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 gfx::Transform transform; | 395 gfx::Transform transform; |
| 388 transform.Translate(dst_rect.x() - src_rect.x(), dst_rect.y() - src_rect.y()); | 396 transform.Translate(dst_rect.x() - src_rect.x(), dst_rect.y() - src_rect.y()); |
| 389 transform.Scale(static_cast<float>(dst_rect.width()) / src_rect.width(), | 397 transform.Scale(static_cast<float>(dst_rect.width()) / src_rect.width(), |
| 390 static_cast<float>(dst_rect.height()) / src_rect.height()); | 398 static_cast<float>(dst_rect.height()) / src_rect.height()); |
| 391 return transform; | 399 return transform; |
| 392 } | 400 } |
| 393 | 401 |
| 394 void ScopedTransformOverviewWindow::SetTransform( | 402 void ScopedTransformOverviewWindow::SetTransform( |
| 395 WmWindow* root_window, | 403 WmWindow* root_window, |
| 396 const gfx::Transform& transform, | 404 const gfx::Transform& transform, |
| 397 int radius) { | 405 float radius) { |
| 398 DCHECK(overview_started_); | 406 DCHECK(overview_started_); |
| 399 | 407 |
| 400 if (ash::MaterialDesignController::IsOverviewMaterial() && !mask_) { | 408 if (ash::MaterialDesignController::IsOverviewMaterial() && |
| 401 mask_.reset(new OverviewContentMask( | 409 &transform != &original_transform_) { |
|
tdanderson
2016/07/09 21:23:21
Hmm, shouldn't all of SetTransform() be a no-op i
varkha
2016/07/09 22:00:17
No. This method is used to both set the transform
| |
| 402 window()->GetIntProperty(WmWindowProperty::TOP_VIEW_INSET), radius)); | 410 gfx::Rect bounds(GetTargetBoundsInScreen().size()); |
| 403 mask_->layer()->SetBounds(GetTargetBoundsInScreen()); | 411 mask_.reset(new OverviewContentMask(radius)); |
| 412 mask_->layer()->SetBounds(bounds); | |
|
tdanderson
2016/07/09 21:23:21
I don't understand why you're setting bounds with
varkha
2016/07/09 22:00:17
This is for a mask layer - my understanding is tha
| |
| 404 window()->GetLayer()->SetMaskLayer(mask_->layer()); | 413 window()->GetLayer()->SetMaskLayer(mask_->layer()); |
| 414 | |
| 415 if (!alpha_shape_set_) { | |
|
tdanderson
2016/07/09 21:23:21
I don't think you need |alpha_shape_set_| at all.
varkha
2016/07/09 22:00:17
Done.
| |
| 416 if (window()->GetLayer()->alpha_shape()) | |
|
tdanderson
2016/07/09 21:23:21
{} since call to reset() spans two lines
varkha
2016/07/09 22:00:17
Done.
| |
| 417 original_alpha_shape_.reset( | |
| 418 new SkRegion(*window()->GetLayer()->alpha_shape())); | |
| 419 window()->SetMasksToBounds(true); | |
| 420 alpha_shape_set_ = true; | |
| 421 } | |
| 422 bounds.Inset(0, window()->GetIntProperty(WmWindowProperty::TOP_VIEW_INSET), | |
| 423 0, 0); | |
| 424 SkRegion* region = new SkRegion; | |
| 425 region->setRect(RectToSkIRect(bounds)); | |
| 426 if (original_alpha_shape_) | |
| 427 region->op(*original_alpha_shape_, SkRegion::kIntersect_Op); | |
| 428 window()->GetLayer()->SetAlphaShape(base::WrapUnique(region)); | |
|
varkha
2016/07/09 21:07:32
Self review: this could be done only for windows t
varkha
2016/07/09 22:00:17
Done.
| |
| 405 } | 429 } |
| 406 | 430 |
| 407 gfx::Point target_origin(GetTargetBoundsInScreen().origin()); | 431 gfx::Point target_origin(GetTargetBoundsInScreen().origin()); |
| 408 | 432 |
| 409 for (auto* window : GetTransientTreeIterator(window_)) { | 433 for (auto* window : GetTransientTreeIterator(window_)) { |
| 410 WmWindow* parent_window = window->GetParent(); | 434 WmWindow* parent_window = window->GetParent(); |
| 411 gfx::Point original_origin = | 435 gfx::Point original_origin = |
| 412 parent_window->ConvertRectToScreen(window->GetTargetBounds()).origin(); | 436 parent_window->ConvertRectToScreen(window->GetTargetBounds()).origin(); |
| 413 gfx::Transform new_transform = | 437 gfx::Transform new_transform = |
| 414 TransformAboutPivot(gfx::Point(target_origin.x() - original_origin.x(), | 438 TransformAboutPivot(gfx::Point(target_origin.x() - original_origin.x(), |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 448 if (parent_window) | 472 if (parent_window) |
| 449 parent_window->CloseWidget(); | 473 parent_window->CloseWidget(); |
| 450 } | 474 } |
| 451 | 475 |
| 452 // static | 476 // static |
| 453 void ScopedTransformOverviewWindow::SetImmediateCloseForTests() { | 477 void ScopedTransformOverviewWindow::SetImmediateCloseForTests() { |
| 454 immediate_close_for_tests = true; | 478 immediate_close_for_tests = true; |
| 455 } | 479 } |
| 456 | 480 |
| 457 } // namespace ash | 481 } // namespace ash |
| OLD | NEW |