| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/panels/panel_layout_manager.h" | 5 #include "ash/wm/panels/panel_layout_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "third_party/skia/include/core/SkColor.h" | 26 #include "third_party/skia/include/core/SkColor.h" |
| 27 #include "third_party/skia/include/core/SkPath.h" | 27 #include "third_party/skia/include/core/SkPath.h" |
| 28 #include "ui/aura/client/window_parenting_client.h" | 28 #include "ui/aura/client/window_parenting_client.h" |
| 29 #include "ui/aura/window_delegate.h" | 29 #include "ui/aura/window_delegate.h" |
| 30 #include "ui/compositor/scoped_layer_animation_settings.h" | 30 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 31 #include "ui/gfx/canvas.h" | 31 #include "ui/gfx/canvas.h" |
| 32 #include "ui/gfx/geometry/rect.h" | 32 #include "ui/gfx/geometry/rect.h" |
| 33 #include "ui/gfx/geometry/vector2d.h" | 33 #include "ui/gfx/geometry/vector2d.h" |
| 34 #include "ui/views/background.h" | 34 #include "ui/views/background.h" |
| 35 #include "ui/views/widget/widget.h" | 35 #include "ui/views/widget/widget.h" |
| 36 #include "ui/wm/core/window_util.h" |
| 36 #include "ui/wm/public/activation_client.h" | 37 #include "ui/wm/public/activation_client.h" |
| 37 | 38 |
| 38 using aura::Window; | 39 using aura::Window; |
| 39 | 40 |
| 40 namespace ash { | 41 namespace ash { |
| 41 namespace { | 42 namespace { |
| 42 | 43 |
| 43 const int kPanelIdealSpacing = 4; | 44 const int kPanelIdealSpacing = 4; |
| 44 | 45 |
| 45 const float kMaxHeightFactor = .80f; | 46 const float kMaxHeightFactor = .80f; |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 // PanelLayoutManager, WindowStateObserver implementation: | 482 // PanelLayoutManager, WindowStateObserver implementation: |
| 482 | 483 |
| 483 void PanelLayoutManager::OnPostWindowStateTypeChange( | 484 void PanelLayoutManager::OnPostWindowStateTypeChange( |
| 484 wm::WindowState* window_state, | 485 wm::WindowState* window_state, |
| 485 wm::WindowStateType old_type) { | 486 wm::WindowStateType old_type) { |
| 486 // If the shelf is currently hidden then windows will not actually be shown | 487 // If the shelf is currently hidden then windows will not actually be shown |
| 487 // but the set to restore when the shelf becomes visible is updated. | 488 // but the set to restore when the shelf becomes visible is updated. |
| 488 if (restore_windows_on_shelf_visible_) { | 489 if (restore_windows_on_shelf_visible_) { |
| 489 if (window_state->IsMinimized()) { | 490 if (window_state->IsMinimized()) { |
| 490 MinimizePanel(window_state->window()); | 491 MinimizePanel(window_state->window()); |
| 491 restore_windows_on_shelf_visible_->Remove( | 492 restore_windows_on_shelf_visible_->Remove(window_state->window()); |
| 492 window_state->window()->aura_window()); | |
| 493 } else { | 493 } else { |
| 494 restore_windows_on_shelf_visible_->Add( | 494 restore_windows_on_shelf_visible_->Add(window_state->window()); |
| 495 window_state->window()->aura_window()); | |
| 496 } | 495 } |
| 497 return; | 496 return; |
| 498 } | 497 } |
| 499 | 498 |
| 500 if (window_state->IsMinimized()) | 499 if (window_state->IsMinimized()) |
| 501 MinimizePanel(window_state->window()); | 500 MinimizePanel(window_state->window()); |
| 502 else | 501 else |
| 503 RestorePanel(window_state->window()); | 502 RestorePanel(window_state->window()); |
| 504 } | 503 } |
| 505 | 504 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 533 ShelfVisibilityState new_state) { | 532 ShelfVisibilityState new_state) { |
| 534 // On entering / leaving full screen mode the shelf visibility state is | 533 // On entering / leaving full screen mode the shelf visibility state is |
| 535 // changed to / from SHELF_HIDDEN. In this state, panel windows should hide | 534 // changed to / from SHELF_HIDDEN. In this state, panel windows should hide |
| 536 // to allow the full-screen application to use the full screen. | 535 // to allow the full-screen application to use the full screen. |
| 537 bool shelf_hidden = new_state == ash::SHELF_HIDDEN; | 536 bool shelf_hidden = new_state == ash::SHELF_HIDDEN; |
| 538 if (!shelf_hidden) { | 537 if (!shelf_hidden) { |
| 539 if (restore_windows_on_shelf_visible_) { | 538 if (restore_windows_on_shelf_visible_) { |
| 540 std::unique_ptr<aura::WindowTracker> restore_windows( | 539 std::unique_ptr<aura::WindowTracker> restore_windows( |
| 541 std::move(restore_windows_on_shelf_visible_)); | 540 std::move(restore_windows_on_shelf_visible_)); |
| 542 for (aura::Window* window : restore_windows->windows()) | 541 for (aura::Window* window : restore_windows->windows()) |
| 543 RestorePanel(WmWindow::Get(window)); | 542 RestorePanel(window); |
| 544 } | 543 } |
| 545 return; | 544 return; |
| 546 } | 545 } |
| 547 | 546 |
| 548 if (restore_windows_on_shelf_visible_) | 547 if (restore_windows_on_shelf_visible_) |
| 549 return; | 548 return; |
| 550 std::unique_ptr<aura::WindowTracker> minimized_windows( | 549 std::unique_ptr<aura::WindowTracker> minimized_windows( |
| 551 new aura::WindowTracker); | 550 new aura::WindowTracker); |
| 552 for (PanelList::iterator iter = panel_windows_.begin(); | 551 for (PanelList::iterator iter = panel_windows_.begin(); |
| 553 iter != panel_windows_.end();) { | 552 iter != panel_windows_.end();) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 566 void PanelLayoutManager::OnShelfIconPositionsChanged() { | 565 void PanelLayoutManager::OnShelfIconPositionsChanged() { |
| 567 // TODO: As this is called for every animation step now. Relayout needs to be | 566 // TODO: As this is called for every animation step now. Relayout needs to be |
| 568 // updated to use current icon position instead of use the ideal bounds so | 567 // updated to use current icon position instead of use the ideal bounds so |
| 569 // that the panels slide with their icons instead of jumping. | 568 // that the panels slide with their icons instead of jumping. |
| 570 Relayout(); | 569 Relayout(); |
| 571 } | 570 } |
| 572 | 571 |
| 573 //////////////////////////////////////////////////////////////////////////////// | 572 //////////////////////////////////////////////////////////////////////////////// |
| 574 // PanelLayoutManager private implementation: | 573 // PanelLayoutManager private implementation: |
| 575 | 574 |
| 576 void PanelLayoutManager::MinimizePanel(WmWindow* panel) { | 575 void PanelLayoutManager::MinimizePanel(aura::Window* panel) { |
| 577 // Clusterfuzz can trigger panel accelerators before the shelf is created. | 576 // Clusterfuzz can trigger panel accelerators before the shelf is created. |
| 578 // TODO(jamescook): Revert this after http://crbug.com/648964 is fixed. | 577 // TODO(jamescook): Revert this after http://crbug.com/648964 is fixed. |
| 579 if (!shelf_) | 578 if (!shelf_) |
| 580 return; | 579 return; |
| 581 | 580 |
| 582 panel->SetVisibilityAnimationType( | 581 ::wm::SetWindowVisibilityAnimationType( |
| 583 wm::WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); | 582 panel, wm::WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
| 584 ui::Layer* layer = panel->GetLayer(); | 583 ui::Layer* layer = panel->layer(); |
| 585 ui::ScopedLayerAnimationSettings panel_slide_settings(layer->GetAnimator()); | 584 ui::ScopedLayerAnimationSettings panel_slide_settings(layer->GetAnimator()); |
| 586 panel_slide_settings.SetPreemptionStrategy( | 585 panel_slide_settings.SetPreemptionStrategy( |
| 587 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 586 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| 588 panel_slide_settings.SetTransitionDuration( | 587 panel_slide_settings.SetTransitionDuration( |
| 589 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); | 588 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); |
| 590 gfx::Rect bounds(panel->GetBounds()); | 589 gfx::Rect bounds(panel->bounds()); |
| 591 bounds.Offset(GetSlideInAnimationOffset(shelf_->GetAlignment())); | 590 bounds.Offset(GetSlideInAnimationOffset(shelf_->GetAlignment())); |
| 592 panel->SetBoundsDirect(bounds); | 591 SetChildBoundsDirect(panel, bounds); |
| 593 panel->Hide(); | 592 panel->Hide(); |
| 594 layer->SetOpacity(0); | 593 layer->SetOpacity(0); |
| 595 if (panel->IsActive()) | 594 if (::wm::IsActiveWindow(panel)) |
| 596 panel->Deactivate(); | 595 ::wm::DeactivateWindow(panel); |
| 597 Relayout(); | 596 Relayout(); |
| 598 } | 597 } |
| 599 | 598 |
| 600 void PanelLayoutManager::RestorePanel(WmWindow* panel) { | 599 void PanelLayoutManager::RestorePanel(aura::Window* panel) { |
| 601 PanelList::iterator found = | 600 PanelList::iterator found = std::find( |
| 602 std::find(panel_windows_.begin(), panel_windows_.end(), panel); | 601 panel_windows_.begin(), panel_windows_.end(), WmWindow::Get(panel)); |
| 603 DCHECK(found != panel_windows_.end()); | 602 DCHECK(found != panel_windows_.end()); |
| 604 found->slide_in = true; | 603 found->slide_in = true; |
| 605 Relayout(); | 604 Relayout(); |
| 606 } | 605 } |
| 607 | 606 |
| 608 void PanelLayoutManager::Relayout() { | 607 void PanelLayoutManager::Relayout() { |
| 609 if (!shelf_ || !shelf_->GetWindow()) | 608 if (!shelf_ || !shelf_->GetWindow()) |
| 610 return; | 609 return; |
| 611 | 610 |
| 612 // Suppress layouts during overview mode because changing window bounds | 611 // Suppress layouts during overview mode because changing window bounds |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 bounds.set_y(visible_panels[i].major_pos - | 728 bounds.set_y(visible_panels[i].major_pos - |
| 730 visible_panels[i].major_length / 2); | 729 visible_panels[i].major_length / 2); |
| 731 } | 730 } |
| 732 | 731 |
| 733 ui::Layer* layer = visible_panels[i].window->GetLayer(); | 732 ui::Layer* layer = visible_panels[i].window->GetLayer(); |
| 734 if (slide_in) { | 733 if (slide_in) { |
| 735 // New windows shift up from the shelf into position and fade in. | 734 // New windows shift up from the shelf into position and fade in. |
| 736 layer->SetOpacity(0); | 735 layer->SetOpacity(0); |
| 737 gfx::Rect initial_bounds(bounds); | 736 gfx::Rect initial_bounds(bounds); |
| 738 initial_bounds.Offset(GetSlideInAnimationOffset(shelf_->alignment())); | 737 initial_bounds.Offset(GetSlideInAnimationOffset(shelf_->alignment())); |
| 739 visible_panels[i].window->SetBoundsDirect(initial_bounds); | 738 SetChildBoundsDirect(visible_panels[i].window->aura_window(), |
| 739 initial_bounds); |
| 740 // Set on shelf so that the panel animates into its target position. | 740 // Set on shelf so that the panel animates into its target position. |
| 741 on_shelf = true; | 741 on_shelf = true; |
| 742 } | 742 } |
| 743 | 743 |
| 744 if (on_shelf) { | 744 if (on_shelf) { |
| 745 ui::ScopedLayerAnimationSettings panel_slide_settings( | 745 ui::ScopedLayerAnimationSettings panel_slide_settings( |
| 746 layer->GetAnimator()); | 746 layer->GetAnimator()); |
| 747 panel_slide_settings.SetPreemptionStrategy( | 747 panel_slide_settings.SetPreemptionStrategy( |
| 748 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 748 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| 749 panel_slide_settings.SetTransitionDuration( | 749 panel_slide_settings.SetTransitionDuration( |
| 750 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); | 750 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); |
| 751 visible_panels[i].window->SetBoundsDirect(bounds); | 751 SetChildBoundsDirect(visible_panels[i].window->aura_window(), bounds); |
| 752 if (slide_in) { | 752 if (slide_in) { |
| 753 layer->SetOpacity(1); | 753 layer->SetOpacity(1); |
| 754 visible_panels[i].window->Show(); | 754 visible_panels[i].window->Show(); |
| 755 } | 755 } |
| 756 } else { | 756 } else { |
| 757 // If the shelf moved don't animate, move immediately to the new | 757 // If the shelf moved don't animate, move immediately to the new |
| 758 // target location. | 758 // target location. |
| 759 visible_panels[i].window->SetBoundsDirect(bounds); | 759 SetChildBoundsDirect(visible_panels[i].window->aura_window(), bounds); |
| 760 } | 760 } |
| 761 } | 761 } |
| 762 | 762 |
| 763 UpdateStacking(active_panel); | 763 UpdateStacking(active_panel); |
| 764 UpdateCallouts(); | 764 UpdateCallouts(); |
| 765 } | 765 } |
| 766 | 766 |
| 767 void PanelLayoutManager::UpdateStacking(WmWindow* active_panel) { | 767 void PanelLayoutManager::UpdateStacking(WmWindow* active_panel) { |
| 768 // Clusterfuzz can trigger panel accelerators before the shelf is created. | 768 // Clusterfuzz can trigger panel accelerators before the shelf is created. |
| 769 // TODO(jamescook): Revert this after http://crbug.com/648964 is fixed. | 769 // TODO(jamescook): Revert this after http://crbug.com/648964 is fixed. |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 } | 864 } |
| 865 if (shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT) | 865 if (shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT) |
| 866 callout_bounds.set_x(bounds.x() - callout_bounds.width()); | 866 callout_bounds.set_x(bounds.x() - callout_bounds.width()); |
| 867 else if (shelf_->GetAlignment() == SHELF_ALIGNMENT_RIGHT) | 867 else if (shelf_->GetAlignment() == SHELF_ALIGNMENT_RIGHT) |
| 868 callout_bounds.set_x(bounds.right()); | 868 callout_bounds.set_x(bounds.right()); |
| 869 else | 869 else |
| 870 callout_bounds.set_y(bounds.bottom()); | 870 callout_bounds.set_y(bounds.bottom()); |
| 871 callout_bounds = callout_widget_window->GetParent()->ConvertRectFromScreen( | 871 callout_bounds = callout_widget_window->GetParent()->ConvertRectFromScreen( |
| 872 callout_bounds); | 872 callout_bounds); |
| 873 | 873 |
| 874 callout_widget_window->SetBoundsDirect(callout_bounds); | 874 SetChildBoundsDirect(callout_widget_window->aura_window(), callout_bounds); |
| 875 DCHECK_EQ(panel_container_, callout_widget_window->GetParent()); | 875 DCHECK_EQ(panel_container_, callout_widget_window->GetParent()); |
| 876 DCHECK_EQ(panel_container_, panel->GetParent()); | 876 DCHECK_EQ(panel_container_, panel->GetParent()); |
| 877 panel_container_->StackChildAbove(callout_widget_window, panel); | 877 panel_container_->StackChildAbove(callout_widget_window, panel); |
| 878 | 878 |
| 879 ui::Layer* layer = callout_widget_window->GetLayer(); | 879 ui::Layer* layer = callout_widget_window->GetLayer(); |
| 880 // If the panel is not over the callout position or has just become visible | 880 // If the panel is not over the callout position or has just become visible |
| 881 // then fade in the callout. | 881 // then fade in the callout. |
| 882 if ((distance_until_over_panel > 0 || layer->GetTargetOpacity() < 1)) { | 882 if ((distance_until_over_panel > 0 || layer->GetTargetOpacity() < 1)) { |
| 883 if (distance_until_over_panel > 0 && | 883 if (distance_until_over_panel > 0 && |
| 884 slide_distance >= distance_until_over_panel) { | 884 slide_distance >= distance_until_over_panel) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 // Save existing bounds, so that we can restore them when the keyboard | 921 // Save existing bounds, so that we can restore them when the keyboard |
| 922 // hides. | 922 // hides. |
| 923 panel_state->SaveCurrentBoundsForRestore(); | 923 panel_state->SaveCurrentBoundsForRestore(); |
| 924 | 924 |
| 925 gfx::Rect panel_bounds = | 925 gfx::Rect panel_bounds = |
| 926 panel->GetParent()->ConvertRectToScreen(panel->GetTargetBounds()); | 926 panel->GetParent()->ConvertRectToScreen(panel->GetTargetBounds()); |
| 927 int delta = panel_bounds.height() - available_space; | 927 int delta = panel_bounds.height() - available_space; |
| 928 // Ensure panels are not pushed above the parent boundaries, shrink any | 928 // Ensure panels are not pushed above the parent boundaries, shrink any |
| 929 // panels that violate this constraint. | 929 // panels that violate this constraint. |
| 930 if (delta > 0) { | 930 if (delta > 0) { |
| 931 panel->SetBoundsDirect( | 931 SetChildBoundsDirect( |
| 932 panel->aura_window(), |
| 932 gfx::Rect(panel_bounds.x(), panel_bounds.y() + delta, | 933 gfx::Rect(panel_bounds.x(), panel_bounds.y() + delta, |
| 933 panel_bounds.width(), panel_bounds.height() - delta)); | 934 panel_bounds.width(), panel_bounds.height() - delta)); |
| 934 } | 935 } |
| 935 } else if (panel_state->HasRestoreBounds()) { | 936 } else if (panel_state->HasRestoreBounds()) { |
| 936 // Keyboard hidden, restore original bounds if they exist. | 937 // Keyboard hidden, restore original bounds if they exist. |
| 937 panel->SetBoundsDirect(panel_state->GetRestoreBoundsInScreen()); | 938 SetChildBoundsDirect(panel->aura_window(), |
| 939 panel_state->GetRestoreBoundsInScreen()); |
| 938 } | 940 } |
| 939 } | 941 } |
| 940 // This bounds change will have caused a change to the Shelf which does not | 942 // This bounds change will have caused a change to the Shelf which does not |
| 941 // propogate automatically to this class, so manually recalculate bounds. | 943 // propogate automatically to this class, so manually recalculate bounds. |
| 942 OnWindowResized(); | 944 OnWindowResized(); |
| 943 } | 945 } |
| 944 | 946 |
| 945 void PanelLayoutManager::OnKeyboardClosed() { | 947 void PanelLayoutManager::OnKeyboardClosed() { |
| 946 keyboard_observer_.RemoveAll(); | 948 keyboard_observer_.RemoveAll(); |
| 947 } | 949 } |
| 948 | 950 |
| 949 } // namespace ash | 951 } // namespace ash |
| OLD | NEW |