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/common/wm/dock/docked_window_layout_manager.h" | 5 #include "ash/common/wm/dock/docked_window_layout_manager.h" |
6 | 6 |
| 7 #include "ash/common/shelf/shelf_constants.h" |
| 8 #include "ash/common/shelf/wm_shelf.h" |
| 9 #include "ash/common/shelf/wm_shelf_observer.h" |
7 #include "ash/common/shell_window_ids.h" | 10 #include "ash/common/shell_window_ids.h" |
8 #include "ash/common/wm/shelf/wm_shelf.h" | |
9 #include "ash/common/wm/shelf/wm_shelf_constants.h" | |
10 #include "ash/common/wm/shelf/wm_shelf_observer.h" | |
11 #include "ash/common/wm/window_animation_types.h" | 11 #include "ash/common/wm/window_animation_types.h" |
12 #include "ash/common/wm/window_parenting_utils.h" | 12 #include "ash/common/wm/window_parenting_utils.h" |
13 #include "ash/common/wm/window_resizer.h" | 13 #include "ash/common/wm/window_resizer.h" |
14 #include "ash/common/wm/window_state.h" | 14 #include "ash/common/wm/window_state.h" |
15 #include "ash/common/wm/wm_globals.h" | 15 #include "ash/common/wm/wm_globals.h" |
16 #include "ash/common/wm/wm_lookup.h" | 16 #include "ash/common/wm/wm_lookup.h" |
17 #include "ash/common/wm/wm_root_window_controller.h" | 17 #include "ash/common/wm/wm_root_window_controller.h" |
18 #include "ash/common/wm/wm_window.h" | 18 #include "ash/common/wm/wm_window.h" |
19 #include "base/auto_reset.h" | 19 #include "base/auto_reset.h" |
20 #include "base/metrics/histogram.h" | 20 #include "base/metrics/histogram.h" |
(...skipping 19 matching lines...) Expand all Loading... |
40 const int DockedWindowLayoutManager::kMinDockGap = 2; | 40 const int DockedWindowLayoutManager::kMinDockGap = 2; |
41 // static | 41 // static |
42 const int DockedWindowLayoutManager::kIdealWidth = 250; | 42 const int DockedWindowLayoutManager::kIdealWidth = 250; |
43 const int kMinimumHeight = 250; | 43 const int kMinimumHeight = 250; |
44 const int kSlideDurationMs = 120; | 44 const int kSlideDurationMs = 120; |
45 const int kFadeDurationMs = 60; | 45 const int kFadeDurationMs = 60; |
46 const int kMinimizeDurationMs = 720; | 46 const int kMinimizeDurationMs = 720; |
47 | 47 |
48 class DockedBackgroundWidget : public views::Widget, | 48 class DockedBackgroundWidget : public views::Widget, |
49 public BackgroundAnimatorDelegate, | 49 public BackgroundAnimatorDelegate, |
50 public wm::WmShelfObserver { | 50 public WmShelfObserver { |
51 public: | 51 public: |
52 explicit DockedBackgroundWidget(DockedWindowLayoutManager* manager) | 52 explicit DockedBackgroundWidget(DockedWindowLayoutManager* manager) |
53 : manager_(manager), | 53 : manager_(manager), |
54 alignment_(DOCKED_ALIGNMENT_NONE), | 54 alignment_(DOCKED_ALIGNMENT_NONE), |
55 background_animator_(this, 0, wm::kShelfBackgroundAlpha), | 55 background_animator_(this, 0, kShelfBackgroundAlpha), |
56 alpha_(0), | 56 alpha_(0), |
57 opaque_background_(ui::LAYER_SOLID_COLOR), | 57 opaque_background_(ui::LAYER_SOLID_COLOR), |
58 visible_background_type_(manager_->shelf()->GetBackgroundType()), | 58 visible_background_type_(manager_->shelf()->GetBackgroundType()), |
59 visible_background_change_type_(BACKGROUND_CHANGE_IMMEDIATE) { | 59 visible_background_change_type_(BACKGROUND_CHANGE_IMMEDIATE) { |
60 manager_->shelf()->AddObserver(this); | 60 manager_->shelf()->AddObserver(this); |
61 InitWidget(manager_->dock_container()); | 61 InitWidget(manager_->dock_container()); |
62 } | 62 } |
63 | 63 |
64 ~DockedBackgroundWidget() override { | 64 ~DockedBackgroundWidget() override { |
65 manager_->shelf()->RemoveObserver(this); | 65 manager_->shelf()->RemoveObserver(this); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 local_window_bounds.height(), false, paint); | 104 local_window_bounds.height(), false, paint); |
105 } | 105 } |
106 | 106 |
107 // BackgroundAnimatorDelegate: | 107 // BackgroundAnimatorDelegate: |
108 void UpdateBackground(int alpha) override { | 108 void UpdateBackground(int alpha) override { |
109 alpha_ = alpha; | 109 alpha_ = alpha; |
110 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); | 110 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); |
111 } | 111 } |
112 | 112 |
113 // ShelfLayoutManagerObserver: | 113 // ShelfLayoutManagerObserver: |
114 void OnBackgroundUpdated(wm::ShelfBackgroundType background_type, | 114 void OnBackgroundUpdated(ShelfBackgroundType background_type, |
115 BackgroundAnimatorChangeType change_type) override { | 115 BackgroundAnimatorChangeType change_type) override { |
116 // Sets the background type. Starts an animation to transition to | 116 // Sets the background type. Starts an animation to transition to |
117 // |background_type| if the widget is visible. If the widget is not visible, | 117 // |background_type| if the widget is visible. If the widget is not visible, |
118 // the animation is postponed till the widget becomes visible. | 118 // the animation is postponed till the widget becomes visible. |
119 visible_background_type_ = background_type; | 119 visible_background_type_ = background_type; |
120 visible_background_change_type_ = change_type; | 120 visible_background_change_type_ = change_type; |
121 if (IsVisible()) | 121 if (IsVisible()) |
122 UpdateBackground(); | 122 UpdateBackground(); |
123 } | 123 } |
124 | 124 |
(...skipping 27 matching lines...) Expand all Loading... |
152 // This background should be explicitly stacked below any windows already in | 152 // This background should be explicitly stacked below any windows already in |
153 // the dock, otherwise the z-order is set by the order in which windows were | 153 // the dock, otherwise the z-order is set by the order in which windows were |
154 // added to the container, and UpdateStacking only manages user windows, not | 154 // added to the container, and UpdateStacking only manages user windows, not |
155 // the background widget. | 155 // the background widget. |
156 parent->StackChildAtBottom(wm_window); | 156 parent->StackChildAtBottom(wm_window); |
157 } | 157 } |
158 | 158 |
159 // Transitions to |visible_background_type_| if the widget is visible and to | 159 // Transitions to |visible_background_type_| if the widget is visible and to |
160 // SHELF_BACKGROUND_DEFAULT if it is not. | 160 // SHELF_BACKGROUND_DEFAULT if it is not. |
161 void UpdateBackground() { | 161 void UpdateBackground() { |
162 wm::ShelfBackgroundType background_type = | 162 ShelfBackgroundType background_type = |
163 IsVisible() ? visible_background_type_ : wm::SHELF_BACKGROUND_DEFAULT; | 163 IsVisible() ? visible_background_type_ : SHELF_BACKGROUND_DEFAULT; |
164 BackgroundAnimatorChangeType change_type = | 164 BackgroundAnimatorChangeType change_type = |
165 IsVisible() ? visible_background_change_type_ | 165 IsVisible() ? visible_background_change_type_ |
166 : BACKGROUND_CHANGE_IMMEDIATE; | 166 : BACKGROUND_CHANGE_IMMEDIATE; |
167 | 167 |
168 float target_opacity = | 168 float target_opacity = |
169 (background_type == wm::SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f; | 169 (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f; |
170 std::unique_ptr<ui::ScopedLayerAnimationSettings> | 170 std::unique_ptr<ui::ScopedLayerAnimationSettings> |
171 opaque_background_animation; | 171 opaque_background_animation; |
172 if (change_type != BACKGROUND_CHANGE_IMMEDIATE) { | 172 if (change_type != BACKGROUND_CHANGE_IMMEDIATE) { |
173 opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings( | 173 opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings( |
174 opaque_background_.GetAnimator())); | 174 opaque_background_.GetAnimator())); |
175 opaque_background_animation->SetTransitionDuration( | 175 opaque_background_animation->SetTransitionDuration( |
176 base::TimeDelta::FromMilliseconds(wm::kTimeToSwitchBackgroundMs)); | 176 base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs)); |
177 } | 177 } |
178 opaque_background_.SetOpacity(target_opacity); | 178 opaque_background_.SetOpacity(target_opacity); |
179 | 179 |
180 // TODO(varkha): use ui::Layer on both opaque_background and normal | 180 // TODO(varkha): use ui::Layer on both opaque_background and normal |
181 // background retire background_animator_ at all. It would be simpler. | 181 // background retire background_animator_ at all. It would be simpler. |
182 // See also ShelfWidget::SetPaintsBackground. | 182 // See also ShelfWidget::SetPaintsBackground. |
183 background_animator_.SetPaintsBackground( | 183 background_animator_.SetPaintsBackground( |
184 background_type != wm::SHELF_BACKGROUND_DEFAULT, change_type); | 184 background_type != SHELF_BACKGROUND_DEFAULT, change_type); |
185 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); | 185 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); |
186 } | 186 } |
187 | 187 |
188 DockedWindowLayoutManager* manager_; | 188 DockedWindowLayoutManager* manager_; |
189 | 189 |
190 DockedAlignment alignment_; | 190 DockedAlignment alignment_; |
191 | 191 |
192 // The animator for the background transitions. | 192 // The animator for the background transitions. |
193 BackgroundAnimator background_animator_; | 193 BackgroundAnimator background_animator_; |
194 | 194 |
195 // The alpha to use for drawing image assets covering the docked background. | 195 // The alpha to use for drawing image assets covering the docked background. |
196 int alpha_; | 196 int alpha_; |
197 | 197 |
198 // Solid black background that can be made fully opaque. | 198 // Solid black background that can be made fully opaque. |
199 ui::Layer opaque_background_; | 199 ui::Layer opaque_background_; |
200 | 200 |
201 // Backgrounds created from shelf background by 90 or 270 degree rotation. | 201 // Backgrounds created from shelf background by 90 or 270 degree rotation. |
202 gfx::ImageSkia shelf_background_left_; | 202 gfx::ImageSkia shelf_background_left_; |
203 gfx::ImageSkia shelf_background_right_; | 203 gfx::ImageSkia shelf_background_right_; |
204 | 204 |
205 // The background type to use when the widget is visible. When not visible, | 205 // The background type to use when the widget is visible. When not visible, |
206 // the widget uses SHELF_BACKGROUND_DEFAULT. | 206 // the widget uses SHELF_BACKGROUND_DEFAULT. |
207 wm::ShelfBackgroundType visible_background_type_; | 207 ShelfBackgroundType visible_background_type_; |
208 | 208 |
209 // Whether the widget should animate to |visible_background_type_|. | 209 // Whether the widget should animate to |visible_background_type_|. |
210 BackgroundAnimatorChangeType visible_background_change_type_; | 210 BackgroundAnimatorChangeType visible_background_change_type_; |
211 | 211 |
212 DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget); | 212 DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget); |
213 }; | 213 }; |
214 | 214 |
215 namespace { | 215 namespace { |
216 | 216 |
217 // Returns true if a window is a popup or a transient child. | 217 // Returns true if a window is a popup or a transient child. |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 // count limit so do it here. | 533 // count limit so do it here. |
534 MaybeMinimizeChildrenExcept(dragged_window_); | 534 MaybeMinimizeChildrenExcept(dragged_window_); |
535 } | 535 } |
536 dragged_window_ = nullptr; | 536 dragged_window_ = nullptr; |
537 dragged_bounds_ = gfx::Rect(); | 537 dragged_bounds_ = gfx::Rect(); |
538 Relayout(); | 538 Relayout(); |
539 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); | 539 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); |
540 RecordUmaAction(action, source); | 540 RecordUmaAction(action, source); |
541 } | 541 } |
542 | 542 |
543 void DockedWindowLayoutManager::SetShelf(wm::WmShelf* shelf) { | 543 void DockedWindowLayoutManager::SetShelf(WmShelf* shelf) { |
544 DCHECK(!shelf_); | 544 DCHECK(!shelf_); |
545 shelf_ = shelf; | 545 shelf_ = shelf; |
546 shelf_observer_.reset(new ShelfWindowObserver(this)); | 546 shelf_observer_.reset(new ShelfWindowObserver(this)); |
547 } | 547 } |
548 | 548 |
549 DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow( | 549 DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow( |
550 const wm::WmWindow* window) const { | 550 const wm::WmWindow* window) const { |
551 const gfx::Rect& bounds(window->GetBoundsInScreen()); | 551 const gfx::Rect& bounds(window->GetBoundsInScreen()); |
552 | 552 |
553 // Test overlap with an existing docked area first. | 553 // Test overlap with an existing docked area first. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 if (desired_alignment != DOCKED_ALIGNMENT_NONE && | 621 if (desired_alignment != DOCKED_ALIGNMENT_NONE && |
622 alignment != DOCKED_ALIGNMENT_NONE && alignment != desired_alignment) { | 622 alignment != DOCKED_ALIGNMENT_NONE && alignment != desired_alignment) { |
623 return false; | 623 return false; |
624 } | 624 } |
625 // Do not allow docking on the same side as shelf. | 625 // Do not allow docking on the same side as shelf. |
626 return IsDockedAlignmentValid(desired_alignment); | 626 return IsDockedAlignmentValid(desired_alignment); |
627 } | 627 } |
628 | 628 |
629 bool DockedWindowLayoutManager::IsDockedAlignmentValid( | 629 bool DockedWindowLayoutManager::IsDockedAlignmentValid( |
630 DockedAlignment alignment) const { | 630 DockedAlignment alignment) const { |
631 wm::ShelfAlignment shelf_alignment = | 631 ShelfAlignment shelf_alignment = |
632 shelf_ ? shelf_->GetAlignment() : wm::SHELF_ALIGNMENT_BOTTOM; | 632 shelf_ ? shelf_->GetAlignment() : SHELF_ALIGNMENT_BOTTOM; |
633 if ((alignment == DOCKED_ALIGNMENT_LEFT && | 633 if ((alignment == DOCKED_ALIGNMENT_LEFT && |
634 shelf_alignment == wm::SHELF_ALIGNMENT_LEFT) || | 634 shelf_alignment == SHELF_ALIGNMENT_LEFT) || |
635 (alignment == DOCKED_ALIGNMENT_RIGHT && | 635 (alignment == DOCKED_ALIGNMENT_RIGHT && |
636 shelf_alignment == wm::SHELF_ALIGNMENT_RIGHT)) { | 636 shelf_alignment == SHELF_ALIGNMENT_RIGHT)) { |
637 return false; | 637 return false; |
638 } | 638 } |
639 return true; | 639 return true; |
640 } | 640 } |
641 | 641 |
642 void DockedWindowLayoutManager::MaybeSetDesiredDockedAlignment( | 642 void DockedWindowLayoutManager::MaybeSetDesiredDockedAlignment( |
643 DockedAlignment alignment) { | 643 DockedAlignment alignment) { |
644 // If the requested alignment is |NONE| or there are no | 644 // If the requested alignment is |NONE| or there are no |
645 // docked windows return early as we can't change whether there is a | 645 // docked windows return early as we can't change whether there is a |
646 // dock or not. If the requested alignment is the same as the current | 646 // dock or not. If the requested alignment is the same as the current |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 Relayout(); | 789 Relayout(); |
790 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); | 790 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); |
791 } | 791 } |
792 | 792 |
793 void DockedWindowLayoutManager::OnShelfAlignmentChanged() { | 793 void DockedWindowLayoutManager::OnShelfAlignmentChanged() { |
794 if (!shelf_ || alignment_ == DOCKED_ALIGNMENT_NONE) | 794 if (!shelf_ || alignment_ == DOCKED_ALIGNMENT_NONE) |
795 return; | 795 return; |
796 | 796 |
797 // Do not allow shelf and dock on the same side. Switch side that | 797 // Do not allow shelf and dock on the same side. Switch side that |
798 // the dock is attached to and move all dock windows to that new side. | 798 // the dock is attached to and move all dock windows to that new side. |
799 wm::ShelfAlignment shelf_alignment = shelf_->GetAlignment(); | 799 ShelfAlignment shelf_alignment = shelf_->GetAlignment(); |
800 if (alignment_ == DOCKED_ALIGNMENT_LEFT && | 800 if (alignment_ == DOCKED_ALIGNMENT_LEFT && |
801 shelf_alignment == wm::SHELF_ALIGNMENT_LEFT) { | 801 shelf_alignment == SHELF_ALIGNMENT_LEFT) { |
802 alignment_ = DOCKED_ALIGNMENT_RIGHT; | 802 alignment_ = DOCKED_ALIGNMENT_RIGHT; |
803 } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT && | 803 } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT && |
804 shelf_alignment == wm::SHELF_ALIGNMENT_RIGHT) { | 804 shelf_alignment == SHELF_ALIGNMENT_RIGHT) { |
805 alignment_ = DOCKED_ALIGNMENT_LEFT; | 805 alignment_ = DOCKED_ALIGNMENT_LEFT; |
806 } | 806 } |
807 Relayout(); | 807 Relayout(); |
808 UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED); | 808 UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED); |
809 } | 809 } |
810 | 810 |
811 ///////////////////////////////////////////////////////////////////////////// | 811 ///////////////////////////////////////////////////////////////////////////// |
812 // DockedWindowLayoutManager, WindowStateObserver implementation: | 812 // DockedWindowLayoutManager, WindowStateObserver implementation: |
813 | 813 |
814 void DockedWindowLayoutManager::OnPreWindowStateTypeChange( | 814 void DockedWindowLayoutManager::OnPreWindowStateTypeChange( |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1320 | 1320 |
1321 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( | 1321 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( |
1322 const gfx::Rect& keyboard_bounds) { | 1322 const gfx::Rect& keyboard_bounds) { |
1323 // This bounds change will have caused a change to the Shelf which does not | 1323 // This bounds change will have caused a change to the Shelf which does not |
1324 // propagate automatically to this class, so manually recalculate bounds. | 1324 // propagate automatically to this class, so manually recalculate bounds. |
1325 Relayout(); | 1325 Relayout(); |
1326 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); | 1326 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); |
1327 } | 1327 } |
1328 | 1328 |
1329 } // namespace ash | 1329 } // namespace ash |
OLD | NEW |