OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/wm/dock/docked_window_layout_manager.h" | 5 #include "ash/wm/dock/docked_window_layout_manager.h" |
6 | 6 |
7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
8 #include "ash/screen_ash.h" | 8 #include "ash/screen_ash.h" |
9 #include "ash/shelf/shelf.h" | 9 #include "ash/shelf/shelf.h" |
10 #include "ash/shelf/shelf_constants.h" | 10 #include "ash/shelf/shelf_constants.h" |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 if (is_dragged_window_docked_) | 507 if (is_dragged_window_docked_) |
508 OnDraggedWindowUndocked(); | 508 OnDraggedWindowUndocked(); |
509 DCHECK (!is_dragged_window_docked_); | 509 DCHECK (!is_dragged_window_docked_); |
510 // Stop observing a window unless it is docked container's child in which | 510 // Stop observing a window unless it is docked container's child in which |
511 // case it needs to keep being observed after the drag completes. | 511 // case it needs to keep being observed after the drag completes. |
512 if (dragged_window_->parent() != dock_container_) { | 512 if (dragged_window_->parent() != dock_container_) { |
513 dragged_window_->RemoveObserver(this); | 513 dragged_window_->RemoveObserver(this); |
514 wm::GetWindowState(dragged_window_)->RemoveObserver(this); | 514 wm::GetWindowState(dragged_window_)->RemoveObserver(this); |
515 if (last_active_window_ == dragged_window_) | 515 if (last_active_window_ == dragged_window_) |
516 last_active_window_ = NULL; | 516 last_active_window_ = NULL; |
| 517 |
| 518 views::corewm::SetWindowShowAnimationDuration(dragged_window_, |
| 519 base::TimeDelta()); |
517 } else { | 520 } else { |
518 // A window is no longer dragged and is a child. | 521 // A window is no longer dragged and is a child. |
519 // When a window becomes a child at drag start this is | 522 // When a window becomes a child at drag start this is |
520 // the only opportunity we will have to enforce a window | 523 // the only opportunity we will have to enforce a window |
521 // count limit so do it here. | 524 // count limit so do it here. |
522 MaybeMinimizeChildrenExcept(dragged_window_); | 525 MaybeMinimizeChildrenExcept(dragged_window_); |
| 526 |
| 527 views::corewm::SetWindowShowAnimationDuration(dragged_window_, |
| 528 base::TimeDelta::FromMilliseconds(kFadeDurationMs)); |
523 } | 529 } |
524 dragged_window_ = NULL; | 530 dragged_window_ = NULL; |
525 dragged_bounds_ = gfx::Rect(); | 531 dragged_bounds_ = gfx::Rect(); |
526 Relayout(); | 532 Relayout(); |
527 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); | 533 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); |
528 RecordUmaAction(action, source); | 534 RecordUmaAction(action, source); |
529 } | 535 } |
530 | 536 |
531 void DockedWindowLayoutManager::SetShelf(Shelf* shelf) { | 537 void DockedWindowLayoutManager::SetShelf(Shelf* shelf) { |
532 DCHECK(!shelf_); | 538 DCHECK(!shelf_); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 // change, so the the alignment may not be valid. | 657 // change, so the the alignment may not be valid. |
652 if (alignment_ == DOCKED_ALIGNMENT_NONE) { | 658 if (alignment_ == DOCKED_ALIGNMENT_NONE) { |
653 alignment_ = GetAlignmentOfWindow(child); | 659 alignment_ = GetAlignmentOfWindow(child); |
654 DCHECK(alignment_ != DOCKED_ALIGNMENT_NONE); | 660 DCHECK(alignment_ != DOCKED_ALIGNMENT_NONE); |
655 } | 661 } |
656 MaybeMinimizeChildrenExcept(child); | 662 MaybeMinimizeChildrenExcept(child); |
657 child->AddObserver(this); | 663 child->AddObserver(this); |
658 wm::GetWindowState(child)->AddObserver(this); | 664 wm::GetWindowState(child)->AddObserver(this); |
659 Relayout(); | 665 Relayout(); |
660 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); | 666 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); |
| 667 views::corewm::SetWindowShowAnimationDuration(child, |
| 668 base::TimeDelta::FromMilliseconds(kFadeDurationMs)); |
661 } | 669 } |
662 | 670 |
663 void DockedWindowLayoutManager::OnWindowRemovedFromLayout(aura::Window* child) { | 671 void DockedWindowLayoutManager::OnWindowRemovedFromLayout(aura::Window* child) { |
664 if (IsPopupOrTransient(child)) | 672 if (IsPopupOrTransient(child)) |
665 return; | 673 return; |
666 // Dragged windows are stopped being observed by FinishDragging and do not | 674 // Dragged windows are stopped being observed by FinishDragging and do not |
667 // change alignment during the drag. They also cannot be set to be the | 675 // change alignment during the drag. They also cannot be set to be the |
668 // |last_active_window_|. | 676 // |last_active_window_|. |
669 if (child == dragged_window_) | 677 if (child == dragged_window_) |
670 return; | 678 return; |
671 // If this is the last window, set alignment and maximize the workspace. | 679 // If this is the last window, set alignment and maximize the workspace. |
672 if (!IsAnyWindowDocked()) { | 680 if (!IsAnyWindowDocked()) { |
673 alignment_ = DOCKED_ALIGNMENT_NONE; | 681 alignment_ = DOCKED_ALIGNMENT_NONE; |
674 UpdateDockedWidth(0); | 682 UpdateDockedWidth(0); |
675 } | 683 } |
676 if (last_active_window_ == child) | 684 if (last_active_window_ == child) |
677 last_active_window_ = NULL; | 685 last_active_window_ = NULL; |
678 child->RemoveObserver(this); | 686 child->RemoveObserver(this); |
679 wm::GetWindowState(child)->RemoveObserver(this); | 687 wm::GetWindowState(child)->RemoveObserver(this); |
680 Relayout(); | 688 Relayout(); |
681 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); | 689 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); |
| 690 views::corewm::SetWindowShowAnimationDuration(child, base::TimeDelta()); |
682 } | 691 } |
683 | 692 |
684 void DockedWindowLayoutManager::OnChildWindowVisibilityChanged( | 693 void DockedWindowLayoutManager::OnChildWindowVisibilityChanged( |
685 aura::Window* child, | 694 aura::Window* child, |
686 bool visible) { | 695 bool visible) { |
687 if (IsPopupOrTransient(child)) | 696 if (IsPopupOrTransient(child)) |
688 return; | 697 return; |
689 if (visible) | 698 if (visible) |
690 wm::GetWindowState(child)->Restore(); | 699 wm::GetWindowState(child)->Restore(); |
691 Relayout(); | 700 Relayout(); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 | 819 |
811 void DockedWindowLayoutManager::OnWindowBoundsChanged( | 820 void DockedWindowLayoutManager::OnWindowBoundsChanged( |
812 aura::Window* window, | 821 aura::Window* window, |
813 const gfx::Rect& old_bounds, | 822 const gfx::Rect& old_bounds, |
814 const gfx::Rect& new_bounds) { | 823 const gfx::Rect& new_bounds) { |
815 // Only relayout if the dragged window would get docked. | 824 // Only relayout if the dragged window would get docked. |
816 if (window == dragged_window_ && is_dragged_window_docked_) | 825 if (window == dragged_window_ && is_dragged_window_docked_) |
817 Relayout(); | 826 Relayout(); |
818 } | 827 } |
819 | 828 |
820 void DockedWindowLayoutManager::OnWindowVisibilityChanging( | |
821 aura::Window* window, bool visible) { | |
822 if (IsPopupOrTransient(window)) | |
823 return; | |
824 int animation_type = views::corewm::WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT; | |
825 if (visible) { | |
826 animation_type = views::corewm::WINDOW_VISIBILITY_ANIMATION_TYPE_DROP; | |
827 views::corewm::SetWindowVisibilityAnimationDuration( | |
828 window, base::TimeDelta::FromMilliseconds(kFadeDurationMs)); | |
829 } else if (wm::GetWindowState(window)->IsMinimized()) { | |
830 animation_type = WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE; | |
831 } | |
832 views::corewm::SetWindowVisibilityAnimationType(window, animation_type); | |
833 } | |
834 | |
835 void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) { | 829 void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) { |
836 if (dragged_window_ == window) { | 830 if (dragged_window_ == window) { |
837 FinishDragging(DOCKED_ACTION_NONE, DOCKED_ACTION_SOURCE_UNKNOWN); | 831 FinishDragging(DOCKED_ACTION_NONE, DOCKED_ACTION_SOURCE_UNKNOWN); |
838 DCHECK(!dragged_window_); | 832 DCHECK(!dragged_window_); |
839 DCHECK (!is_dragged_window_docked_); | 833 DCHECK (!is_dragged_window_docked_); |
840 } | 834 } |
841 if (window == last_active_window_) | 835 if (window == last_active_window_) |
842 last_active_window_ = NULL; | 836 last_active_window_ = NULL; |
843 RecordUmaAction(DOCKED_ACTION_CLOSE, DOCKED_ACTION_SOURCE_UNKNOWN); | 837 RecordUmaAction(DOCKED_ACTION_CLOSE, DOCKED_ACTION_SOURCE_UNKNOWN); |
844 } | 838 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 while (iter != children.rend()) { | 877 while (iter != children.rend()) { |
884 aura::Window* window(*iter++); | 878 aura::Window* window(*iter++); |
885 if (window == child || !IsUsedByLayout(window)) | 879 if (window == child || !IsUsedByLayout(window)) |
886 continue; | 880 continue; |
887 int room_needed = GetWindowHeightCloseTo(window, 0) + | 881 int room_needed = GetWindowHeightCloseTo(window, 0) + |
888 (gap_needed ? kMinDockGap : 0); | 882 (gap_needed ? kMinDockGap : 0); |
889 gap_needed = true; | 883 gap_needed = true; |
890 if (available_room > room_needed) { | 884 if (available_room > room_needed) { |
891 available_room -= room_needed; | 885 available_room -= room_needed; |
892 } else { | 886 } else { |
893 // Slow down minimizing animations. Lock duration so that it is not | 887 // Slow down the minimize animation. |
894 // overridden by other ScopedLayerAnimationSettings down the stack. | 888 views::corewm::SetWindowHideAnimationDuration( |
895 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); | 889 window, |
896 settings.SetTransitionDuration( | |
897 base::TimeDelta::FromMilliseconds(kMinimizeDurationMs)); | 890 base::TimeDelta::FromMilliseconds(kMinimizeDurationMs)); |
898 settings.LockTransitionDuration(); | |
899 wm::GetWindowState(window)->Minimize(); | 891 wm::GetWindowState(window)->Minimize(); |
| 892 views::corewm::SetWindowHideAnimationDuration(window, base::TimeDelta()); |
900 } | 893 } |
901 } | 894 } |
902 } | 895 } |
903 | 896 |
904 void DockedWindowLayoutManager::MinimizeDockedWindow( | 897 void DockedWindowLayoutManager::MinimizeDockedWindow( |
905 wm::WindowState* window_state) { | 898 wm::WindowState* window_state) { |
906 DCHECK(!IsPopupOrTransient(window_state->window())); | 899 aura::Window* window = window_state->window(); |
907 window_state->window()->Hide(); | 900 DCHECK(!IsPopupOrTransient(window)); |
| 901 views::corewm::SetWindowVisibilityAnimationType(window, |
| 902 ash::WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
| 903 window->Hide(); |
| 904 views::corewm::SetWindowVisibilityAnimationType(window, |
| 905 views::corewm::WINDOW_VISIBILITY_ANIMATION_TYPE_DEFAULT); |
908 if (window_state->IsActive()) | 906 if (window_state->IsActive()) |
909 window_state->Deactivate(); | 907 window_state->Deactivate(); |
910 RecordUmaAction(DOCKED_ACTION_MINIMIZE, DOCKED_ACTION_SOURCE_UNKNOWN); | 908 RecordUmaAction(DOCKED_ACTION_MINIMIZE, DOCKED_ACTION_SOURCE_UNKNOWN); |
911 } | 909 } |
912 | 910 |
913 void DockedWindowLayoutManager::RestoreDockedWindow( | 911 void DockedWindowLayoutManager::RestoreDockedWindow( |
914 wm::WindowState* window_state) { | 912 wm::WindowState* window_state) { |
915 aura::Window* window = window_state->window(); | 913 aura::Window* window = window_state->window(); |
916 DCHECK(!IsPopupOrTransient(window)); | 914 DCHECK(!IsPopupOrTransient(window)); |
917 // Always place restored window at the bottom shuffling the other windows up. | 915 // Always place restored window at the bottom shuffling the other windows up. |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( | 1297 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( |
1300 const gfx::Rect& keyboard_bounds) { | 1298 const gfx::Rect& keyboard_bounds) { |
1301 // This bounds change will have caused a change to the Shelf which does not | 1299 // This bounds change will have caused a change to the Shelf which does not |
1302 // propagate automatically to this class, so manually recalculate bounds. | 1300 // propagate automatically to this class, so manually recalculate bounds. |
1303 Relayout(); | 1301 Relayout(); |
1304 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); | 1302 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); |
1305 } | 1303 } |
1306 | 1304 |
1307 } // namespace internal | 1305 } // namespace internal |
1308 } // namespace ash | 1306 } // namespace ash |
OLD | NEW |