OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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/common/shelf/shelf_widget.h" | 5 #include "ash/common/shelf/shelf_widget.h" |
6 | 6 |
7 #include "ash/common/focus_cycler.h" | 7 #include "ash/common/focus_cycler.h" |
8 #include "ash/common/material_design/material_design_controller.h" | |
9 #include "ash/common/session/session_state_delegate.h" | 8 #include "ash/common/session/session_state_delegate.h" |
10 #include "ash/common/shelf/app_list_button.h" | 9 #include "ash/common/shelf/app_list_button.h" |
11 #include "ash/common/shelf/shelf_background_animator_observer.h" | 10 #include "ash/common/shelf/shelf_background_animator_observer.h" |
12 #include "ash/common/shelf/shelf_constants.h" | 11 #include "ash/common/shelf/shelf_constants.h" |
13 #include "ash/common/shelf/shelf_delegate.h" | 12 #include "ash/common/shelf/shelf_delegate.h" |
14 #include "ash/common/shelf/shelf_layout_manager.h" | 13 #include "ash/common/shelf/shelf_layout_manager.h" |
15 #include "ash/common/shelf/shelf_view.h" | 14 #include "ash/common/shelf/shelf_view.h" |
16 #include "ash/common/shelf/wm_shelf.h" | 15 #include "ash/common/shelf/wm_shelf.h" |
17 #include "ash/common/shelf/wm_shelf_util.h" | 16 #include "ash/common/shelf/wm_shelf_util.h" |
18 #include "ash/common/system/status_area_layout_manager.h" | 17 #include "ash/common/system/status_area_layout_manager.h" |
19 #include "ash/common/system/status_area_widget.h" | 18 #include "ash/common/system/status_area_widget.h" |
20 #include "ash/common/wm_lookup.h" | 19 #include "ash/common/wm_lookup.h" |
21 #include "ash/common/wm_shell.h" | 20 #include "ash/common/wm_shell.h" |
22 #include "ash/common/wm_window.h" | 21 #include "ash/common/wm_window.h" |
23 #include "ash/common/wm_window_property.h" | 22 #include "ash/common/wm_window_property.h" |
24 #include "ash/root_window_controller.h" | 23 #include "ash/root_window_controller.h" |
25 #include "base/memory/ptr_util.h" | 24 #include "base/memory/ptr_util.h" |
26 #include "grit/ash_resources.h" | |
27 #include "ui/base/resource/resource_bundle.h" | |
28 #include "ui/compositor/layer.h" | 25 #include "ui/compositor/layer.h" |
29 #include "ui/compositor/scoped_layer_animation_settings.h" | 26 #include "ui/compositor/scoped_layer_animation_settings.h" |
30 #include "ui/gfx/canvas.h" | |
31 #include "ui/gfx/image/image.h" | |
32 #include "ui/gfx/image/image_skia_operations.h" | |
33 #include "ui/gfx/skbitmap_operations.h" | 27 #include "ui/gfx/skbitmap_operations.h" |
34 #include "ui/views/accessible_pane_view.h" | 28 #include "ui/views/accessible_pane_view.h" |
35 #include "ui/views/layout/fill_layout.h" | 29 #include "ui/views/layout/fill_layout.h" |
36 #include "ui/views/widget/widget.h" | 30 #include "ui/views/widget/widget.h" |
37 #include "ui/views/widget/widget_delegate.h" | 31 #include "ui/views/widget/widget_delegate.h" |
38 | 32 |
39 namespace ash { | 33 namespace ash { |
40 | 34 |
41 namespace { | |
42 | |
43 // Size of black border at bottom (or side) of shelf. | |
44 const int kNumBlackPixels = 3; | |
45 | |
46 } // namespace | |
47 | |
48 // The contents view of the Shelf. This view contains ShelfView and | 35 // The contents view of the Shelf. This view contains ShelfView and |
49 // sizes it to the width of the shelf minus the size of the status area. | 36 // sizes it to the width of the shelf minus the size of the status area. |
50 class ShelfWidget::DelegateView : public views::WidgetDelegate, | 37 class ShelfWidget::DelegateView : public views::WidgetDelegate, |
51 public views::AccessiblePaneView, | 38 public views::AccessiblePaneView, |
52 public ShelfBackgroundAnimatorObserver { | 39 public ShelfBackgroundAnimatorObserver { |
53 public: | 40 public: |
54 DelegateView(WmShelf* wm_shelf, ShelfWidget* shelf); | 41 explicit DelegateView(ShelfWidget* shelf); |
55 ~DelegateView() override; | 42 ~DelegateView() override; |
56 | 43 |
57 void set_focus_cycler(FocusCycler* focus_cycler) { | 44 void set_focus_cycler(FocusCycler* focus_cycler) { |
58 focus_cycler_ = focus_cycler; | 45 focus_cycler_ = focus_cycler; |
59 } | 46 } |
60 FocusCycler* focus_cycler() { return focus_cycler_; } | 47 FocusCycler* focus_cycler() { return focus_cycler_; } |
61 | 48 |
62 ui::Layer* opaque_background() { return &opaque_background_; } | 49 ui::Layer* opaque_background() { return &opaque_background_; } |
63 ui::Layer* opaque_foreground() { return &opaque_foreground_; } | 50 ui::Layer* opaque_foreground() { return &opaque_foreground_; } |
64 | 51 |
65 void SetParentLayer(ui::Layer* layer); | 52 void SetParentLayer(ui::Layer* layer); |
66 | 53 |
67 // views::View overrides: | |
68 void OnPaintBackground(gfx::Canvas* canvas) override; | |
69 | |
70 // views::WidgetDelegateView overrides: | 54 // views::WidgetDelegateView overrides: |
71 views::Widget* GetWidget() override { return View::GetWidget(); } | 55 views::Widget* GetWidget() override { return View::GetWidget(); } |
72 const views::Widget* GetWidget() const override { return View::GetWidget(); } | 56 const views::Widget* GetWidget() const override { return View::GetWidget(); } |
73 | 57 |
74 bool CanActivate() const override; | 58 bool CanActivate() const override; |
75 void ReorderChildLayers(ui::Layer* parent_layer) override; | 59 void ReorderChildLayers(ui::Layer* parent_layer) override; |
76 // This will be called when the parent local bounds change. | 60 // This will be called when the parent local bounds change. |
77 void OnBoundsChanged(const gfx::Rect& old_bounds) override; | 61 void OnBoundsChanged(const gfx::Rect& old_bounds) override; |
78 | 62 |
79 // ShelfBackgroundAnimatorObserver: | 63 // ShelfBackgroundAnimatorObserver: |
80 void UpdateShelfOpaqueBackground(int alpha) override; | 64 void UpdateShelfOpaqueBackground(int alpha) override; |
81 void UpdateShelfAssetBackground(int alpha) override; | |
82 | 65 |
83 private: | 66 private: |
84 WmShelf* wm_shelf_; | |
85 ShelfWidget* shelf_widget_; | 67 ShelfWidget* shelf_widget_; |
86 FocusCycler* focus_cycler_; | 68 FocusCycler* focus_cycler_; |
87 int asset_background_alpha_; | |
88 // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551). | 69 // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551). |
89 // A black background layer which is shown when a maximized window is visible. | 70 // A black background layer which is shown when a maximized window is visible. |
90 ui::Layer opaque_background_; | 71 ui::Layer opaque_background_; |
91 // A black foreground layer which is shown while transitioning between users. | 72 // A black foreground layer which is shown while transitioning between users. |
92 // Note: Since the back- and foreground layers have different functions they | 73 // Note: Since the back- and foreground layers have different functions they |
93 // can be used simultaneously - so no repurposing possible. | 74 // can be used simultaneously - so no repurposing possible. |
94 ui::Layer opaque_foreground_; | 75 ui::Layer opaque_foreground_; |
95 | 76 |
96 DISALLOW_COPY_AND_ASSIGN(DelegateView); | 77 DISALLOW_COPY_AND_ASSIGN(DelegateView); |
97 }; | 78 }; |
98 | 79 |
99 ShelfWidget::DelegateView::DelegateView(WmShelf* wm_shelf, | 80 ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf_widget) |
100 ShelfWidget* shelf_widget) | 81 : shelf_widget_(shelf_widget), |
101 : wm_shelf_(wm_shelf), | |
102 shelf_widget_(shelf_widget), | |
103 focus_cycler_(nullptr), | 82 focus_cycler_(nullptr), |
104 asset_background_alpha_(0), | |
105 opaque_background_(ui::LAYER_SOLID_COLOR), | 83 opaque_background_(ui::LAYER_SOLID_COLOR), |
106 opaque_foreground_(ui::LAYER_SOLID_COLOR) { | 84 opaque_foreground_(ui::LAYER_SOLID_COLOR) { |
107 DCHECK(wm_shelf_); | |
108 DCHECK(shelf_widget_); | 85 DCHECK(shelf_widget_); |
109 SetLayoutManager(new views::FillLayout()); | 86 SetLayoutManager(new views::FillLayout()); |
110 set_allow_deactivate_on_esc(true); | 87 set_allow_deactivate_on_esc(true); |
111 opaque_background_.SetColor(SK_ColorBLACK); | 88 opaque_background_.SetColor(SK_ColorBLACK); |
112 opaque_background_.SetBounds(GetLocalBounds()); | 89 opaque_background_.SetBounds(GetLocalBounds()); |
113 opaque_background_.SetOpacity(0.0f); | 90 opaque_background_.SetOpacity(0.0f); |
114 opaque_foreground_.SetColor(SK_ColorBLACK); | 91 opaque_foreground_.SetColor(SK_ColorBLACK); |
115 opaque_foreground_.SetBounds(GetLocalBounds()); | 92 opaque_foreground_.SetBounds(GetLocalBounds()); |
116 opaque_foreground_.SetOpacity(0.0f); | 93 opaque_foreground_.SetOpacity(0.0f); |
117 } | 94 } |
118 | 95 |
119 ShelfWidget::DelegateView::~DelegateView() {} | 96 ShelfWidget::DelegateView::~DelegateView() {} |
120 | 97 |
121 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { | 98 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { |
122 layer->Add(&opaque_background_); | 99 layer->Add(&opaque_background_); |
123 layer->Add(&opaque_foreground_); | 100 layer->Add(&opaque_foreground_); |
124 ReorderLayers(); | 101 ReorderLayers(); |
125 } | 102 } |
126 | 103 |
127 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { | |
128 if (MaterialDesignController::IsShelfMaterial()) | |
129 return; | |
130 | |
131 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | |
132 gfx::ImageSkia shelf_background = | |
133 *rb->GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); | |
134 const bool horizontal = wm_shelf_->IsHorizontalAlignment(); | |
135 if (!horizontal) { | |
136 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( | |
137 shelf_background, wm_shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT | |
138 ? SkBitmapOperations::ROTATION_90_CW | |
139 : SkBitmapOperations::ROTATION_270_CW); | |
140 } | |
141 const gfx::Rect dock_bounds( | |
142 shelf_widget_->shelf_layout_manager()->dock_bounds()); | |
143 cc::PaintFlags flags; | |
144 flags.setAlpha(asset_background_alpha_); | |
145 canvas->DrawImageInt( | |
146 shelf_background, 0, 0, shelf_background.width(), | |
147 shelf_background.height(), | |
148 (horizontal && dock_bounds.x() == 0 && dock_bounds.width() > 0) | |
149 ? dock_bounds.width() | |
150 : 0, | |
151 0, horizontal ? width() - dock_bounds.width() : width(), height(), false, | |
152 flags); | |
153 if (horizontal && dock_bounds.width() > 0) { | |
154 // The part of the shelf background that is in the corner below the docked | |
155 // windows close to the work area is an arched gradient that blends | |
156 // vertically oriented docked background and horizontal shelf. | |
157 gfx::ImageSkia shelf_corner = *rb->GetImageSkiaNamed(IDR_ASH_SHELF_CORNER); | |
158 if (dock_bounds.x() == 0) { | |
159 shelf_corner = gfx::ImageSkiaOperations::CreateRotatedImage( | |
160 shelf_corner, SkBitmapOperations::ROTATION_90_CW); | |
161 } | |
162 canvas->DrawImageInt( | |
163 shelf_corner, 0, 0, shelf_corner.width(), shelf_corner.height(), | |
164 dock_bounds.x() > 0 ? dock_bounds.x() : dock_bounds.width() - height(), | |
165 0, height(), height(), false, flags); | |
166 // The part of the shelf background that is just below the docked windows | |
167 // is drawn using the last (lowest) 1-pixel tall strip of the image asset. | |
168 // This avoids showing the border 3D shadow between the shelf and the | |
169 // dock. | |
170 canvas->DrawImageInt(shelf_background, 0, shelf_background.height() - 1, | |
171 shelf_background.width(), 1, | |
172 dock_bounds.x() > 0 ? dock_bounds.x() + height() : 0, | |
173 0, dock_bounds.width() - height(), height(), false, | |
174 flags); | |
175 } | |
176 gfx::Rect black_rect = | |
177 shelf_widget_->shelf_layout_manager()->SelectValueForShelfAlignment( | |
178 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), | |
179 gfx::Rect(0, 0, kNumBlackPixels, height()), | |
180 gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height())); | |
181 canvas->FillRect(black_rect, SK_ColorBLACK); | |
182 } | |
183 | |
184 bool ShelfWidget::DelegateView::CanActivate() const { | 104 bool ShelfWidget::DelegateView::CanActivate() const { |
185 // Allow to activate as fallback. | 105 // Allow to activate as fallback. |
186 if (shelf_widget_->activating_as_fallback_) | 106 if (shelf_widget_->activating_as_fallback_) |
187 return true; | 107 return true; |
188 // Allow to activate from the focus cycler. | 108 // Allow to activate from the focus cycler. |
189 if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) | 109 if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) |
190 return true; | 110 return true; |
191 // Disallow activating in other cases, especially when using mouse. | 111 // Disallow activating in other cases, especially when using mouse. |
192 return false; | 112 return false; |
193 } | 113 } |
194 | 114 |
195 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { | 115 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { |
196 views::View::ReorderChildLayers(parent_layer); | 116 views::View::ReorderChildLayers(parent_layer); |
197 parent_layer->StackAtBottom(&opaque_background_); | 117 parent_layer->StackAtBottom(&opaque_background_); |
198 parent_layer->StackAtTop(&opaque_foreground_); | 118 parent_layer->StackAtTop(&opaque_foreground_); |
199 } | 119 } |
200 | 120 |
201 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { | 121 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { |
202 opaque_background_.SetBounds(GetLocalBounds()); | 122 opaque_background_.SetBounds(GetLocalBounds()); |
203 opaque_foreground_.SetBounds(GetLocalBounds()); | 123 opaque_foreground_.SetBounds(GetLocalBounds()); |
204 } | 124 } |
205 | 125 |
206 void ShelfWidget::DelegateView::UpdateShelfOpaqueBackground(int alpha) { | 126 void ShelfWidget::DelegateView::UpdateShelfOpaqueBackground(int alpha) { |
207 const float kMaxAlpha = 255.0f; | 127 const float kMaxAlpha = 255.0f; |
208 opaque_background_.SetOpacity(alpha / kMaxAlpha); | 128 opaque_background_.SetOpacity(alpha / kMaxAlpha); |
209 } | 129 } |
210 | 130 |
211 void ShelfWidget::DelegateView::UpdateShelfAssetBackground(int alpha) { | |
212 asset_background_alpha_ = alpha; | |
213 SchedulePaint(); | |
214 } | |
215 | |
216 ShelfWidget::ShelfWidget(WmWindow* shelf_container, WmShelf* wm_shelf) | 131 ShelfWidget::ShelfWidget(WmWindow* shelf_container, WmShelf* wm_shelf) |
217 : wm_shelf_(wm_shelf), | 132 : wm_shelf_(wm_shelf), |
218 status_area_widget_(nullptr), | 133 status_area_widget_(nullptr), |
219 delegate_view_(new DelegateView(wm_shelf, this)), | 134 delegate_view_(new DelegateView(this)), |
220 shelf_view_(nullptr), | 135 shelf_view_(nullptr), |
221 background_animator_(SHELF_BACKGROUND_DEFAULT, wm_shelf_), | 136 background_animator_(SHELF_BACKGROUND_DEFAULT, wm_shelf_), |
222 activating_as_fallback_(false) { | 137 activating_as_fallback_(false) { |
223 DCHECK(wm_shelf_); | 138 DCHECK(wm_shelf_); |
224 background_animator_.AddObserver(this); | 139 background_animator_.AddObserver(this); |
225 background_animator_.AddObserver(delegate_view_); | 140 background_animator_.AddObserver(delegate_view_); |
226 | 141 |
227 views::Widget::InitParams params( | 142 views::Widget::InitParams params( |
228 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 143 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
229 params.name = "ShelfWidget"; | 144 params.name = "ShelfWidget"; |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 if (shelf_view_) | 349 if (shelf_view_) |
435 shelf_view_->UpdateShelfItemBackground(alpha); | 350 shelf_view_->UpdateShelfItemBackground(alpha); |
436 } | 351 } |
437 | 352 |
438 void ShelfWidget::WillDeleteShelfLayoutManager() { | 353 void ShelfWidget::WillDeleteShelfLayoutManager() { |
439 shelf_layout_manager_->RemoveObserver(this); | 354 shelf_layout_manager_->RemoveObserver(this); |
440 shelf_layout_manager_ = nullptr; | 355 shelf_layout_manager_ = nullptr; |
441 } | 356 } |
442 | 357 |
443 } // namespace ash | 358 } // namespace ash |
OLD | NEW |