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/window_selector_item.h" | 5 #include "ash/common/wm/overview/window_selector_item.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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 | 84 |
85 // Amount of blur applied to the label shadow | 85 // Amount of blur applied to the label shadow |
86 static const int kShadowBlur = 10; | 86 static const int kShadowBlur = 10; |
87 | 87 |
88 // Height of an item header in Material Design. | 88 // Height of an item header in Material Design. |
89 static const int kHeaderHeight = 32; | 89 static const int kHeaderHeight = 32; |
90 | 90 |
91 // Opacity for dimmed items. | 91 // Opacity for dimmed items. |
92 static const float kDimmedItemOpacity = 0.5f; | 92 static const float kDimmedItemOpacity = 0.5f; |
93 | 93 |
| 94 // Opacity for fading out during closing a window. |
| 95 static const float kClosingItemOpacity = 0.8f; |
| 96 |
94 // Duration of background opacity transition for the selected label. | 97 // Duration of background opacity transition for the selected label. |
95 static const int kSelectorFadeInMilliseconds = 350; | 98 static const int kSelectorFadeInMilliseconds = 350; |
96 | 99 |
| 100 // Before closing a window animate both the window and the caption to shrink by |
| 101 // this fraction of size. |
| 102 static const float kPreCloseScale = 0.02f; |
| 103 |
97 // Calculates the |window| bounds after being transformed to the selector's | 104 // Calculates the |window| bounds after being transformed to the selector's |
98 // space. The returned Rect is in virtual screen coordinates. | 105 // space. The returned Rect is in virtual screen coordinates. |
99 gfx::Rect GetTransformedBounds(WmWindow* window) { | 106 gfx::Rect GetTransformedBounds(WmWindow* window) { |
100 gfx::RectF bounds( | 107 gfx::RectF bounds( |
101 window->GetRootWindow()->ConvertRectToScreen(window->GetTargetBounds())); | 108 window->GetRootWindow()->ConvertRectToScreen(window->GetTargetBounds())); |
102 gfx::Transform new_transform = TransformAboutPivot( | 109 gfx::Transform new_transform = TransformAboutPivot( |
103 gfx::Point(bounds.x(), bounds.y()), window->GetTargetTransform()); | 110 gfx::Point(bounds.x(), bounds.y()), window->GetTargetTransform()); |
104 new_transform.TransformRect(&bounds); | 111 new_transform.TransformRect(&bounds); |
105 | 112 |
106 // With Material Design the preview title is shown above the preview window. | 113 // With Material Design the preview title is shown above the preview window. |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 } | 391 } |
385 | 392 |
386 void WindowSelectorItem::SetDimmed(bool dimmed) { | 393 void WindowSelectorItem::SetDimmed(bool dimmed) { |
387 dimmed_ = dimmed; | 394 dimmed_ = dimmed; |
388 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); | 395 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); |
389 } | 396 } |
390 | 397 |
391 void WindowSelectorItem::ButtonPressed(views::Button* sender, | 398 void WindowSelectorItem::ButtonPressed(views::Button* sender, |
392 const ui::Event& event) { | 399 const ui::Event& event) { |
393 if (sender == close_button_) { | 400 if (sender == close_button_) { |
| 401 if (ash::MaterialDesignController::IsOverviewMaterial()) { |
| 402 gfx::Rect inset_bounds(target_bounds_); |
| 403 inset_bounds.Inset(target_bounds_.width() * kPreCloseScale, |
| 404 target_bounds_.height() * kPreCloseScale); |
| 405 OverviewAnimationType animation_type = |
| 406 OverviewAnimationType::OVERVIEW_ANIMATION_CLOSING_SELECTOR_ITEM; |
| 407 // Scale down both the window and label. |
| 408 SetBounds(inset_bounds, animation_type); |
| 409 // First animate opacity to an intermediate value concurrently with the |
| 410 // scaling animation. |
| 411 AnimateOpacity(kClosingItemOpacity, animation_type); |
| 412 |
| 413 // Fade out the window and the label, effectively hiding them. |
| 414 AnimateOpacity( |
| 415 0.0, OverviewAnimationType::OVERVIEW_ANIMATION_CLOSE_SELECTOR_ITEM); |
| 416 } |
394 transform_window_.Close(); | 417 transform_window_.Close(); |
395 return; | 418 return; |
396 } | 419 } |
397 CHECK(sender == window_label_button_view_); | 420 CHECK(sender == window_label_button_view_); |
398 window_selector_->SelectWindow(transform_window_.window()); | 421 window_selector_->SelectWindow(transform_window_.window()); |
399 } | 422 } |
400 | 423 |
401 void WindowSelectorItem::OnWindowDestroying(WmWindow* window) { | 424 void WindowSelectorItem::OnWindowDestroying(WmWindow* window) { |
402 window->RemoveObserver(this); | 425 window->RemoveObserver(this); |
403 transform_window_.OnWindowDestroyed(); | 426 transform_window_.OnWindowDestroyed(); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 | 566 |
544 if (!window_label_button_view_->visible()) { | 567 if (!window_label_button_view_->visible()) { |
545 window_label_button_view_->SetVisible(true); | 568 window_label_button_view_->SetVisible(true); |
546 SetupFadeInAfterLayout(window_label_.get()); | 569 SetupFadeInAfterLayout(window_label_.get()); |
547 SetupFadeInAfterLayout(window_label_selector_.get()); | 570 SetupFadeInAfterLayout(window_label_selector_.get()); |
548 } | 571 } |
549 WmWindow* window_label_window = | 572 WmWindow* window_label_window = |
550 WmLookup::Get()->GetWindowForWidget(window_label_.get()); | 573 WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
551 WmWindow* window_label_selector_window = | 574 WmWindow* window_label_selector_window = |
552 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); | 575 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| 576 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = |
| 577 ScopedOverviewAnimationSettingsFactory::Get() |
| 578 ->CreateOverviewAnimationSettings(animation_type, |
| 579 window_label_window); |
| 580 std::unique_ptr<ScopedOverviewAnimationSettings> |
| 581 animation_settings_selector = |
| 582 ScopedOverviewAnimationSettingsFactory::Get() |
| 583 ->CreateOverviewAnimationSettings(animation_type, |
| 584 window_label_selector_window); |
553 window_label_selector_window->SetBounds(label_rect); | 585 window_label_selector_window->SetBounds(label_rect); |
554 // |window_label_window| covers both the transformed window and the header | 586 // |window_label_window| covers both the transformed window and the header |
555 // as well as the gap between the windows to prevent events from reaching | 587 // as well as the gap between the windows to prevent events from reaching |
556 // the window including its sizing borders. | 588 // the window including its sizing borders. |
557 label_rect.set_height(label_rect.height() + | 589 label_rect.set_height(label_rect.height() + |
558 transformed_window_bounds.height()); | 590 transformed_window_bounds.height()); |
559 label_rect.Inset(-kWindowSelectorMargin, -kWindowSelectorMargin); | 591 label_rect.Inset(-kWindowSelectorMargin, -kWindowSelectorMargin); |
560 window_label_window->SetBounds(label_rect); | 592 window_label_window->SetBounds(label_rect); |
561 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = | |
562 ScopedOverviewAnimationSettingsFactory::Get() | |
563 ->CreateOverviewAnimationSettings(animation_type, | |
564 window_label_window); | |
565 gfx::Transform label_transform; | 593 gfx::Transform label_transform; |
566 label_transform.Translate(transformed_window_bounds.x(), | 594 label_transform.Translate(transformed_window_bounds.x(), |
567 transformed_window_bounds.y()); | 595 transformed_window_bounds.y()); |
568 window_label_window->SetTransform(label_transform); | 596 window_label_window->SetTransform(label_transform); |
569 window_label_selector_window->SetTransform(label_transform); | 597 window_label_selector_window->SetTransform(label_transform); |
570 } else { | 598 } else { |
571 if (!close_button_->visible()) { | 599 if (!close_button_->visible()) { |
572 close_button_->SetVisible(true); | 600 close_button_->SetVisible(true); |
573 SetupFadeInAfterLayout(close_button_widget_.get()); | 601 SetupFadeInAfterLayout(close_button_widget_.get()); |
574 } | 602 } |
575 WmWindow* close_button_widget_window = | 603 WmWindow* close_button_widget_window = |
576 WmLookup::Get()->GetWindowForWidget(close_button_widget_.get()); | 604 WmLookup::Get()->GetWindowForWidget(close_button_widget_.get()); |
577 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = | 605 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = |
578 ScopedOverviewAnimationSettingsFactory::Get() | 606 ScopedOverviewAnimationSettingsFactory::Get() |
579 ->CreateOverviewAnimationSettings(animation_type, | 607 ->CreateOverviewAnimationSettings(animation_type, |
580 close_button_widget_window); | 608 close_button_widget_window); |
581 | 609 |
582 gfx::Transform close_button_transform; | 610 gfx::Transform close_button_transform; |
583 close_button_transform.Translate(transformed_window_bounds.right(), | 611 close_button_transform.Translate(transformed_window_bounds.right(), |
584 transformed_window_bounds.y()); | 612 transformed_window_bounds.y()); |
585 close_button_widget_window->SetTransform(close_button_transform); | 613 close_button_widget_window->SetTransform(close_button_transform); |
586 } | 614 } |
587 } | 615 } |
588 | 616 |
| 617 void WindowSelectorItem::AnimateOpacity(float opacity, |
| 618 OverviewAnimationType animation_type) { |
| 619 DCHECK_GE(opacity, 0.f); |
| 620 DCHECK_LE(opacity, 1.f); |
| 621 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
| 622 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
| 623 transform_window_.SetOpacity(opacity); |
| 624 |
| 625 WmWindow* window_label_window = |
| 626 WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| 627 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label = |
| 628 ScopedOverviewAnimationSettingsFactory::Get() |
| 629 ->CreateOverviewAnimationSettings(animation_type, |
| 630 window_label_window); |
| 631 window_label_window->SetOpacity(opacity); |
| 632 |
| 633 WmWindow* window_label_selector_window = |
| 634 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| 635 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector = |
| 636 ScopedOverviewAnimationSettingsFactory::Get() |
| 637 ->CreateOverviewAnimationSettings(animation_type, |
| 638 window_label_selector_window); |
| 639 window_label_selector_window->SetOpacity(opacity); |
| 640 } |
| 641 |
589 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { | 642 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
590 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( | 643 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( |
591 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, | 644 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, |
592 GetWindow()->GetTitle())); | 645 GetWindow()->GetTitle())); |
593 } | 646 } |
594 | 647 |
595 } // namespace ash | 648 } // namespace ash |
OLD | NEW |