Index: ash/common/shelf/shelf_widget.cc |
diff --git a/ash/common/shelf/shelf_widget.cc b/ash/common/shelf/shelf_widget.cc |
deleted file mode 100644 |
index 0bbfb54a509dccfa82daa27511d513f80e383e18..0000000000000000000000000000000000000000 |
--- a/ash/common/shelf/shelf_widget.cc |
+++ /dev/null |
@@ -1,358 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ash/common/shelf/shelf_widget.h" |
- |
-#include "ash/animation/animation_change_type.h" |
-#include "ash/common/focus_cycler.h" |
-#include "ash/common/session/session_state_delegate.h" |
-#include "ash/common/shelf/app_list_button.h" |
-#include "ash/common/shelf/shelf_background_animator_observer.h" |
-#include "ash/common/shelf/shelf_constants.h" |
-#include "ash/common/shelf/shelf_delegate.h" |
-#include "ash/common/shelf/shelf_layout_manager.h" |
-#include "ash/common/shelf/shelf_view.h" |
-#include "ash/common/shelf/wm_shelf.h" |
-#include "ash/common/shelf/wm_shelf_util.h" |
-#include "ash/common/wm_shell.h" |
-#include "ash/common/wm_window.h" |
-#include "ash/root_window_controller.h" |
-#include "ash/system/status_area_layout_manager.h" |
-#include "ash/system/status_area_widget.h" |
-#include "ash/wm/window_properties.h" |
-#include "base/memory/ptr_util.h" |
-#include "ui/compositor/layer.h" |
-#include "ui/compositor/scoped_layer_animation_settings.h" |
-#include "ui/gfx/skbitmap_operations.h" |
-#include "ui/views/accessible_pane_view.h" |
-#include "ui/views/layout/fill_layout.h" |
-#include "ui/views/widget/widget.h" |
-#include "ui/views/widget/widget_delegate.h" |
- |
-namespace ash { |
- |
-// The contents view of the Shelf. This view contains ShelfView and |
-// sizes it to the width of the shelf minus the size of the status area. |
-class ShelfWidget::DelegateView : public views::WidgetDelegate, |
- public views::AccessiblePaneView, |
- public ShelfBackgroundAnimatorObserver { |
- public: |
- explicit DelegateView(ShelfWidget* shelf); |
- ~DelegateView() override; |
- |
- void set_focus_cycler(FocusCycler* focus_cycler) { |
- focus_cycler_ = focus_cycler; |
- } |
- FocusCycler* focus_cycler() { return focus_cycler_; } |
- |
- ui::Layer* opaque_background() { return &opaque_background_; } |
- ui::Layer* opaque_foreground() { return &opaque_foreground_; } |
- |
- void SetParentLayer(ui::Layer* layer); |
- |
- // views::WidgetDelegateView overrides: |
- views::Widget* GetWidget() override { return View::GetWidget(); } |
- const views::Widget* GetWidget() const override { return View::GetWidget(); } |
- |
- bool CanActivate() const override; |
- void ReorderChildLayers(ui::Layer* parent_layer) override; |
- // This will be called when the parent local bounds change. |
- void OnBoundsChanged(const gfx::Rect& old_bounds) override; |
- |
- // ShelfBackgroundAnimatorObserver: |
- void UpdateShelfBackground(SkColor color) override; |
- |
- private: |
- ShelfWidget* shelf_widget_; |
- FocusCycler* focus_cycler_; |
- // A black background layer that may be visible depending on a |
- // ShelfBackgroundAnimator. |
- // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551). |
- ui::Layer opaque_background_; |
- // A black foreground layer which is shown while transitioning between users. |
- // Note: Since the back- and foreground layers have different functions they |
- // can be used simultaneously - so no repurposing possible. |
- ui::Layer opaque_foreground_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DelegateView); |
-}; |
- |
-ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf_widget) |
- : shelf_widget_(shelf_widget), |
- focus_cycler_(nullptr), |
- opaque_background_(ui::LAYER_SOLID_COLOR), |
- opaque_foreground_(ui::LAYER_SOLID_COLOR) { |
- DCHECK(shelf_widget_); |
- SetLayoutManager(new views::FillLayout()); |
- set_allow_deactivate_on_esc(true); |
- opaque_background_.SetColor(SK_ColorBLACK); |
- opaque_background_.SetBounds(GetLocalBounds()); |
- opaque_foreground_.SetColor(SK_ColorBLACK); |
- opaque_foreground_.SetBounds(GetLocalBounds()); |
- opaque_foreground_.SetOpacity(0.0f); |
-} |
- |
-ShelfWidget::DelegateView::~DelegateView() {} |
- |
-void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { |
- layer->Add(&opaque_background_); |
- layer->Add(&opaque_foreground_); |
- ReorderLayers(); |
-} |
- |
-bool ShelfWidget::DelegateView::CanActivate() const { |
- // Allow to activate as fallback. |
- if (shelf_widget_->activating_as_fallback_) |
- return true; |
- // Allow to activate from the focus cycler. |
- if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) |
- return true; |
- // Disallow activating in other cases, especially when using mouse. |
- return false; |
-} |
- |
-void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { |
- views::View::ReorderChildLayers(parent_layer); |
- parent_layer->StackAtBottom(&opaque_background_); |
- parent_layer->StackAtTop(&opaque_foreground_); |
-} |
- |
-void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { |
- opaque_background_.SetBounds(GetLocalBounds()); |
- opaque_foreground_.SetBounds(GetLocalBounds()); |
-} |
- |
-void ShelfWidget::DelegateView::UpdateShelfBackground(SkColor color) { |
- opaque_background_.SetColor(color); |
-} |
- |
-ShelfWidget::ShelfWidget(WmWindow* shelf_container, WmShelf* wm_shelf) |
- : wm_shelf_(wm_shelf), |
- status_area_widget_(nullptr), |
- delegate_view_(new DelegateView(this)), |
- shelf_view_(nullptr), |
- background_animator_(SHELF_BACKGROUND_DEFAULT, |
- wm_shelf_, |
- WmShell::Get()->wallpaper_controller()), |
- activating_as_fallback_(false) { |
- DCHECK(wm_shelf_); |
- background_animator_.AddObserver(this); |
- background_animator_.AddObserver(delegate_view_); |
- |
- views::Widget::InitParams params( |
- views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
- params.name = "ShelfWidget"; |
- params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
- params.delegate = delegate_view_; |
- shelf_container->GetRootWindowController() |
- ->ConfigureWidgetInitParamsForContainer( |
- this, shelf_container->GetShellWindowId(), ¶ms); |
- Init(params); |
- |
- // The shelf should not take focus when initially shown. |
- set_focus_on_creation(false); |
- SetContentsView(delegate_view_); |
- delegate_view_->SetParentLayer(GetLayer()); |
- |
- shelf_layout_manager_ = new ShelfLayoutManager(this, wm_shelf_); |
- shelf_layout_manager_->AddObserver(this); |
- shelf_container->SetLayoutManager(base::WrapUnique(shelf_layout_manager_)); |
- background_animator_.PaintBackground( |
- shelf_layout_manager_->GetShelfBackgroundType(), |
- AnimationChangeType::IMMEDIATE); |
- |
- views::Widget::AddObserver(this); |
-} |
- |
-ShelfWidget::~ShelfWidget() { |
- // Must call Shutdown() before destruction. |
- DCHECK(!status_area_widget_); |
- WmShell::Get()->focus_cycler()->RemoveWidget(this); |
- SetFocusCycler(nullptr); |
- RemoveObserver(this); |
- background_animator_.RemoveObserver(delegate_view_); |
- background_animator_.RemoveObserver(this); |
-} |
- |
-void ShelfWidget::CreateStatusAreaWidget(WmWindow* status_container) { |
- DCHECK(status_container); |
- DCHECK(!status_area_widget_); |
- // TODO(jamescook): Move ownership to RootWindowController. |
- status_area_widget_ = new StatusAreaWidget(status_container, wm_shelf_); |
- status_area_widget_->CreateTrayViews(); |
- if (WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted()) |
- status_area_widget_->Show(); |
- WmShell::Get()->focus_cycler()->AddWidget(status_area_widget_); |
- background_animator_.AddObserver(status_area_widget_); |
- status_container->SetLayoutManager( |
- base::MakeUnique<StatusAreaLayoutManager>(this)); |
-} |
- |
-void ShelfWidget::SetPaintsBackground(ShelfBackgroundType background_type, |
- AnimationChangeType change_type) { |
- background_animator_.PaintBackground(background_type, change_type); |
-} |
- |
-ShelfBackgroundType ShelfWidget::GetBackgroundType() const { |
- return background_animator_.target_background_type(); |
-} |
- |
-void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) { |
- if (IsShelfHiddenBehindBlackBar() == hide) |
- return; |
- |
- ui::Layer* opaque_foreground = delegate_view_->opaque_foreground(); |
- float target_opacity = hide ? 1.0f : 0.0f; |
- std::unique_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation; |
- opaque_foreground_animation.reset( |
- new ui::ScopedLayerAnimationSettings(opaque_foreground->GetAnimator())); |
- opaque_foreground_animation->SetTransitionDuration( |
- base::TimeDelta::FromMilliseconds(animation_time_ms)); |
- opaque_foreground_animation->SetPreemptionStrategy( |
- ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); |
- |
- opaque_foreground->SetOpacity(target_opacity); |
-} |
- |
-bool ShelfWidget::IsShelfHiddenBehindBlackBar() const { |
- return delegate_view_->opaque_foreground()->GetTargetOpacity() != 0.0f; |
-} |
- |
-void ShelfWidget::OnShelfAlignmentChanged() { |
- shelf_view_->OnShelfAlignmentChanged(); |
- // TODO(jamescook): Status area should not cache alignment. |
- status_area_widget_->SetShelfAlignment(wm_shelf_->GetAlignment()); |
- delegate_view_->SchedulePaint(); |
-} |
- |
-ShelfView* ShelfWidget::CreateShelfView() { |
- DCHECK(!shelf_view_); |
- |
- shelf_view_ = |
- new ShelfView(WmShell::Get()->shelf_model(), |
- WmShell::Get()->shelf_delegate(), wm_shelf_, this); |
- shelf_view_->Init(); |
- GetContentsView()->AddChildView(shelf_view_); |
- return shelf_view_; |
-} |
- |
-void ShelfWidget::PostCreateShelf() { |
- SetFocusCycler(WmShell::Get()->focus_cycler()); |
- |
- // Ensure the newly created |shelf_| gets current values. |
- background_animator_.NotifyObserver(this); |
- |
- // TODO(jamescook): The IsActiveUserSessionStarted() check may not be needed |
- // because the shelf is only created after the first user session is active. |
- // The ShelfView seems to always be visible after login. At the lock screen |
- // the shelf is hidden because its container is hidden. During auto-hide it is |
- // hidden because ShelfWidget is transparent. Some of the ShelfView visibility |
- // code could be simplified. http://crbug.com/674773 |
- shelf_view_->SetVisible( |
- WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted()); |
- shelf_layout_manager_->LayoutShelf(); |
- shelf_layout_manager_->UpdateAutoHideState(); |
- Show(); |
-} |
- |
-bool ShelfWidget::IsShelfVisible() const { |
- return shelf_view_ && shelf_view_->visible(); |
-} |
- |
-bool ShelfWidget::IsShowingAppList() const { |
- return GetAppListButton() && GetAppListButton()->is_showing_app_list(); |
-} |
- |
-bool ShelfWidget::IsShowingContextMenu() const { |
- return shelf_view_ && shelf_view_->IsShowingMenu(); |
-} |
- |
-bool ShelfWidget::IsShowingOverflowBubble() const { |
- return shelf_view_ && shelf_view_->IsShowingOverflowBubble(); |
-} |
- |
-void ShelfWidget::SetFocusCycler(FocusCycler* focus_cycler) { |
- delegate_view_->set_focus_cycler(focus_cycler); |
- if (focus_cycler) |
- focus_cycler->AddWidget(this); |
-} |
- |
-FocusCycler* ShelfWidget::GetFocusCycler() { |
- return delegate_view_->focus_cycler(); |
-} |
- |
-void ShelfWidget::Shutdown() { |
- // Shutting down the status area widget may cause some widgets (e.g. bubbles) |
- // to close, so uninstall the ShelfLayoutManager event filters first. Don't |
- // reset the pointer until later because other widgets (e.g. app list) may |
- // access it later in shutdown. |
- if (shelf_layout_manager_) |
- shelf_layout_manager_->PrepareForShutdown(); |
- |
- if (status_area_widget_) { |
- background_animator_.RemoveObserver(status_area_widget_); |
- WmShell::Get()->focus_cycler()->RemoveWidget(status_area_widget_); |
- status_area_widget_->Shutdown(); |
- status_area_widget_ = nullptr; |
- } |
- |
- CloseNow(); |
-} |
- |
-void ShelfWidget::UpdateIconPositionForPanel(WmWindow* panel) { |
- if (!shelf_view_) |
- return; |
- |
- WmWindow* shelf_window = WmWindow::Get(this->GetNativeWindow()); |
- shelf_view_->UpdatePanelIconPosition( |
- panel->aura_window()->GetProperty(kShelfIDKey), |
- shelf_window->ConvertRectFromScreen(panel->GetBoundsInScreen()) |
- .CenterPoint()); |
-} |
- |
-gfx::Rect ShelfWidget::GetScreenBoundsOfItemIconForWindow(WmWindow* window) { |
- // Window animations can be triggered during session restore before the shelf |
- // view is created. In that case, return default empty bounds. |
- if (!shelf_view_) |
- return gfx::Rect(); |
- |
- ShelfID id = window->aura_window()->GetProperty(kShelfIDKey); |
- gfx::Rect bounds(shelf_view_->GetIdealBoundsOfItemIcon(id)); |
- gfx::Point screen_origin; |
- views::View::ConvertPointToScreen(shelf_view_, &screen_origin); |
- return gfx::Rect(screen_origin.x() + bounds.x(), |
- screen_origin.y() + bounds.y(), bounds.width(), |
- bounds.height()); |
-} |
- |
-AppListButton* ShelfWidget::GetAppListButton() const { |
- return shelf_view_ ? shelf_view_->GetAppListButton() : nullptr; |
-} |
- |
-app_list::ApplicationDragAndDropHost* |
-ShelfWidget::GetDragAndDropHostForAppList() { |
- return shelf_view_; |
-} |
- |
-void ShelfWidget::OnWidgetActivationChanged(views::Widget* widget, |
- bool active) { |
- activating_as_fallback_ = false; |
- if (active) |
- delegate_view_->SetPaneFocusAndFocusDefault(); |
- else |
- delegate_view_->GetFocusManager()->ClearFocus(); |
-} |
- |
-void ShelfWidget::UpdateShelfItemBackground(SkColor color) { |
- if (shelf_view_) |
- shelf_view_->UpdateShelfItemBackground(color); |
-} |
- |
-void ShelfWidget::WillDeleteShelfLayoutManager() { |
- shelf_layout_manager_->RemoveObserver(this); |
- shelf_layout_manager_ = nullptr; |
-} |
- |
-} // namespace ash |