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

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

Issue 141053002: Avoids updating dock alignment when drag is cancelled (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoids updating dock alignment when drag is cancelled (comments) Created 6 years, 11 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
« no previous file with comments | « no previous file | ash/wm/dock/docked_window_resizer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 void DockedWindowLayoutManager::StartDragging(aura::Window* window) { 457 void DockedWindowLayoutManager::StartDragging(aura::Window* window) {
458 DCHECK(!dragged_window_); 458 DCHECK(!dragged_window_);
459 dragged_window_ = window; 459 dragged_window_ = window;
460 DCHECK(!IsPopupOrTransient(window)); 460 DCHECK(!IsPopupOrTransient(window));
461 // Start observing a window unless it is docked container's child in which 461 // Start observing a window unless it is docked container's child in which
462 // case it is already observed. 462 // case it is already observed.
463 wm::WindowState* dragged_state = wm::GetWindowState(dragged_window_); 463 wm::WindowState* dragged_state = wm::GetWindowState(dragged_window_);
464 if (dragged_window_->parent() != dock_container_) { 464 if (dragged_window_->parent() != dock_container_) {
465 dragged_window_->AddObserver(this); 465 dragged_window_->AddObserver(this);
466 dragged_state->AddObserver(this); 466 dragged_state->AddObserver(this);
467 } else if (!IsAnyWindowDocked() &&
468 dragged_state->drag_details() &&
469 !(dragged_state->drag_details()->bounds_change &
470 WindowResizer::kBoundsChange_Resizes)) {
471 // If there are no other docked windows clear alignment when a docked window
472 // is moved (but not when it is resized or the window could get undocked
473 // when resized away from the edge while docked).
474 alignment_ = DOCKED_ALIGNMENT_NONE;
467 } 475 }
468 is_dragged_from_dock_ = window->parent() == dock_container_; 476 is_dragged_from_dock_ = window->parent() == dock_container_;
469 DCHECK(!is_dragged_window_docked_); 477 DCHECK(!is_dragged_window_docked_);
470 478
471 // Resize all windows that are flush with the dock edge together if one of 479 // Resize all windows that are flush with the dock edge together if one of
472 // them gets resized. 480 // them gets resized.
473 if (dragged_window_->bounds().width() == docked_width_ && 481 if (dragged_window_->bounds().width() == docked_width_ &&
474 (dragged_state->drag_details()->bounds_change & 482 (dragged_state->drag_details()->bounds_change &
475 WindowResizer::kBoundsChange_Resizes) && 483 WindowResizer::kBoundsChange_Resizes) &&
476 (dragged_state->drag_details()->size_change_direction & 484 (dragged_state->drag_details()->size_change_direction &
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 // case it needs to keep being observed after the drag completes. 519 // case it needs to keep being observed after the drag completes.
512 if (dragged_window_->parent() != dock_container_) { 520 if (dragged_window_->parent() != dock_container_) {
513 dragged_window_->RemoveObserver(this); 521 dragged_window_->RemoveObserver(this);
514 wm::GetWindowState(dragged_window_)->RemoveObserver(this); 522 wm::GetWindowState(dragged_window_)->RemoveObserver(this);
515 if (last_active_window_ == dragged_window_) 523 if (last_active_window_ == dragged_window_)
516 last_active_window_ = NULL; 524 last_active_window_ = NULL;
517 525
518 views::corewm::SetWindowShowAnimationDuration(dragged_window_, 526 views::corewm::SetWindowShowAnimationDuration(dragged_window_,
519 base::TimeDelta()); 527 base::TimeDelta());
520 } else { 528 } else {
529 // If this is the first window that got docked by a move update alignment.
530 if (alignment_ == DOCKED_ALIGNMENT_NONE) {
531 alignment_ = GetAlignmentOfWindow(dragged_window_);
532 DCHECK(action == DOCKED_ACTION_NONE ||
533 alignment_ != DOCKED_ALIGNMENT_NONE);
534 }
521 // A window is no longer dragged and is a child. 535 // A window is no longer dragged and is a child.
522 // When a window becomes a child at drag start this is 536 // When a window becomes a child at drag start this is
523 // the only opportunity we will have to enforce a window 537 // the only opportunity we will have to enforce a window
524 // count limit so do it here. 538 // count limit so do it here.
525 MaybeMinimizeChildrenExcept(dragged_window_); 539 MaybeMinimizeChildrenExcept(dragged_window_);
526 540
527 views::corewm::SetWindowShowAnimationDuration(dragged_window_, 541 views::corewm::SetWindowShowAnimationDuration(dragged_window_,
528 base::TimeDelta::FromMilliseconds(kFadeDurationMs)); 542 base::TimeDelta::FromMilliseconds(kFadeDurationMs));
529 } 543 }
530 dragged_window_ = NULL; 544 dragged_window_ = NULL;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 // Dragged windows are already observed by StartDragging and do not change 664 // Dragged windows are already observed by StartDragging and do not change
651 // docked alignment during the drag. 665 // docked alignment during the drag.
652 if (child == dragged_window_) 666 if (child == dragged_window_)
653 return; 667 return;
654 // If this is the first window getting docked - update alignment. 668 // If this is the first window getting docked - update alignment.
655 // TODO(oshima|varkha): A window can be added without proper bounds when 669 // TODO(oshima|varkha): A window can be added without proper bounds when
656 // window is moved to another display via API or due to display configuration 670 // window is moved to another display via API or due to display configuration
657 // change, so the the alignment may not be valid. 671 // change, so the the alignment may not be valid.
658 if (alignment_ == DOCKED_ALIGNMENT_NONE) { 672 if (alignment_ == DOCKED_ALIGNMENT_NONE) {
659 alignment_ = GetAlignmentOfWindow(child); 673 alignment_ = GetAlignmentOfWindow(child);
660 DCHECK(alignment_ != DOCKED_ALIGNMENT_NONE); 674 DCHECK_NE(DOCKED_ALIGNMENT_NONE, alignment_);
661 } 675 }
662 MaybeMinimizeChildrenExcept(child); 676 MaybeMinimizeChildrenExcept(child);
663 child->AddObserver(this); 677 child->AddObserver(this);
664 wm::GetWindowState(child)->AddObserver(this); 678 wm::GetWindowState(child)->AddObserver(this);
665 Relayout(); 679 Relayout();
666 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); 680 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED);
667 views::corewm::SetWindowShowAnimationDuration(child, 681 views::corewm::SetWindowShowAnimationDuration(child,
668 base::TimeDelta::FromMilliseconds(kFadeDurationMs)); 682 base::TimeDelta::FromMilliseconds(kFadeDurationMs));
669 } 683 }
670 684
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 const gfx::Rect& new_bounds) { 837 const gfx::Rect& new_bounds) {
824 // Only relayout if the dragged window would get docked. 838 // Only relayout if the dragged window would get docked.
825 if (window == dragged_window_ && is_dragged_window_docked_) 839 if (window == dragged_window_ && is_dragged_window_docked_)
826 Relayout(); 840 Relayout();
827 } 841 }
828 842
829 void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) { 843 void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) {
830 if (dragged_window_ == window) { 844 if (dragged_window_ == window) {
831 FinishDragging(DOCKED_ACTION_NONE, DOCKED_ACTION_SOURCE_UNKNOWN); 845 FinishDragging(DOCKED_ACTION_NONE, DOCKED_ACTION_SOURCE_UNKNOWN);
832 DCHECK(!dragged_window_); 846 DCHECK(!dragged_window_);
833 DCHECK (!is_dragged_window_docked_); 847 DCHECK(!is_dragged_window_docked_);
834 } 848 }
835 if (window == last_active_window_) 849 if (window == last_active_window_)
836 last_active_window_ = NULL; 850 last_active_window_ = NULL;
837 RecordUmaAction(DOCKED_ACTION_CLOSE, DOCKED_ACTION_SOURCE_UNKNOWN); 851 RecordUmaAction(DOCKED_ACTION_CLOSE, DOCKED_ACTION_SOURCE_UNKNOWN);
838 } 852 }
839 853
840 854
841 //////////////////////////////////////////////////////////////////////////////// 855 ////////////////////////////////////////////////////////////////////////////////
842 // DockedWindowLayoutManager, aura::client::ActivationChangeObserver 856 // DockedWindowLayoutManager, aura::client::ActivationChangeObserver
843 // implementation: 857 // implementation:
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 void DockedWindowLayoutManager::UpdateDockedWidth(int width) { 992 void DockedWindowLayoutManager::UpdateDockedWidth(int width) {
979 if (docked_width_ == width) 993 if (docked_width_ == width)
980 return; 994 return;
981 docked_width_ = width; 995 docked_width_ = width;
982 UMA_HISTOGRAM_COUNTS_10000("Ash.Dock.Width", docked_width_); 996 UMA_HISTOGRAM_COUNTS_10000("Ash.Dock.Width", docked_width_);
983 } 997 }
984 998
985 void DockedWindowLayoutManager::OnDraggedWindowDocked(aura::Window* window) { 999 void DockedWindowLayoutManager::OnDraggedWindowDocked(aura::Window* window) {
986 DCHECK(!is_dragged_window_docked_); 1000 DCHECK(!is_dragged_window_docked_);
987 is_dragged_window_docked_ = true; 1001 is_dragged_window_docked_ = true;
988
989 // If there are no other docked windows update alignment when the window is
990 // moved.
991 if (!IsAnyWindowDocked() &&
992 wm::GetWindowState(dragged_window_)->drag_details() &&
993 !(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change &
994 WindowResizer::kBoundsChange_Resizes)) {
995 alignment_ = DOCKED_ALIGNMENT_NONE;
996 }
997 } 1002 }
998 1003
999 void DockedWindowLayoutManager::OnDraggedWindowUndocked() { 1004 void DockedWindowLayoutManager::OnDraggedWindowUndocked() {
1000 // If this is the first window getting docked by moving it - update alignment.
1001 if (!IsAnyWindowDocked() &&
1002 wm::GetWindowState(dragged_window_)->drag_details() &&
1003 !(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change &
1004 WindowResizer::kBoundsChange_Resizes)) {
1005 alignment_ = GetAlignmentOfWindow(dragged_window_);
1006 }
1007 DCHECK (is_dragged_window_docked_); 1005 DCHECK (is_dragged_window_docked_);
1008 is_dragged_window_docked_ = false; 1006 is_dragged_window_docked_ = false;
1009 } 1007 }
1010 1008
1011 bool DockedWindowLayoutManager::IsAnyWindowDocked() { 1009 bool DockedWindowLayoutManager::IsAnyWindowDocked() {
1012 return CalculateAlignment() != DOCKED_ALIGNMENT_NONE; 1010 return CalculateAlignment() != DOCKED_ALIGNMENT_NONE;
1013 } 1011 }
1014 1012
1015 void DockedWindowLayoutManager::Relayout() { 1013 void DockedWindowLayoutManager::Relayout() {
1016 if (in_layout_) 1014 if (in_layout_)
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1305 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( 1303 void DockedWindowLayoutManager::OnKeyboardBoundsChanging(
1306 const gfx::Rect& keyboard_bounds) { 1304 const gfx::Rect& keyboard_bounds) {
1307 // This bounds change will have caused a change to the Shelf which does not 1305 // This bounds change will have caused a change to the Shelf which does not
1308 // propagate automatically to this class, so manually recalculate bounds. 1306 // propagate automatically to this class, so manually recalculate bounds.
1309 Relayout(); 1307 Relayout();
1310 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); 1308 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING);
1311 } 1309 }
1312 1310
1313 } // namespace internal 1311 } // namespace internal
1314 } // namespace ash 1312 } // namespace ash
OLDNEW
« no previous file with comments | « no previous file | ash/wm/dock/docked_window_resizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698