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 26 matching lines...) Expand all Loading... |
37 #include "ui/gfx/color_utils.h" | 37 #include "ui/gfx/color_utils.h" |
38 #include "ui/gfx/geometry/safe_integer_conversions.h" | 38 #include "ui/gfx/geometry/safe_integer_conversions.h" |
39 #include "ui/gfx/paint_vector_icon.h" | 39 #include "ui/gfx/paint_vector_icon.h" |
40 #include "ui/gfx/transform_util.h" | 40 #include "ui/gfx/transform_util.h" |
41 #include "ui/strings/grit/ui_strings.h" | 41 #include "ui/strings/grit/ui_strings.h" |
42 #include "ui/views/background.h" | 42 #include "ui/views/background.h" |
43 #include "ui/views/border.h" | 43 #include "ui/views/border.h" |
44 #include "ui/views/layout/box_layout.h" | 44 #include "ui/views/layout/box_layout.h" |
45 #include "ui/views/window/non_client_view.h" | 45 #include "ui/views/window/non_client_view.h" |
46 #include "ui/wm/core/shadow.h" | 46 #include "ui/wm/core/shadow.h" |
47 #include "ui/wm/core/shadow_types.h" | |
48 #include "ui/wm/core/window_util.h" | 47 #include "ui/wm/core/window_util.h" |
49 | 48 |
50 namespace ash { | 49 namespace ash { |
51 | 50 |
52 namespace { | 51 namespace { |
53 | 52 |
54 // In the conceptual overview table, the window margin is the space reserved | 53 // In the conceptual overview table, the window margin is the space reserved |
55 // around the window within the cell. This margin does not overlap so the | 54 // around the window within the cell. This margin does not overlap so the |
56 // closest distance between adjacent windows will be twice this amount. | 55 // closest distance between adjacent windows will be twice this amount. |
57 static const int kWindowMargin = 5; | 56 static const int kWindowMargin = 5; |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 SetItemBounds(inset_bounds, animation_type); | 492 SetItemBounds(inset_bounds, animation_type); |
494 | 493 |
495 // SetItemBounds is called before UpdateHeaderLayout so the header can | 494 // SetItemBounds is called before UpdateHeaderLayout so the header can |
496 // properly use the updated windows bounds. | 495 // properly use the updated windows bounds. |
497 UpdateHeaderLayout(HeaderFadeInMode::UPDATE, animation_type); | 496 UpdateHeaderLayout(HeaderFadeInMode::UPDATE, animation_type); |
498 } | 497 } |
499 | 498 |
500 void WindowSelectorItem::SetSelected(bool selected) { | 499 void WindowSelectorItem::SetSelected(bool selected) { |
501 selected_ = selected; | 500 selected_ = selected; |
502 background_view_->AnimateBackgroundOpacity(selected ? 0.f : kHeaderOpacity); | 501 background_view_->AnimateBackgroundOpacity(selected ? 0.f : kHeaderOpacity); |
503 | |
504 if (shadow_) { | |
505 ui::ScopedLayerAnimationSettings animation_settings_shadow( | |
506 shadow_->shadow_layer()->GetAnimator()); | |
507 animation_settings_shadow.SetTransitionDuration( | |
508 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); | |
509 animation_settings_shadow.SetTweenType( | |
510 selected ? gfx::Tween::FAST_OUT_LINEAR_IN | |
511 : gfx::Tween::LINEAR_OUT_SLOW_IN); | |
512 animation_settings_shadow.SetPreemptionStrategy( | |
513 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | |
514 shadow_->shadow_layer()->SetOpacity(selected ? 0.0f : 1.0f); | |
515 } | |
516 } | 502 } |
517 | 503 |
518 void WindowSelectorItem::SendAccessibleSelectionEvent() { | 504 void WindowSelectorItem::SendAccessibleSelectionEvent() { |
519 caption_container_view_->listener_button()->NotifyAccessibilityEvent( | 505 caption_container_view_->listener_button()->NotifyAccessibilityEvent( |
520 ui::AX_EVENT_SELECTION, true); | 506 ui::AX_EVENT_SELECTION, true); |
521 } | 507 } |
522 | 508 |
523 void WindowSelectorItem::CloseWindow() { | 509 void WindowSelectorItem::CloseWindow() { |
524 gfx::Rect inset_bounds(target_bounds_); | 510 gfx::Rect inset_bounds(target_bounds_); |
525 inset_bounds.Inset(target_bounds_.width() * kPreCloseScale, | 511 inset_bounds.Inset(target_bounds_.width() * kPreCloseScale, |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 // background color is opaque or transparent to decide whether to use | 647 // background color is opaque or transparent to decide whether to use |
662 // subpixel rendering. Does not actually set the label's background color. | 648 // subpixel rendering. Does not actually set the label's background color. |
663 label_view_->SetBackgroundColor(kLabelBackgroundColor); | 649 label_view_->SetBackgroundColor(kLabelBackgroundColor); |
664 | 650 |
665 caption_container_view_ = new CaptionContainerView( | 651 caption_container_view_ = new CaptionContainerView( |
666 this, label_view_, close_button_, background_view_); | 652 this, label_view_, close_button_, background_view_); |
667 item_widget_->SetContentsView(caption_container_view_); | 653 item_widget_->SetContentsView(caption_container_view_); |
668 label_view_->SetVisible(false); | 654 label_view_->SetVisible(false); |
669 item_widget_->SetOpacity(0); | 655 item_widget_->SetOpacity(0); |
670 item_widget_->Show(); | 656 item_widget_->Show(); |
671 | |
672 // TODO(varkha): Restore shadows when programmatic shadows exist. | |
673 // Note: current shadow implementation does not allow proper animation when | |
674 // the parent layer bounds change during the animation since | |
675 // Shadow::UpdateLayerBounds() only happens before the animation starts. | |
676 if (ash::MaterialDesignController::GetMode() == | |
677 ash::MaterialDesignController::Mode::MATERIAL_EXPERIMENTAL) { | |
678 shadow_.reset(new ::wm::Shadow()); | |
679 shadow_->Init(::wm::ShadowElevation::MEDIUM); | |
680 shadow_->layer()->SetVisible(true); | |
681 item_widget_->GetLayer()->Add(shadow_->layer()); | |
682 } | |
683 item_widget_->GetLayer()->SetMasksToBounds(false); | 657 item_widget_->GetLayer()->SetMasksToBounds(false); |
684 } | 658 } |
685 | 659 |
686 void WindowSelectorItem::UpdateHeaderLayout( | 660 void WindowSelectorItem::UpdateHeaderLayout( |
687 HeaderFadeInMode mode, | 661 HeaderFadeInMode mode, |
688 OverviewAnimationType animation_type) { | 662 OverviewAnimationType animation_type) { |
689 gfx::Rect transformed_window_bounds = root_window_->ConvertRectFromScreen( | 663 gfx::Rect transformed_window_bounds = root_window_->ConvertRectFromScreen( |
690 transform_window_.GetTransformedBounds()); | 664 transform_window_.GetTransformedBounds()); |
691 | 665 |
692 gfx::Rect label_rect(close_button_->GetPreferredSize()); | 666 gfx::Rect label_rect(close_button_->GetPreferredSize()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 if (mode != HeaderFadeInMode::ENTER) { | 703 if (mode != HeaderFadeInMode::ENTER) { |
730 label_rect.set_height(close_button_->GetPreferredSize().height() + | 704 label_rect.set_height(close_button_->GetPreferredSize().height() + |
731 transformed_window_bounds.height()); | 705 transformed_window_bounds.height()); |
732 } | 706 } |
733 label_rect.Inset(-kWindowSelectorMargin, -kWindowSelectorMargin); | 707 label_rect.Inset(-kWindowSelectorMargin, -kWindowSelectorMargin); |
734 widget_window->SetBounds(label_rect); | 708 widget_window->SetBounds(label_rect); |
735 gfx::Transform label_transform; | 709 gfx::Transform label_transform; |
736 label_transform.Translate(transformed_window_bounds.x(), | 710 label_transform.Translate(transformed_window_bounds.x(), |
737 transformed_window_bounds.y()); | 711 transformed_window_bounds.y()); |
738 widget_window->SetTransform(label_transform); | 712 widget_window->SetTransform(label_transform); |
739 | |
740 gfx::Rect shadow_bounds(label_rect.size()); | |
741 shadow_bounds.Inset(kWindowSelectorMargin, kWindowSelectorMargin); | |
742 if (shadow_) | |
743 shadow_->SetContentBounds(shadow_bounds); | |
744 } | 713 } |
745 | 714 |
746 void WindowSelectorItem::AnimateOpacity(float opacity, | 715 void WindowSelectorItem::AnimateOpacity(float opacity, |
747 OverviewAnimationType animation_type) { | 716 OverviewAnimationType animation_type) { |
748 DCHECK_GE(opacity, 0.f); | 717 DCHECK_GE(opacity, 0.f); |
749 DCHECK_LE(opacity, 1.f); | 718 DCHECK_LE(opacity, 1.f); |
750 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; | 719 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
751 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); | 720 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
752 transform_window_.SetOpacity(opacity); | 721 transform_window_.SetOpacity(opacity); |
753 | 722 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 | 761 |
793 gfx::SlideAnimation* WindowSelectorItem::GetBackgroundViewAnimation() { | 762 gfx::SlideAnimation* WindowSelectorItem::GetBackgroundViewAnimation() { |
794 return background_view_ ? background_view_->animation() : nullptr; | 763 return background_view_ ? background_view_->animation() : nullptr; |
795 } | 764 } |
796 | 765 |
797 WmWindow* WindowSelectorItem::GetOverviewWindowForMinimizedStateForTest() { | 766 WmWindow* WindowSelectorItem::GetOverviewWindowForMinimizedStateForTest() { |
798 return transform_window_.GetOverviewWindowForMinimizedState(); | 767 return transform_window_.GetOverviewWindowForMinimizedState(); |
799 } | 768 } |
800 | 769 |
801 } // namespace ash | 770 } // namespace ash |
OLD | NEW |