| 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/screen_util.h" | 10 #include "ash/screen_util.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 const int kCalloutFadeDurationMilliseconds = 50; | 50 const int kCalloutFadeDurationMilliseconds = 50; |
| 51 | 51 |
| 52 // Offset used when sliding panel in/out of the shelf. 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 // When a window layer gets hidden, and the window remains "logically visible", |
| 61 // it is illegal to fade the layer to 0. We therefore use a fraction which is |
| 62 // resolving to an alpha of 0 but tells a comparison otherwise. |
| 63 const float kWindowLayerNotShown = 0.001f; |
| 64 |
| 60 class CalloutWidgetBackground : public views::Background { | 65 class CalloutWidgetBackground : public views::Background { |
| 61 public: | 66 public: |
| 62 CalloutWidgetBackground() : alignment_(SHELF_ALIGNMENT_BOTTOM) { | 67 CalloutWidgetBackground() : alignment_(SHELF_ALIGNMENT_BOTTOM) { |
| 63 } | 68 } |
| 64 | 69 |
| 65 virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { | 70 virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { |
| 66 SkPath path; | 71 SkPath path; |
| 67 switch (alignment_) { | 72 switch (alignment_) { |
| 68 case SHELF_ALIGNMENT_BOTTOM: | 73 case SHELF_ALIGNMENT_BOTTOM: |
| 69 path.moveTo(SkIntToScalar(0), SkIntToScalar(0)); | 74 path.moveTo(SkIntToScalar(0), SkIntToScalar(0)); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 params.bounds.set_width(kArrowWidth); | 241 params.bounds.set_width(kArrowWidth); |
| 237 params.bounds.set_height(kArrowHeight); | 242 params.bounds.set_height(kArrowHeight); |
| 238 // Why do we need this and can_activate = false? | 243 // Why do we need this and can_activate = false? |
| 239 set_focus_on_creation(false); | 244 set_focus_on_creation(false); |
| 240 Init(params); | 245 Init(params); |
| 241 DCHECK_EQ(GetNativeView()->GetRootWindow(), parent->GetRootWindow()); | 246 DCHECK_EQ(GetNativeView()->GetRootWindow(), parent->GetRootWindow()); |
| 242 views::View* content_view = new views::View; | 247 views::View* content_view = new views::View; |
| 243 background_ = new CalloutWidgetBackground; | 248 background_ = new CalloutWidgetBackground; |
| 244 content_view->set_background(background_); | 249 content_view->set_background(background_); |
| 245 SetContentsView(content_view); | 250 SetContentsView(content_view); |
| 246 GetNativeWindow()->layer()->SetOpacity(0); | 251 GetNativeWindow()->layer()->SetOpacity(kWindowLayerNotShown); |
| 247 } | 252 } |
| 248 | 253 |
| 249 // Weak pointer owned by this widget's content view. | 254 // Weak pointer owned by this widget's content view. |
| 250 CalloutWidgetBackground* background_; | 255 CalloutWidgetBackground* background_; |
| 251 | 256 |
| 252 DISALLOW_COPY_AND_ASSIGN(PanelCalloutWidget); | 257 DISALLOW_COPY_AND_ASSIGN(PanelCalloutWidget); |
| 253 }; | 258 }; |
| 254 | 259 |
| 255 //////////////////////////////////////////////////////////////////////////////// | 260 //////////////////////////////////////////////////////////////////////////////// |
| 256 // PanelLayoutManager public implementation: | 261 // PanelLayoutManager public implementation: |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 wm::ReparentTransientChildrenOfChild(child, old_parent, child->parent()); | 364 wm::ReparentTransientChildrenOfChild(child, old_parent, child->parent()); |
| 360 DCHECK(child->parent()->id() != kShellWindowId_PanelContainer); | 365 DCHECK(child->parent()->id() != kShellWindowId_PanelContainer); |
| 361 return; | 366 return; |
| 362 } | 367 } |
| 363 PanelInfo panel_info; | 368 PanelInfo panel_info; |
| 364 panel_info.window = child; | 369 panel_info.window = child; |
| 365 panel_info.callout_widget = new PanelCalloutWidget(panel_container_); | 370 panel_info.callout_widget = new PanelCalloutWidget(panel_container_); |
| 366 if (child != dragged_panel_) { | 371 if (child != dragged_panel_) { |
| 367 // Set the panel to 0 opacity until it has been positioned to prevent it | 372 // Set the panel to 0 opacity until it has been positioned to prevent it |
| 368 // from flashing briefly at position (0, 0). | 373 // from flashing briefly at position (0, 0). |
| 369 child->layer()->SetOpacity(0); | 374 child->layer()->SetOpacity(kWindowLayerNotShown); |
| 370 panel_info.slide_in = true; | 375 panel_info.slide_in = true; |
| 371 } | 376 } |
| 372 panel_windows_.push_back(panel_info); | 377 panel_windows_.push_back(panel_info); |
| 373 child->AddObserver(this); | 378 child->AddObserver(this); |
| 374 wm::GetWindowState(child)->AddObserver(this); | 379 wm::GetWindowState(child)->AddObserver(this); |
| 375 Relayout(); | 380 Relayout(); |
| 376 } | 381 } |
| 377 | 382 |
| 378 void PanelLayoutManager::OnWillRemoveWindowFromLayout(aura::Window* child) { | 383 void PanelLayoutManager::OnWillRemoveWindowFromLayout(aura::Window* child) { |
| 379 } | 384 } |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 panel_slide_settings.SetTransitionDuration( | 559 panel_slide_settings.SetTransitionDuration( |
| 555 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); | 560 base::TimeDelta::FromMilliseconds(kPanelSlideDurationMilliseconds)); |
| 556 gfx::Rect bounds(panel->bounds()); | 561 gfx::Rect bounds(panel->bounds()); |
| 557 bounds.Offset(GetSlideInAnimationOffset( | 562 bounds.Offset(GetSlideInAnimationOffset( |
| 558 shelf_->shelf_widget()->GetAlignment())); | 563 shelf_->shelf_widget()->GetAlignment())); |
| 559 SetChildBoundsDirect(panel, bounds); | 564 SetChildBoundsDirect(panel, bounds); |
| 560 panel->Hide(); | 565 panel->Hide(); |
| 561 PanelList::iterator found = | 566 PanelList::iterator found = |
| 562 std::find(panel_windows_.begin(), panel_windows_.end(), panel); | 567 std::find(panel_windows_.begin(), panel_windows_.end(), panel); |
| 563 if (found != panel_windows_.end()) { | 568 if (found != panel_windows_.end()) { |
| 564 layer->SetOpacity(0); | 569 layer->SetOpacity(kWindowLayerNotShown); |
| 565 // The next time the window is visible it should slide into place. | 570 // The next time the window is visible it should slide into place. |
| 566 found->slide_in = true; | 571 found->slide_in = true; |
| 567 } | 572 } |
| 568 if (wm::IsActiveWindow(panel)) | 573 if (wm::IsActiveWindow(panel)) |
| 569 wm::DeactivateWindow(panel); | 574 wm::DeactivateWindow(panel); |
| 570 Relayout(); | 575 Relayout(); |
| 571 } | 576 } |
| 572 | 577 |
| 573 void PanelLayoutManager::RestorePanel(aura::Window* panel) { | 578 void PanelLayoutManager::RestorePanel(aura::Window* panel) { |
| 574 panel->Show(); | 579 panel->Show(); |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 panel); | 855 panel); |
| 851 callout_widget->Show(); | 856 callout_widget->Show(); |
| 852 | 857 |
| 853 ui::Layer* layer = callout_widget->GetNativeWindow()->layer(); | 858 ui::Layer* layer = callout_widget->GetNativeWindow()->layer(); |
| 854 // If the panel is not over the callout position or has just become visible | 859 // If the panel is not over the callout position or has just become visible |
| 855 // then fade in the callout. | 860 // then fade in the callout. |
| 856 if ((distance_until_over_panel > 0 || layer->GetTargetOpacity() < 1) && | 861 if ((distance_until_over_panel > 0 || layer->GetTargetOpacity() < 1) && |
| 857 panel->layer()->GetTargetTransform().IsIdentity()) { | 862 panel->layer()->GetTargetTransform().IsIdentity()) { |
| 858 if (distance_until_over_panel > 0 && | 863 if (distance_until_over_panel > 0 && |
| 859 slide_distance >= distance_until_over_panel) { | 864 slide_distance >= distance_until_over_panel) { |
| 860 layer->SetOpacity(0); | 865 layer->SetOpacity(kWindowLayerNotShown); |
| 861 // If the panel is not yet over the callout, then delay fading in | 866 // If the panel is not yet over the callout, then delay fading in |
| 862 // the callout until after the panel should be over it. | 867 // the callout until after the panel should be over it. |
| 863 int delay = kPanelSlideDurationMilliseconds * | 868 int delay = kPanelSlideDurationMilliseconds * |
| 864 distance_until_over_panel / slide_distance; | 869 distance_until_over_panel / slide_distance; |
| 865 layer->SetOpacity(0); | 870 layer->SetOpacity(kWindowLayerNotShown); |
| 866 layer->GetAnimator()->StopAnimating(); | 871 layer->GetAnimator()->StopAnimating(); |
| 867 layer->GetAnimator()->SchedulePauseForProperties( | 872 layer->GetAnimator()->SchedulePauseForProperties( |
| 868 base::TimeDelta::FromMilliseconds(delay), | 873 base::TimeDelta::FromMilliseconds(delay), |
| 869 ui::LayerAnimationElement::OPACITY); | 874 ui::LayerAnimationElement::OPACITY); |
| 870 } | 875 } |
| 871 { | 876 { |
| 872 ui::ScopedLayerAnimationSettings callout_settings(layer->GetAnimator()); | 877 ui::ScopedLayerAnimationSettings callout_settings(layer->GetAnimator()); |
| 873 callout_settings.SetPreemptionStrategy( | 878 callout_settings.SetPreemptionStrategy( |
| 874 ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); | 879 ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); |
| 875 callout_settings.SetTransitionDuration( | 880 callout_settings.SetTransitionDuration( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 886 | 891 |
| 887 void PanelLayoutManager::OnKeyboardBoundsChanging( | 892 void PanelLayoutManager::OnKeyboardBoundsChanging( |
| 888 const gfx::Rect& keyboard_bounds) { | 893 const gfx::Rect& keyboard_bounds) { |
| 889 // This bounds change will have caused a change to the Shelf which does not | 894 // This bounds change will have caused a change to the Shelf which does not |
| 890 // propogate automatically to this class, so manually recalculate bounds. | 895 // propogate automatically to this class, so manually recalculate bounds. |
| 891 OnWindowResized(); | 896 OnWindowResized(); |
| 892 } | 897 } |
| 893 | 898 |
| 894 } // namespace internal | 899 } // namespace internal |
| 895 } // namespace ash | 900 } // namespace ash |
| OLD | NEW |