Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: ash/common/wm/dock/docked_window_layout_manager.cc

Issue 2036353002: mash: Move ash/common/wm/shelf to ash/common/shelf (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase again Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_lookup.h" 15 #include "ash/common/wm_lookup.h"
16 #include "ash/common/wm_root_window_controller.h" 16 #include "ash/common/wm_root_window_controller.h"
17 #include "ash/common/wm_shell.h" 17 #include "ash/common/wm_shell.h"
18 #include "ash/common/wm_window.h" 18 #include "ash/common/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
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
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
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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 // count limit so do it here. 530 // count limit so do it here.
531 MaybeMinimizeChildrenExcept(dragged_window_); 531 MaybeMinimizeChildrenExcept(dragged_window_);
532 } 532 }
533 dragged_window_ = nullptr; 533 dragged_window_ = nullptr;
534 dragged_bounds_ = gfx::Rect(); 534 dragged_bounds_ = gfx::Rect();
535 Relayout(); 535 Relayout();
536 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); 536 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED);
537 RecordUmaAction(action, source); 537 RecordUmaAction(action, source);
538 } 538 }
539 539
540 void DockedWindowLayoutManager::SetShelf(wm::WmShelf* shelf) { 540 void DockedWindowLayoutManager::SetShelf(WmShelf* shelf) {
541 DCHECK(!shelf_); 541 DCHECK(!shelf_);
542 shelf_ = shelf; 542 shelf_ = shelf;
543 shelf_observer_.reset(new ShelfWindowObserver(this)); 543 shelf_observer_.reset(new ShelfWindowObserver(this));
544 } 544 }
545 545
546 DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow( 546 DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow(
547 const WmWindow* window) const { 547 const WmWindow* window) const {
548 const gfx::Rect& bounds(window->GetBoundsInScreen()); 548 const gfx::Rect& bounds(window->GetBoundsInScreen());
549 549
550 // Test overlap with an existing docked area first. 550 // Test overlap with an existing docked area first.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 if (desired_alignment != DOCKED_ALIGNMENT_NONE && 618 if (desired_alignment != DOCKED_ALIGNMENT_NONE &&
619 alignment != DOCKED_ALIGNMENT_NONE && alignment != desired_alignment) { 619 alignment != DOCKED_ALIGNMENT_NONE && alignment != desired_alignment) {
620 return false; 620 return false;
621 } 621 }
622 // Do not allow docking on the same side as shelf. 622 // Do not allow docking on the same side as shelf.
623 return IsDockedAlignmentValid(desired_alignment); 623 return IsDockedAlignmentValid(desired_alignment);
624 } 624 }
625 625
626 bool DockedWindowLayoutManager::IsDockedAlignmentValid( 626 bool DockedWindowLayoutManager::IsDockedAlignmentValid(
627 DockedAlignment alignment) const { 627 DockedAlignment alignment) const {
628 wm::ShelfAlignment shelf_alignment = 628 ShelfAlignment shelf_alignment =
629 shelf_ ? shelf_->GetAlignment() : wm::SHELF_ALIGNMENT_BOTTOM; 629 shelf_ ? shelf_->GetAlignment() : SHELF_ALIGNMENT_BOTTOM;
630 if ((alignment == DOCKED_ALIGNMENT_LEFT && 630 if ((alignment == DOCKED_ALIGNMENT_LEFT &&
631 shelf_alignment == wm::SHELF_ALIGNMENT_LEFT) || 631 shelf_alignment == SHELF_ALIGNMENT_LEFT) ||
632 (alignment == DOCKED_ALIGNMENT_RIGHT && 632 (alignment == DOCKED_ALIGNMENT_RIGHT &&
633 shelf_alignment == wm::SHELF_ALIGNMENT_RIGHT)) { 633 shelf_alignment == SHELF_ALIGNMENT_RIGHT)) {
634 return false; 634 return false;
635 } 635 }
636 return true; 636 return true;
637 } 637 }
638 638
639 void DockedWindowLayoutManager::MaybeSetDesiredDockedAlignment( 639 void DockedWindowLayoutManager::MaybeSetDesiredDockedAlignment(
640 DockedAlignment alignment) { 640 DockedAlignment alignment) {
641 // If the requested alignment is |NONE| or there are no 641 // If the requested alignment is |NONE| or there are no
642 // docked windows return early as we can't change whether there is a 642 // docked windows return early as we can't change whether there is a
643 // dock or not. If the requested alignment is the same as the current 643 // dock or not. If the requested alignment is the same as the current
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 Relayout(); 785 Relayout();
786 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); 786 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED);
787 } 787 }
788 788
789 void DockedWindowLayoutManager::OnShelfAlignmentChanged() { 789 void DockedWindowLayoutManager::OnShelfAlignmentChanged() {
790 if (!shelf_ || alignment_ == DOCKED_ALIGNMENT_NONE) 790 if (!shelf_ || alignment_ == DOCKED_ALIGNMENT_NONE)
791 return; 791 return;
792 792
793 // Do not allow shelf and dock on the same side. Switch side that 793 // Do not allow shelf and dock on the same side. Switch side that
794 // the dock is attached to and move all dock windows to that new side. 794 // the dock is attached to and move all dock windows to that new side.
795 wm::ShelfAlignment shelf_alignment = shelf_->GetAlignment(); 795 ShelfAlignment shelf_alignment = shelf_->GetAlignment();
796 if (alignment_ == DOCKED_ALIGNMENT_LEFT && 796 if (alignment_ == DOCKED_ALIGNMENT_LEFT &&
797 shelf_alignment == wm::SHELF_ALIGNMENT_LEFT) { 797 shelf_alignment == SHELF_ALIGNMENT_LEFT) {
798 alignment_ = DOCKED_ALIGNMENT_RIGHT; 798 alignment_ = DOCKED_ALIGNMENT_RIGHT;
799 } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT && 799 } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT &&
800 shelf_alignment == wm::SHELF_ALIGNMENT_RIGHT) { 800 shelf_alignment == SHELF_ALIGNMENT_RIGHT) {
801 alignment_ = DOCKED_ALIGNMENT_LEFT; 801 alignment_ = DOCKED_ALIGNMENT_LEFT;
802 } 802 }
803 Relayout(); 803 Relayout();
804 UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED); 804 UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED);
805 } 805 }
806 806
807 ///////////////////////////////////////////////////////////////////////////// 807 /////////////////////////////////////////////////////////////////////////////
808 // DockedWindowLayoutManager, WindowStateObserver implementation: 808 // DockedWindowLayoutManager, WindowStateObserver implementation:
809 809
810 void DockedWindowLayoutManager::OnPreWindowStateTypeChange( 810 void DockedWindowLayoutManager::OnPreWindowStateTypeChange(
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 1313
1314 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( 1314 void DockedWindowLayoutManager::OnKeyboardBoundsChanging(
1315 const gfx::Rect& keyboard_bounds) { 1315 const gfx::Rect& keyboard_bounds) {
1316 // This bounds change will have caused a change to the Shelf which does not 1316 // This bounds change will have caused a change to the Shelf which does not
1317 // propagate automatically to this class, so manually recalculate bounds. 1317 // propagate automatically to this class, so manually recalculate bounds.
1318 Relayout(); 1318 Relayout();
1319 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); 1319 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING);
1320 } 1320 }
1321 1321
1322 } // namespace ash 1322 } // namespace ash
OLDNEW
« no previous file with comments | « ash/common/wm/dock/docked_window_layout_manager.h ('k') | ash/common/wm/panels/panel_layout_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698