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/launcher/launcher.h" | 8 #include "ash/launcher/launcher.h" |
9 #include "ash/screen_ash.h" | 9 #include "ash/screen_ash.h" |
10 #include "ash/shelf/shelf_layout_manager.h" | 10 #include "ash/shelf/shelf_layout_manager.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 // static | 38 // static |
39 const int DockedWindowLayoutManager::kMaxDockWidth = 360; | 39 const int DockedWindowLayoutManager::kMaxDockWidth = 360; |
40 // static | 40 // static |
41 const int DockedWindowLayoutManager::kMinDockWidth = 200; | 41 const int DockedWindowLayoutManager::kMinDockWidth = 200; |
42 // static | 42 // static |
43 const int DockedWindowLayoutManager::kMinDockGap = 2; | 43 const int DockedWindowLayoutManager::kMinDockGap = 2; |
44 // static | 44 // static |
45 const int DockedWindowLayoutManager::kIdealWidth = 250; | 45 const int DockedWindowLayoutManager::kIdealWidth = 250; |
46 const int kMinimumHeight = 250; | 46 const int kMinimumHeight = 250; |
47 const int kSlideDurationMs = 120; | 47 const int kSlideDurationMs = 120; |
48 const int kFadeDurationMs = 720; | 48 const int kFadeDurationMs = 60; |
| 49 const int kMinimizeDurationMs = 720; |
49 | 50 |
50 namespace { | 51 namespace { |
51 | 52 |
52 const SkColor kDockBackgroundColor = SkColorSetARGB(0xff, 0x10, 0x10, 0x10); | 53 const SkColor kDockBackgroundColor = SkColorSetARGB(0xff, 0x10, 0x10, 0x10); |
53 const float kDockBackgroundOpacity = 0.5f; | 54 const float kDockBackgroundOpacity = 0.5f; |
54 | 55 |
55 class DockedBackgroundWidget : public views::Widget { | 56 class DockedBackgroundWidget : public views::Widget { |
56 public: | 57 public: |
57 explicit DockedBackgroundWidget(aura::Window* container) { | 58 explicit DockedBackgroundWidget(aura::Window* container) { |
58 InitWidget(container); | 59 InitWidget(container); |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 if (child) | 648 if (child) |
648 available_room -= (GetWindowHeightCloseTo(child, 0) + kMinDockGap); | 649 available_room -= (GetWindowHeightCloseTo(child, 0) + kMinDockGap); |
649 // Use a copy of children array because a call to Minimize can change order. | 650 // Use a copy of children array because a call to Minimize can change order. |
650 aura::Window::Windows children(dock_container_->children()); | 651 aura::Window::Windows children(dock_container_->children()); |
651 aura::Window::Windows::const_reverse_iterator iter = children.rbegin(); | 652 aura::Window::Windows::const_reverse_iterator iter = children.rbegin(); |
652 while (iter != children.rend()) { | 653 while (iter != children.rend()) { |
653 aura::Window* window(*iter++); | 654 aura::Window* window(*iter++); |
654 if (window == child || !IsUsedByLayout(window)) | 655 if (window == child || !IsUsedByLayout(window)) |
655 continue; | 656 continue; |
656 int room_needed = GetWindowHeightCloseTo(window, 0) + kMinDockGap; | 657 int room_needed = GetWindowHeightCloseTo(window, 0) + kMinDockGap; |
657 if (available_room > room_needed) | 658 if (available_room > room_needed) { |
658 available_room -= room_needed; | 659 available_room -= room_needed; |
659 else | 660 } else { |
| 661 // Slow down minimizing animations. Lock duration so that it is not |
| 662 // overridden by other ScopedLayerAnimationSettings down the stack. |
| 663 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
| 664 settings.SetTransitionDuration( |
| 665 base::TimeDelta::FromMilliseconds(kMinimizeDurationMs)); |
| 666 settings.LockTransitionDuration(); |
660 wm::GetWindowState(window)->Minimize(); | 667 wm::GetWindowState(window)->Minimize(); |
| 668 } |
661 } | 669 } |
662 } | 670 } |
663 | 671 |
664 void DockedWindowLayoutManager::MinimizeDockedWindow( | 672 void DockedWindowLayoutManager::MinimizeDockedWindow( |
665 wm::WindowState* window_state) { | 673 wm::WindowState* window_state) { |
666 DCHECK(!IsPopupOrTransient(window_state->window())); | 674 DCHECK(!IsPopupOrTransient(window_state->window())); |
667 window_state->window()->Hide(); | 675 window_state->window()->Hide(); |
668 if (window_state->IsActive()) | 676 if (window_state->IsActive()) |
669 window_state->Deactivate(); | 677 window_state->Deactivate(); |
670 RecordUmaAction(DOCKED_ACTION_MINIMIZE, DOCKED_ACTION_SOURCE_UNKNOWN); | 678 RecordUmaAction(DOCKED_ACTION_MINIMIZE, DOCKED_ACTION_SOURCE_UNKNOWN); |
671 } | 679 } |
672 | 680 |
673 void DockedWindowLayoutManager::RestoreDockedWindow( | 681 void DockedWindowLayoutManager::RestoreDockedWindow( |
674 wm::WindowState* window_state) { | 682 wm::WindowState* window_state) { |
675 aura::Window* window = window_state->window(); | 683 aura::Window* window = window_state->window(); |
676 DCHECK(!IsPopupOrTransient(window)); | 684 DCHECK(!IsPopupOrTransient(window)); |
677 // Always place restored window at the top shuffling the other windows down. | 685 // Always place restored window at the bottom shuffling the other windows up. |
678 // TODO(varkha): add a separate container for docked windows to keep track | 686 // TODO(varkha): add a separate container for docked windows to keep track |
679 // of ordering. | 687 // of ordering. |
680 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow( | 688 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow( |
681 dock_container_); | 689 dock_container_); |
682 const gfx::Rect work_area = display.work_area(); | 690 const gfx::Rect work_area = display.work_area(); |
683 | 691 |
684 // Evict the window if it can no longer be docked because of its height. | 692 // Evict the window if it can no longer be docked because of its height. |
685 if (!CanDockWindow(window, SNAP_NONE)) { | 693 if (!CanDockWindow(window, SNAP_NONE)) { |
686 UndockWindow(window); | 694 UndockWindow(window); |
687 RecordUmaAction(DOCKED_ACTION_EVICT, DOCKED_ACTION_SOURCE_UNKNOWN); | 695 RecordUmaAction(DOCKED_ACTION_EVICT, DOCKED_ACTION_SOURCE_UNKNOWN); |
688 return; | 696 return; |
689 } | 697 } |
690 gfx::Rect bounds(window->bounds()); | 698 gfx::Rect bounds(window->bounds()); |
691 bounds.set_y(work_area.y() - bounds.height()); | 699 bounds.set_y(work_area.bottom()); |
692 window->SetBounds(bounds); | 700 window->SetBounds(bounds); |
693 window->Show(); | 701 window->Show(); |
694 MaybeMinimizeChildrenExcept(window); | 702 MaybeMinimizeChildrenExcept(window); |
695 RecordUmaAction(DOCKED_ACTION_RESTORE, DOCKED_ACTION_SOURCE_UNKNOWN); | 703 RecordUmaAction(DOCKED_ACTION_RESTORE, DOCKED_ACTION_SOURCE_UNKNOWN); |
696 } | 704 } |
697 | 705 |
698 void DockedWindowLayoutManager::RecordUmaAction(DockedAction action, | 706 void DockedWindowLayoutManager::RecordUmaAction(DockedAction action, |
699 DockedActionSource source) { | 707 DockedActionSource source) { |
700 if (action == DOCKED_ACTION_NONE) | 708 if (action == DOCKED_ACTION_NONE) |
701 return; | 709 return; |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( | 1063 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( |
1056 const gfx::Rect& keyboard_bounds) { | 1064 const gfx::Rect& keyboard_bounds) { |
1057 // This bounds change will have caused a change to the Shelf which does not | 1065 // This bounds change will have caused a change to the Shelf which does not |
1058 // propagate automatically to this class, so manually recalculate bounds. | 1066 // propagate automatically to this class, so manually recalculate bounds. |
1059 Relayout(); | 1067 Relayout(); |
1060 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); | 1068 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); |
1061 } | 1069 } |
1062 | 1070 |
1063 } // namespace internal | 1071 } // namespace internal |
1064 } // namespace ash | 1072 } // namespace ash |
OLD | NEW |