| 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_util.h" | 8 #include "ash/screen_util.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 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 GetWindowHeightCloseTo(win2.window(), 0); | 294 GetWindowHeightCloseTo(win2.window(), 0); |
| 295 } | 295 } |
| 296 }; | 296 }; |
| 297 | 297 |
| 298 // A functor used to sort the windows in order of their center Y position. | 298 // A functor used to sort the windows in order of their center Y position. |
| 299 // |delta| is a pre-calculated distance from the bottom of one window to the top | 299 // |delta| is a pre-calculated distance from the bottom of one window to the top |
| 300 // of the next. Its value can be positive (gap) or negative (overlap). | 300 // of the next. Its value can be positive (gap) or negative (overlap). |
| 301 // Half of |delta| is used as a transition point at which windows could ideally | 301 // Half of |delta| is used as a transition point at which windows could ideally |
| 302 // swap positions. | 302 // swap positions. |
| 303 struct CompareWindowPos { | 303 struct CompareWindowPos { |
| 304 CompareWindowPos(aura::Window* dragged_window, float delta) | 304 CompareWindowPos(aura::Window* dragged_window, |
| 305 aura::Window* docked_container, |
| 306 float delta) |
| 305 : dragged_window_(dragged_window), | 307 : dragged_window_(dragged_window), |
| 308 docked_container_(docked_container), |
| 306 delta_(delta / 2) {} | 309 delta_(delta / 2) {} |
| 307 | 310 |
| 308 bool operator()(WindowWithHeight window_with_height1, | 311 bool operator()(WindowWithHeight window_with_height1, |
| 309 WindowWithHeight window_with_height2) { | 312 WindowWithHeight window_with_height2) { |
| 310 // Use target coordinates since animations may be active when windows are | 313 // Use target coordinates since animations may be active when windows are |
| 311 // reordered. | 314 // reordered. |
| 312 aura::Window* win1(window_with_height1.window()); | 315 aura::Window* win1(window_with_height1.window()); |
| 313 aura::Window* win2(window_with_height2.window()); | 316 aura::Window* win2(window_with_height2.window()); |
| 314 gfx::Rect win1_bounds = ScreenUtil::ConvertRectToScreen( | 317 gfx::Rect win1_bounds = ScreenUtil::ConvertRectToScreen( |
| 315 win1->parent(), win1->GetTargetBounds()); | 318 docked_container_, win1->GetTargetBounds()); |
| 316 gfx::Rect win2_bounds = ScreenUtil::ConvertRectToScreen( | 319 gfx::Rect win2_bounds = ScreenUtil::ConvertRectToScreen( |
| 317 win2->parent(), win2->GetTargetBounds()); | 320 docked_container_, win2->GetTargetBounds()); |
| 318 win1_bounds.set_height(window_with_height1.height_); | 321 win1_bounds.set_height(window_with_height1.height_); |
| 319 win2_bounds.set_height(window_with_height2.height_); | 322 win2_bounds.set_height(window_with_height2.height_); |
| 320 // If one of the windows is the |dragged_window_| attempt to make an | 323 // If one of the windows is the |dragged_window_| attempt to make an |
| 321 // earlier swap between the windows than just based on their centers. | 324 // earlier swap between the windows than just based on their centers. |
| 322 // This is possible if the dragged window is at least as tall as the other | 325 // This is possible if the dragged window is at least as tall as the other |
| 323 // window. | 326 // window. |
| 324 if (win1 == dragged_window_) | 327 if (win1 == dragged_window_) |
| 325 return compare_two_windows(win1_bounds, win2_bounds); | 328 return compare_two_windows(win1_bounds, win2_bounds); |
| 326 if (win2 == dragged_window_) | 329 if (win2 == dragged_window_) |
| 327 return !compare_two_windows(win2_bounds, win1_bounds); | 330 return !compare_two_windows(win2_bounds, win1_bounds); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 347 if (result1 != result2) | 350 if (result1 != result2) |
| 348 return result1; | 351 return result1; |
| 349 | 352 |
| 350 // Otherwise it is not possible to be sure that the windows will not bounce. | 353 // Otherwise it is not possible to be sure that the windows will not bounce. |
| 351 // In this case just compare the centers. | 354 // In this case just compare the centers. |
| 352 return bounds1.CenterPoint().y() < bounds2.CenterPoint().y(); | 355 return bounds1.CenterPoint().y() < bounds2.CenterPoint().y(); |
| 353 } | 356 } |
| 354 | 357 |
| 355 private: | 358 private: |
| 356 aura::Window* dragged_window_; | 359 aura::Window* dragged_window_; |
| 360 aura::Window* docked_container_; |
| 357 float delta_; | 361 float delta_; |
| 358 }; | 362 }; |
| 359 | 363 |
| 360 } // namespace | 364 } // namespace |
| 361 | 365 |
| 362 //////////////////////////////////////////////////////////////////////////////// | 366 //////////////////////////////////////////////////////////////////////////////// |
| 363 // A class that observes shelf for bounds changes. | 367 // A class that observes shelf for bounds changes. |
| 364 class DockedWindowLayoutManager::ShelfWindowObserver : public WindowObserver { | 368 class DockedWindowLayoutManager::ShelfWindowObserver : public WindowObserver { |
| 365 public: | 369 public: |
| 366 explicit ShelfWindowObserver( | 370 explicit ShelfWindowObserver( |
| (...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 if (visible_windows->empty() || | 1152 if (visible_windows->empty() || |
| 1149 (visible_windows->size() == 1 && | 1153 (visible_windows->size() == 1 && |
| 1150 (*visible_windows)[0].window() == dragged_window_)) { | 1154 (*visible_windows)[0].window() == dragged_window_)) { |
| 1151 new_width = 0; | 1155 new_width = 0; |
| 1152 } | 1156 } |
| 1153 UpdateDockedWidth(new_width); | 1157 UpdateDockedWidth(new_width); |
| 1154 // Sort windows by their center positions and fan out overlapping | 1158 // Sort windows by their center positions and fan out overlapping |
| 1155 // windows. | 1159 // windows. |
| 1156 std::sort(visible_windows->begin(), visible_windows->end(), | 1160 std::sort(visible_windows->begin(), visible_windows->end(), |
| 1157 CompareWindowPos(is_dragged_from_dock_ ? dragged_window_ : NULL, | 1161 CompareWindowPos(is_dragged_from_dock_ ? dragged_window_ : NULL, |
| 1162 dock_container_, |
| 1158 delta)); | 1163 delta)); |
| 1159 for (std::vector<WindowWithHeight>::iterator iter = visible_windows->begin(); | 1164 for (std::vector<WindowWithHeight>::iterator iter = visible_windows->begin(); |
| 1160 iter != visible_windows->end(); ++iter) { | 1165 iter != visible_windows->end(); ++iter) { |
| 1161 aura::Window* window = iter->window(); | 1166 aura::Window* window = iter->window(); |
| 1162 gfx::Rect bounds = ScreenUtil::ConvertRectToScreen( | 1167 gfx::Rect bounds = ScreenUtil::ConvertRectToScreen( |
| 1163 window->parent(), window->GetTargetBounds()); | 1168 dock_container_, window->GetTargetBounds()); |
| 1164 // A window is extended or shrunk to be as close as possible to the ideal | 1169 // A window is extended or shrunk to be as close as possible to the ideal |
| 1165 // docked area width. Windows that were resized by a user are kept at their | 1170 // docked area width. Windows that were resized by a user are kept at their |
| 1166 // existing size. | 1171 // existing size. |
| 1167 // This also enforces the min / max restrictions on the docked area width. | 1172 // This also enforces the min / max restrictions on the docked area width. |
| 1168 bounds.set_width(GetWindowWidthCloseTo( | 1173 bounds.set_width(GetWindowWidthCloseTo( |
| 1169 window, | 1174 window, |
| 1170 wm::GetWindowState(window)->bounds_changed_by_user() ? | 1175 wm::GetWindowState(window)->bounds_changed_by_user() ? |
| 1171 bounds.width() : ideal_docked_width)); | 1176 bounds.width() : ideal_docked_width)); |
| 1172 DCHECK_LE(bounds.width(), ideal_docked_width); | 1177 DCHECK_LE(bounds.width(), ideal_docked_width); |
| 1173 | 1178 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( | 1311 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( |
| 1307 const gfx::Rect& keyboard_bounds) { | 1312 const gfx::Rect& keyboard_bounds) { |
| 1308 // This bounds change will have caused a change to the Shelf which does not | 1313 // This bounds change will have caused a change to the Shelf which does not |
| 1309 // propagate automatically to this class, so manually recalculate bounds. | 1314 // propagate automatically to this class, so manually recalculate bounds. |
| 1310 Relayout(); | 1315 Relayout(); |
| 1311 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); | 1316 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); |
| 1312 } | 1317 } |
| 1313 | 1318 |
| 1314 } // namespace internal | 1319 } // namespace internal |
| 1315 } // namespace ash | 1320 } // namespace ash |
| OLD | NEW |