| 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 | 9 |
| 10 #include "ash/launcher/launcher.h" | |
| 11 #include "ash/screen_ash.h" | 10 #include "ash/screen_ash.h" |
| 11 #include "ash/shelf/shelf.h" |
| 12 #include "ash/shelf/shelf_layout_manager.h" | 12 #include "ash/shelf/shelf_layout_manager.h" |
| 13 #include "ash/shelf/shelf_types.h" | 13 #include "ash/shelf/shelf_types.h" |
| 14 #include "ash/shelf/shelf_widget.h" | 14 #include "ash/shelf/shelf_widget.h" |
| 15 #include "ash/shell.h" | 15 #include "ash/shell.h" |
| 16 #include "ash/shell_window_ids.h" | 16 #include "ash/shell_window_ids.h" |
| 17 #include "ash/wm/window_animations.h" | 17 #include "ash/wm/window_animations.h" |
| 18 #include "ash/wm/window_state.h" | 18 #include "ash/wm/window_state.h" |
| 19 #include "ash/wm/window_util.h" | 19 #include "ash/wm/window_util.h" |
| 20 #include "base/auto_reset.h" | 20 #include "base/auto_reset.h" |
| 21 #include "base/bind.h" | 21 #include "base/bind.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 42 namespace { | 42 namespace { |
| 43 const int kPanelIdealSpacing = 4; | 43 const int kPanelIdealSpacing = 4; |
| 44 | 44 |
| 45 const float kMaxHeightFactor = .80f; | 45 const float kMaxHeightFactor = .80f; |
| 46 const float kMaxWidthFactor = .50f; | 46 const float kMaxWidthFactor = .50f; |
| 47 | 47 |
| 48 // Duration for panel animations. | 48 // Duration for panel animations. |
| 49 const int kPanelSlideDurationMilliseconds = 50; | 49 const int kPanelSlideDurationMilliseconds = 50; |
| 50 const int kCalloutFadeDurationMilliseconds = 50; | 50 const int kCalloutFadeDurationMilliseconds = 50; |
| 51 | 51 |
| 52 // Offset used when sliding panel in/out of the launcher. Used for minimizing, | 52 // Offset used when sliding panel in/out of the shelf. Used for minimizing, |
| 53 // restoring and the initial showing of a panel. | 53 // restoring and the initial showing of a panel. |
| 54 const int kPanelSlideInOffset = 20; | 54 const int kPanelSlideInOffset = 20; |
| 55 | 55 |
| 56 // Callout arrow dimensions. | 56 // Callout arrow dimensions. |
| 57 const int kArrowWidth = 18; | 57 const int kArrowWidth = 18; |
| 58 const int kArrowHeight = 9; | 58 const int kArrowHeight = 9; |
| 59 | 59 |
| 60 class CalloutWidgetBackground : public views::Background { | 60 class CalloutWidgetBackground : public views::Background { |
| 61 public: | 61 public: |
| 62 CalloutWidgetBackground() : alignment_(SHELF_ALIGNMENT_BOTTOM) { | 62 CalloutWidgetBackground() : alignment_(SHELF_ALIGNMENT_BOTTOM) { |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 DISALLOW_COPY_AND_ASSIGN(PanelCalloutWidget); | 252 DISALLOW_COPY_AND_ASSIGN(PanelCalloutWidget); |
| 253 }; | 253 }; |
| 254 | 254 |
| 255 //////////////////////////////////////////////////////////////////////////////// | 255 //////////////////////////////////////////////////////////////////////////////// |
| 256 // PanelLayoutManager public implementation: | 256 // PanelLayoutManager public implementation: |
| 257 PanelLayoutManager::PanelLayoutManager(aura::Window* panel_container) | 257 PanelLayoutManager::PanelLayoutManager(aura::Window* panel_container) |
| 258 : panel_container_(panel_container), | 258 : panel_container_(panel_container), |
| 259 in_add_window_(false), | 259 in_add_window_(false), |
| 260 in_layout_(false), | 260 in_layout_(false), |
| 261 dragged_panel_(NULL), | 261 dragged_panel_(NULL), |
| 262 launcher_(NULL), | 262 shelf_(NULL), |
| 263 shelf_layout_manager_(NULL), | 263 shelf_layout_manager_(NULL), |
| 264 last_active_panel_(NULL), | 264 last_active_panel_(NULL), |
| 265 weak_factory_(this) { | 265 weak_factory_(this) { |
| 266 DCHECK(panel_container); | 266 DCHECK(panel_container); |
| 267 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> | 267 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> |
| 268 AddObserver(this); | 268 AddObserver(this); |
| 269 Shell::GetInstance()->display_controller()->AddObserver(this); | 269 Shell::GetInstance()->display_controller()->AddObserver(this); |
| 270 Shell::GetInstance()->AddShellObserver(this); | 270 Shell::GetInstance()->AddShellObserver(this); |
| 271 } | 271 } |
| 272 | 272 |
| 273 PanelLayoutManager::~PanelLayoutManager() { | 273 PanelLayoutManager::~PanelLayoutManager() { |
| 274 Shutdown(); | 274 Shutdown(); |
| 275 } | 275 } |
| 276 | 276 |
| 277 void PanelLayoutManager::Shutdown() { | 277 void PanelLayoutManager::Shutdown() { |
| 278 if (shelf_layout_manager_) | 278 if (shelf_layout_manager_) |
| 279 shelf_layout_manager_->RemoveObserver(this); | 279 shelf_layout_manager_->RemoveObserver(this); |
| 280 shelf_layout_manager_ = NULL; | 280 shelf_layout_manager_ = NULL; |
| 281 for (PanelList::iterator iter = panel_windows_.begin(); | 281 for (PanelList::iterator iter = panel_windows_.begin(); |
| 282 iter != panel_windows_.end(); ++iter) { | 282 iter != panel_windows_.end(); ++iter) { |
| 283 delete iter->callout_widget; | 283 delete iter->callout_widget; |
| 284 } | 284 } |
| 285 panel_windows_.clear(); | 285 panel_windows_.clear(); |
| 286 if (launcher_) | 286 if (shelf_) |
| 287 launcher_->RemoveIconObserver(this); | 287 shelf_->RemoveIconObserver(this); |
| 288 launcher_ = NULL; | 288 shelf_ = NULL; |
| 289 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> | 289 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> |
| 290 RemoveObserver(this); | 290 RemoveObserver(this); |
| 291 Shell::GetInstance()->display_controller()->RemoveObserver(this); | 291 Shell::GetInstance()->display_controller()->RemoveObserver(this); |
| 292 Shell::GetInstance()->RemoveShellObserver(this); | 292 Shell::GetInstance()->RemoveShellObserver(this); |
| 293 } | 293 } |
| 294 | 294 |
| 295 void PanelLayoutManager::StartDragging(aura::Window* panel) { | 295 void PanelLayoutManager::StartDragging(aura::Window* panel) { |
| 296 DCHECK(!dragged_panel_); | 296 DCHECK(!dragged_panel_); |
| 297 dragged_panel_ = panel; | 297 dragged_panel_ = panel; |
| 298 Relayout(); | 298 Relayout(); |
| 299 } | 299 } |
| 300 | 300 |
| 301 void PanelLayoutManager::FinishDragging() { | 301 void PanelLayoutManager::FinishDragging() { |
| 302 dragged_panel_ = NULL; | 302 dragged_panel_ = NULL; |
| 303 Relayout(); | 303 Relayout(); |
| 304 } | 304 } |
| 305 | 305 |
| 306 void PanelLayoutManager::SetLauncher(ash::Launcher* launcher) { | 306 void PanelLayoutManager::SetShelf(Shelf* shelf) { |
| 307 DCHECK(!launcher_); | 307 DCHECK(!shelf_); |
| 308 DCHECK(!shelf_layout_manager_); | 308 DCHECK(!shelf_layout_manager_); |
| 309 launcher_ = launcher; | 309 shelf_ = shelf; |
| 310 launcher_->AddIconObserver(this); | 310 shelf_->AddIconObserver(this); |
| 311 if (launcher_->shelf_widget()) { | 311 if (shelf_->shelf_widget()) { |
| 312 shelf_layout_manager_ = ash::internal::ShelfLayoutManager::ForLauncher( | 312 shelf_layout_manager_ = ash::internal::ShelfLayoutManager::ForShelf( |
| 313 launcher_->shelf_widget()->GetNativeWindow()); | 313 shelf_->shelf_widget()->GetNativeWindow()); |
| 314 WillChangeVisibilityState(shelf_layout_manager_->visibility_state()); | 314 WillChangeVisibilityState(shelf_layout_manager_->visibility_state()); |
| 315 shelf_layout_manager_->AddObserver(this); | 315 shelf_layout_manager_->AddObserver(this); |
| 316 } | 316 } |
| 317 } | 317 } |
| 318 | 318 |
| 319 void PanelLayoutManager::ToggleMinimize(aura::Window* panel) { | 319 void PanelLayoutManager::ToggleMinimize(aura::Window* panel) { |
| 320 DCHECK(panel->parent() == panel_container_); | 320 DCHECK(panel->parent() == panel_container_); |
| 321 wm::WindowState* window_state = wm::GetWindowState(panel); | 321 wm::WindowState* window_state = wm::GetWindowState(panel); |
| 322 if (window_state->IsMinimized()) | 322 if (window_state->IsMinimized()) |
| 323 window_state->Restore(); | 323 window_state->Restore(); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 views::corewm::SetWindowVisibilityAnimationType( | 549 views::corewm::SetWindowVisibilityAnimationType( |
| 550 panel, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); | 550 panel, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
| 551 ui::Layer* layer = panel->layer(); | 551 ui::Layer* layer = panel->layer(); |
| 552 ui::ScopedLayerAnimationSettings panel_slide_settings(layer->GetAnimator()); | 552 ui::ScopedLayerAnimationSettings panel_slide_settings(layer->GetAnimator()); |
| 553 panel_slide_settings.SetPreemptionStrategy( | 553 panel_slide_settings.SetPreemptionStrategy( |
| 554 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 554 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| 555 panel_slide_settings.SetTransitionDuration( | 555 panel_slide_settings.SetTransitionDuration( |
| 556 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); | 556 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); |
| 557 gfx::Rect bounds(panel->bounds()); | 557 gfx::Rect bounds(panel->bounds()); |
| 558 bounds.Offset(GetSlideInAnimationOffset( | 558 bounds.Offset(GetSlideInAnimationOffset( |
| 559 launcher_->shelf_widget()->GetAlignment())); | 559 shelf_->shelf_widget()->GetAlignment())); |
| 560 SetChildBoundsDirect(panel, bounds); | 560 SetChildBoundsDirect(panel, bounds); |
| 561 panel->Hide(); | 561 panel->Hide(); |
| 562 PanelList::iterator found = | 562 PanelList::iterator found = |
| 563 std::find(panel_windows_.begin(), panel_windows_.end(), panel); | 563 std::find(panel_windows_.begin(), panel_windows_.end(), panel); |
| 564 if (found != panel_windows_.end()) { | 564 if (found != panel_windows_.end()) { |
| 565 layer->SetOpacity(0); | 565 layer->SetOpacity(0); |
| 566 // The next time the window is visible it should slide into place. | 566 // The next time the window is visible it should slide into place. |
| 567 found->slide_in = true; | 567 found->slide_in = true; |
| 568 } | 568 } |
| 569 if (wm::IsActiveWindow(panel)) | 569 if (wm::IsActiveWindow(panel)) |
| 570 wm::DeactivateWindow(panel); | 570 wm::DeactivateWindow(panel); |
| 571 Relayout(); | 571 Relayout(); |
| 572 } | 572 } |
| 573 | 573 |
| 574 void PanelLayoutManager::RestorePanel(aura::Window* panel) { | 574 void PanelLayoutManager::RestorePanel(aura::Window* panel) { |
| 575 panel->Show(); | 575 panel->Show(); |
| 576 Relayout(); | 576 Relayout(); |
| 577 } | 577 } |
| 578 | 578 |
| 579 void PanelLayoutManager::Relayout() { | 579 void PanelLayoutManager::Relayout() { |
| 580 if (!launcher_ || !launcher_->shelf_widget()) | 580 if (!shelf_ || !shelf_->shelf_widget()) |
| 581 return; | 581 return; |
| 582 | 582 |
| 583 if (in_layout_) | 583 if (in_layout_) |
| 584 return; | 584 return; |
| 585 base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true); | 585 base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true); |
| 586 | 586 |
| 587 ShelfAlignment alignment = launcher_->shelf_widget()->GetAlignment(); | 587 ShelfAlignment alignment = shelf_->shelf_widget()->GetAlignment(); |
| 588 bool horizontal = alignment == SHELF_ALIGNMENT_TOP || | 588 bool horizontal = alignment == SHELF_ALIGNMENT_TOP || |
| 589 alignment == SHELF_ALIGNMENT_BOTTOM; | 589 alignment == SHELF_ALIGNMENT_BOTTOM; |
| 590 gfx::Rect launcher_bounds = ash::ScreenAsh::ConvertRectFromScreen( | 590 gfx::Rect shelf_bounds = ash::ScreenAsh::ConvertRectFromScreen( |
| 591 panel_container_, launcher_->shelf_widget()->GetWindowBoundsInScreen()); | 591 panel_container_, shelf_->shelf_widget()->GetWindowBoundsInScreen()); |
| 592 int panel_start_bounds = kPanelIdealSpacing; | 592 int panel_start_bounds = kPanelIdealSpacing; |
| 593 int panel_end_bounds = horizontal ? | 593 int panel_end_bounds = horizontal ? |
| 594 panel_container_->bounds().width() - kPanelIdealSpacing : | 594 panel_container_->bounds().width() - kPanelIdealSpacing : |
| 595 panel_container_->bounds().height() - kPanelIdealSpacing; | 595 panel_container_->bounds().height() - kPanelIdealSpacing; |
| 596 aura::Window* active_panel = NULL; | 596 aura::Window* active_panel = NULL; |
| 597 std::vector<VisiblePanelPositionInfo> visible_panels; | 597 std::vector<VisiblePanelPositionInfo> visible_panels; |
| 598 for (PanelList::iterator iter = panel_windows_.begin(); | 598 for (PanelList::iterator iter = panel_windows_.begin(); |
| 599 iter != panel_windows_.end(); ++iter) { | 599 iter != panel_windows_.end(); ++iter) { |
| 600 aura::Window* panel = iter->window; | 600 aura::Window* panel = iter->window; |
| 601 iter->callout_widget->SetAlignment(alignment); | 601 iter->callout_widget->SetAlignment(alignment); |
| 602 | 602 |
| 603 // Consider the dragged panel as part of the layout as long as it is | 603 // Consider the dragged panel as part of the layout as long as it is |
| 604 // touching the launcher. | 604 // touching the shelf. |
| 605 if (!panel->IsVisible() || | 605 if (!panel->IsVisible() || |
| 606 (panel == dragged_panel_ && | 606 (panel == dragged_panel_ && |
| 607 !BoundsAdjacent(panel->bounds(), launcher_bounds))) { | 607 !BoundsAdjacent(panel->bounds(), shelf_bounds))) { |
| 608 continue; | 608 continue; |
| 609 } | 609 } |
| 610 | 610 |
| 611 // If the shelf is currently hidden (full-screen mode), minimize panel until | 611 // If the shelf is currently hidden (full-screen mode), minimize panel until |
| 612 // full-screen mode is exited. | 612 // full-screen mode is exited. |
| 613 if (restore_windows_on_shelf_visible_) { | 613 if (restore_windows_on_shelf_visible_) { |
| 614 wm::GetWindowState(panel)->Minimize(); | 614 wm::GetWindowState(panel)->Minimize(); |
| 615 restore_windows_on_shelf_visible_->Add(panel); | 615 restore_windows_on_shelf_visible_->Add(panel); |
| 616 continue; | 616 continue; |
| 617 } | 617 } |
| 618 | 618 |
| 619 gfx::Rect icon_bounds = | 619 gfx::Rect icon_bounds = shelf_->GetScreenBoundsOfItemIconForWindow(panel); |
| 620 launcher_->GetScreenBoundsOfItemIconForWindow(panel); | |
| 621 | 620 |
| 622 // If both the icon width and height are 0 then there is no icon in the | 621 // If both the icon width and height are 0 then there is no icon in the |
| 623 // launcher. If the launcher is hidden, one of the height or width will be | 622 // shelf. If the shelf is hidden, one of the height or width will be |
| 624 // 0 but the position in the launcher and major dimension is still reported | 623 // 0 but the position in the shelf and major dimension is still reported |
| 625 // correctly and the panel can be aligned above where the hidden icon is. | 624 // correctly and the panel can be aligned above where the hidden icon is. |
| 626 if (icon_bounds.width() == 0 && icon_bounds.height() == 0) | 625 if (icon_bounds.width() == 0 && icon_bounds.height() == 0) |
| 627 continue; | 626 continue; |
| 628 | 627 |
| 629 if (panel->HasFocus() || | 628 if (panel->HasFocus() || |
| 630 panel->Contains( | 629 panel->Contains( |
| 631 aura::client::GetFocusClient(panel)->GetFocusedWindow())) { | 630 aura::client::GetFocusClient(panel)->GetFocusedWindow())) { |
| 632 DCHECK(!active_panel); | 631 DCHECK(!active_panel); |
| 633 active_panel = panel; | 632 active_panel = panel; |
| 634 } | 633 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 FanOutPanels(visible_panels.begin() + first_overlapping_panel, | 672 FanOutPanels(visible_panels.begin() + first_overlapping_panel, |
| 674 visible_panels.end()); | 673 visible_panels.end()); |
| 675 | 674 |
| 676 for (size_t i = 0; i < visible_panels.size(); ++i) { | 675 for (size_t i = 0; i < visible_panels.size(); ++i) { |
| 677 if (visible_panels[i].window == dragged_panel_) | 676 if (visible_panels[i].window == dragged_panel_) |
| 678 continue; | 677 continue; |
| 679 bool slide_in = visible_panels[i].slide_in; | 678 bool slide_in = visible_panels[i].slide_in; |
| 680 gfx::Rect bounds = visible_panels[i].window->GetTargetBounds(); | 679 gfx::Rect bounds = visible_panels[i].window->GetTargetBounds(); |
| 681 switch (alignment) { | 680 switch (alignment) { |
| 682 case SHELF_ALIGNMENT_BOTTOM: | 681 case SHELF_ALIGNMENT_BOTTOM: |
| 683 bounds.set_y(launcher_bounds.y() - bounds.height()); | 682 bounds.set_y(shelf_bounds.y() - bounds.height()); |
| 684 break; | 683 break; |
| 685 case SHELF_ALIGNMENT_LEFT: | 684 case SHELF_ALIGNMENT_LEFT: |
| 686 bounds.set_x(launcher_bounds.right()); | 685 bounds.set_x(shelf_bounds.right()); |
| 687 break; | 686 break; |
| 688 case SHELF_ALIGNMENT_RIGHT: | 687 case SHELF_ALIGNMENT_RIGHT: |
| 689 bounds.set_x(launcher_bounds.x() - bounds.width()); | 688 bounds.set_x(shelf_bounds.x() - bounds.width()); |
| 690 break; | 689 break; |
| 691 case SHELF_ALIGNMENT_TOP: | 690 case SHELF_ALIGNMENT_TOP: |
| 692 bounds.set_y(launcher_bounds.bottom()); | 691 bounds.set_y(shelf_bounds.bottom()); |
| 693 break; | 692 break; |
| 694 } | 693 } |
| 695 bool on_launcher = visible_panels[i].window->GetTargetBounds() == bounds; | 694 bool on_shelf = visible_panels[i].window->GetTargetBounds() == bounds; |
| 696 | 695 |
| 697 if (horizontal) { | 696 if (horizontal) { |
| 698 bounds.set_x(visible_panels[i].major_pos - | 697 bounds.set_x(visible_panels[i].major_pos - |
| 699 visible_panels[i].major_length / 2); | 698 visible_panels[i].major_length / 2); |
| 700 } else { | 699 } else { |
| 701 bounds.set_y(visible_panels[i].major_pos - | 700 bounds.set_y(visible_panels[i].major_pos - |
| 702 visible_panels[i].major_length / 2); | 701 visible_panels[i].major_length / 2); |
| 703 } | 702 } |
| 704 | 703 |
| 705 ui::Layer* layer = visible_panels[i].window->layer(); | 704 ui::Layer* layer = visible_panels[i].window->layer(); |
| 706 if (slide_in) { | 705 if (slide_in) { |
| 707 // New windows shift up from the launcher into position. | 706 // New windows shift up from the shelf into position. |
| 708 gfx::Rect initial_bounds(bounds); | 707 gfx::Rect initial_bounds(bounds); |
| 709 initial_bounds.Offset(GetSlideInAnimationOffset(alignment)); | 708 initial_bounds.Offset(GetSlideInAnimationOffset(alignment)); |
| 710 SetChildBoundsDirect(visible_panels[i].window, initial_bounds); | 709 SetChildBoundsDirect(visible_panels[i].window, initial_bounds); |
| 711 // Set on launcher so that the panel animates into its target position. | 710 // Set on shelf so that the panel animates into its target position. |
| 712 on_launcher = true; | 711 on_shelf = true; |
| 713 } | 712 } |
| 714 | 713 |
| 715 if (on_launcher) { | 714 if (on_shelf) { |
| 716 ui::ScopedLayerAnimationSettings panel_slide_settings( | 715 ui::ScopedLayerAnimationSettings panel_slide_settings( |
| 717 layer->GetAnimator()); | 716 layer->GetAnimator()); |
| 718 panel_slide_settings.SetPreemptionStrategy( | 717 panel_slide_settings.SetPreemptionStrategy( |
| 719 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 718 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| 720 panel_slide_settings.SetTransitionDuration( | 719 panel_slide_settings.SetTransitionDuration( |
| 721 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); | 720 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); |
| 722 SetChildBoundsDirect(visible_panels[i].window, bounds); | 721 SetChildBoundsDirect(visible_panels[i].window, bounds); |
| 723 if (slide_in) | 722 if (slide_in) |
| 724 layer->SetOpacity(1); | 723 layer->SetOpacity(1); |
| 725 } else { | 724 } else { |
| 726 // If the launcher moved don't animate, move immediately to the new | 725 // If the shelf moved don't animate, move immediately to the new |
| 727 // target location. | 726 // target location. |
| 728 SetChildBoundsDirect(visible_panels[i].window, bounds); | 727 SetChildBoundsDirect(visible_panels[i].window, bounds); |
| 729 } | 728 } |
| 730 } | 729 } |
| 731 | 730 |
| 732 UpdateStacking(active_panel); | 731 UpdateStacking(active_panel); |
| 733 UpdateCallouts(); | 732 UpdateCallouts(); |
| 734 } | 733 } |
| 735 | 734 |
| 736 void PanelLayoutManager::UpdateStacking(aura::Window* active_panel) { | 735 void PanelLayoutManager::UpdateStacking(aura::Window* active_panel) { |
| 737 if (!active_panel) { | 736 if (!active_panel) { |
| 738 if (!last_active_panel_) | 737 if (!last_active_panel_) |
| 739 return; | 738 return; |
| 740 active_panel = last_active_panel_; | 739 active_panel = last_active_panel_; |
| 741 } | 740 } |
| 742 | 741 |
| 743 ShelfAlignment alignment = launcher_->alignment(); | 742 ShelfAlignment alignment = shelf_->alignment(); |
| 744 bool horizontal = alignment == SHELF_ALIGNMENT_TOP || | 743 bool horizontal = alignment == SHELF_ALIGNMENT_TOP || |
| 745 alignment == SHELF_ALIGNMENT_BOTTOM; | 744 alignment == SHELF_ALIGNMENT_BOTTOM; |
| 746 | 745 |
| 747 // We want to to stack the panels like a deck of cards: | 746 // We want to to stack the panels like a deck of cards: |
| 748 // ,--,--,--,-------.--.--. | 747 // ,--,--,--,-------.--.--. |
| 749 // | | | | | | | | 748 // | | | | | | | |
| 750 // | | | | | | | | 749 // | | | | | | | |
| 751 // | 750 // |
| 752 // We use the middle of each panel to figure out how to stack the panels. This | 751 // We use the middle of each panel to figure out how to stack the panels. This |
| 753 // allows us to update the stacking when a panel is being dragged around by | 752 // allows us to update the stacking when a panel is being dragged around by |
| 754 // the titlebar--even though it doesn't update the launcher icon positions, we | 753 // the titlebar--even though it doesn't update the shelf icon positions, we |
| 755 // still want the visual effect. | 754 // still want the visual effect. |
| 756 std::map<int, aura::Window*> window_ordering; | 755 std::map<int, aura::Window*> window_ordering; |
| 757 for (PanelList::const_iterator it = panel_windows_.begin(); | 756 for (PanelList::const_iterator it = panel_windows_.begin(); |
| 758 it != panel_windows_.end(); ++it) { | 757 it != panel_windows_.end(); ++it) { |
| 759 gfx::Rect bounds = it->window->bounds(); | 758 gfx::Rect bounds = it->window->bounds(); |
| 760 window_ordering.insert(std::make_pair(horizontal ? | 759 window_ordering.insert(std::make_pair(horizontal ? |
| 761 bounds.x() + bounds.width() / 2 : | 760 bounds.x() + bounds.width() / 2 : |
| 762 bounds.y() + bounds.height() / 2, | 761 bounds.y() + bounds.height() / 2, |
| 763 it->window)); | 762 it->window)); |
| 764 } | 763 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 781 previous_panel = it->second; | 780 previous_panel = it->second; |
| 782 } | 781 } |
| 783 | 782 |
| 784 panel_container_->StackChildAtTop(active_panel); | 783 panel_container_->StackChildAtTop(active_panel); |
| 785 if (dragged_panel_ && dragged_panel_->parent() == panel_container_) | 784 if (dragged_panel_ && dragged_panel_->parent() == panel_container_) |
| 786 panel_container_->StackChildAtTop(dragged_panel_); | 785 panel_container_->StackChildAtTop(dragged_panel_); |
| 787 last_active_panel_ = active_panel; | 786 last_active_panel_ = active_panel; |
| 788 } | 787 } |
| 789 | 788 |
| 790 void PanelLayoutManager::UpdateCallouts() { | 789 void PanelLayoutManager::UpdateCallouts() { |
| 791 ShelfAlignment alignment = launcher_->alignment(); | 790 ShelfAlignment alignment = shelf_->alignment(); |
| 792 bool horizontal = alignment == SHELF_ALIGNMENT_TOP || | 791 bool horizontal = alignment == SHELF_ALIGNMENT_TOP || |
| 793 alignment == SHELF_ALIGNMENT_BOTTOM; | 792 alignment == SHELF_ALIGNMENT_BOTTOM; |
| 794 | 793 |
| 795 for (PanelList::iterator iter = panel_windows_.begin(); | 794 for (PanelList::iterator iter = panel_windows_.begin(); |
| 796 iter != panel_windows_.end(); ++iter) { | 795 iter != panel_windows_.end(); ++iter) { |
| 797 aura::Window* panel = iter->window; | 796 aura::Window* panel = iter->window; |
| 798 views::Widget* callout_widget = iter->callout_widget; | 797 views::Widget* callout_widget = iter->callout_widget; |
| 799 | 798 |
| 800 gfx::Rect current_bounds = panel->GetBoundsInScreen(); | 799 gfx::Rect current_bounds = panel->GetBoundsInScreen(); |
| 801 gfx::Rect bounds = ScreenAsh::ConvertRectToScreen(panel->parent(), | 800 gfx::Rect bounds = ScreenAsh::ConvertRectToScreen(panel->parent(), |
| 802 panel->GetTargetBounds()); | 801 panel->GetTargetBounds()); |
| 803 gfx::Rect icon_bounds = | 802 gfx::Rect icon_bounds = shelf_->GetScreenBoundsOfItemIconForWindow(panel); |
| 804 launcher_->GetScreenBoundsOfItemIconForWindow(panel); | |
| 805 if (icon_bounds.IsEmpty() || !panel->layer()->GetTargetVisibility() || | 803 if (icon_bounds.IsEmpty() || !panel->layer()->GetTargetVisibility() || |
| 806 panel == dragged_panel_) { | 804 panel == dragged_panel_) { |
| 807 callout_widget->Hide(); | 805 callout_widget->Hide(); |
| 808 callout_widget->GetNativeWindow()->layer()->SetOpacity(0); | 806 callout_widget->GetNativeWindow()->layer()->SetOpacity(0); |
| 809 continue; | 807 continue; |
| 810 } | 808 } |
| 811 | 809 |
| 812 gfx::Rect callout_bounds = callout_widget->GetWindowBoundsInScreen(); | 810 gfx::Rect callout_bounds = callout_widget->GetWindowBoundsInScreen(); |
| 813 gfx::Vector2d slide_vector = bounds.origin() - current_bounds.origin(); | 811 gfx::Vector2d slide_vector = bounds.origin() - current_bounds.origin(); |
| 814 int slide_distance = horizontal ? slide_vector.x() : slide_vector.y(); | 812 int slide_distance = horizontal ? slide_vector.x() : slide_vector.y(); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 | 884 |
| 887 void PanelLayoutManager::OnKeyboardBoundsChanging( | 885 void PanelLayoutManager::OnKeyboardBoundsChanging( |
| 888 const gfx::Rect& keyboard_bounds) { | 886 const gfx::Rect& keyboard_bounds) { |
| 889 // This bounds change will have caused a change to the Shelf which does not | 887 // This bounds change will have caused a change to the Shelf which does not |
| 890 // propogate automatically to this class, so manually recalculate bounds. | 888 // propogate automatically to this class, so manually recalculate bounds. |
| 891 OnWindowResized(); | 889 OnWindowResized(); |
| 892 } | 890 } |
| 893 | 891 |
| 894 } // namespace internal | 892 } // namespace internal |
| 895 } // namespace ash | 893 } // namespace ash |
| OLD | NEW |