Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Side by Side Diff: ash/common/shelf/shelf_widget.cc

Issue 2550413004: Remove Ash shelf dimmer. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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" 8 #include "ash/common/material_design/material_design_controller.h"
9 #include "ash/common/session/session_state_delegate.h" 9 #include "ash/common/session/session_state_delegate.h"
10 #include "ash/common/shelf/app_list_button.h" 10 #include "ash/common/shelf/app_list_button.h"
11 #include "ash/common/shelf/shelf_background_animator_observer.h" 11 #include "ash/common/shelf/shelf_background_animator_observer.h"
12 #include "ash/common/shelf/shelf_constants.h" 12 #include "ash/common/shelf/shelf_constants.h"
13 #include "ash/common/shelf/shelf_delegate.h" 13 #include "ash/common/shelf/shelf_delegate.h"
14 #include "ash/common/shelf/shelf_layout_manager.h" 14 #include "ash/common/shelf/shelf_layout_manager.h"
15 #include "ash/common/shelf/shelf_view.h" 15 #include "ash/common/shelf/shelf_view.h"
16 #include "ash/common/shelf/wm_dimmer_view.h"
17 #include "ash/common/shelf/wm_shelf.h" 16 #include "ash/common/shelf/wm_shelf.h"
18 #include "ash/common/shelf/wm_shelf_util.h" 17 #include "ash/common/shelf/wm_shelf_util.h"
19 #include "ash/common/system/status_area_layout_manager.h" 18 #include "ash/common/system/status_area_layout_manager.h"
20 #include "ash/common/system/status_area_widget.h" 19 #include "ash/common/system/status_area_widget.h"
21 #include "ash/common/wm_lookup.h" 20 #include "ash/common/wm_lookup.h"
22 #include "ash/common/wm_root_window_controller.h" 21 #include "ash/common/wm_root_window_controller.h"
23 #include "ash/common/wm_shell.h" 22 #include "ash/common/wm_shell.h"
24 #include "ash/common/wm_window.h" 23 #include "ash/common/wm_window.h"
25 #include "ash/common/wm_window_property.h" 24 #include "ash/common/wm_window_property.h"
26 #include "base/memory/ptr_util.h" 25 #include "base/memory/ptr_util.h"
(...skipping 29 matching lines...) Expand all
56 ~DelegateView() override; 55 ~DelegateView() override;
57 56
58 void set_focus_cycler(FocusCycler* focus_cycler) { 57 void set_focus_cycler(FocusCycler* focus_cycler) {
59 focus_cycler_ = focus_cycler; 58 focus_cycler_ = focus_cycler;
60 } 59 }
61 FocusCycler* focus_cycler() { return focus_cycler_; } 60 FocusCycler* focus_cycler() { return focus_cycler_; }
62 61
63 ui::Layer* opaque_background() { return &opaque_background_; } 62 ui::Layer* opaque_background() { return &opaque_background_; }
64 ui::Layer* opaque_foreground() { return &opaque_foreground_; } 63 ui::Layer* opaque_foreground() { return &opaque_foreground_; }
65 64
66 // Set if the shelf area is dimmed (eg when a window is maximized).
67 void SetDimmed(bool dimmed);
68 bool GetDimmed() const;
69
70 void SetParentLayer(ui::Layer* layer); 65 void SetParentLayer(ui::Layer* layer);
71 66
72 // views::View overrides: 67 // views::View overrides:
73 void OnPaintBackground(gfx::Canvas* canvas) override; 68 void OnPaintBackground(gfx::Canvas* canvas) override;
74 69
75 // views::WidgetDelegateView overrides: 70 // views::WidgetDelegateView overrides:
76 views::Widget* GetWidget() override { return View::GetWidget(); } 71 views::Widget* GetWidget() override { return View::GetWidget(); }
77 const views::Widget* GetWidget() const override { return View::GetWidget(); } 72 const views::Widget* GetWidget() const override { return View::GetWidget(); }
78 73
79 bool CanActivate() const override; 74 bool CanActivate() const override;
80 void ReorderChildLayers(ui::Layer* parent_layer) override; 75 void ReorderChildLayers(ui::Layer* parent_layer) override;
81 // This will be called when the parent local bounds change. 76 // This will be called when the parent local bounds change.
82 void OnBoundsChanged(const gfx::Rect& old_bounds) override; 77 void OnBoundsChanged(const gfx::Rect& old_bounds) override;
83 78
84 // ShelfBackgroundAnimatorObserver: 79 // ShelfBackgroundAnimatorObserver:
85 void UpdateShelfOpaqueBackground(int alpha) override; 80 void UpdateShelfOpaqueBackground(int alpha) override;
86 void UpdateShelfAssetBackground(int alpha) override; 81 void UpdateShelfAssetBackground(int alpha) override;
87 82
88 // Force the shelf to be presented in an undimmed state.
89 void ForceUndimming(bool force);
90
91 // A function to test the current alpha used by the dimming bar. If there is
92 // no dimmer active, the function will return -1.
93 int GetDimmingAlphaForTest();
94
95 // A function to test the bounds of the dimming bar. Returns gfx::Rect() if
96 // the dimmer is inactive.
97 gfx::Rect GetDimmerBoundsForTest();
98
99 // Disable dimming animations for running tests. This needs to be called
100 // prior to the creation of of the dimmer.
101 void disable_dimming_animations_for_test() {
102 disable_dimming_animations_for_test_ = true;
103 }
104
105 private: 83 private:
106 WmShelf* wm_shelf_; 84 WmShelf* wm_shelf_;
107 ShelfWidget* shelf_widget_; 85 ShelfWidget* shelf_widget_;
108 FocusCycler* focus_cycler_; 86 FocusCycler* focus_cycler_;
109 int asset_background_alpha_; 87 int asset_background_alpha_;
110 // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551). 88 // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551).
111 // A black background layer which is shown when a maximized window is visible. 89 // A black background layer which is shown when a maximized window is visible.
112 ui::Layer opaque_background_; 90 ui::Layer opaque_background_;
113 // A black foreground layer which is shown while transitioning between users. 91 // A black foreground layer which is shown while transitioning between users.
114 // Note: Since the back- and foreground layers have different functions they 92 // Note: Since the back- and foreground layers have different functions they
115 // can be used simultaneously - so no repurposing possible. 93 // can be used simultaneously - so no repurposing possible.
116 ui::Layer opaque_foreground_; 94 ui::Layer opaque_foreground_;
117 95
118 // The interface for the view which does the dimming. Null if the shelf is not
119 // being dimmed, or if dimming is not supported (e.g. for mus).
120 WmDimmerView* dimmer_view_;
121
122 // True if dimming animations should be turned off.
123 bool disable_dimming_animations_for_test_;
124
125 DISALLOW_COPY_AND_ASSIGN(DelegateView); 96 DISALLOW_COPY_AND_ASSIGN(DelegateView);
126 }; 97 };
127 98
128 ShelfWidget::DelegateView::DelegateView(WmShelf* wm_shelf, 99 ShelfWidget::DelegateView::DelegateView(WmShelf* wm_shelf,
129 ShelfWidget* shelf_widget) 100 ShelfWidget* shelf_widget)
130 : wm_shelf_(wm_shelf), 101 : wm_shelf_(wm_shelf),
131 shelf_widget_(shelf_widget), 102 shelf_widget_(shelf_widget),
132 focus_cycler_(nullptr), 103 focus_cycler_(nullptr),
133 asset_background_alpha_(0), 104 asset_background_alpha_(0),
134 opaque_background_(ui::LAYER_SOLID_COLOR), 105 opaque_background_(ui::LAYER_SOLID_COLOR),
135 opaque_foreground_(ui::LAYER_SOLID_COLOR), 106 opaque_foreground_(ui::LAYER_SOLID_COLOR) {
136 dimmer_view_(nullptr),
137 disable_dimming_animations_for_test_(false) {
138 DCHECK(wm_shelf_); 107 DCHECK(wm_shelf_);
139 DCHECK(shelf_widget_); 108 DCHECK(shelf_widget_);
140 SetLayoutManager(new views::FillLayout()); 109 SetLayoutManager(new views::FillLayout());
141 set_allow_deactivate_on_esc(true); 110 set_allow_deactivate_on_esc(true);
142 opaque_background_.SetColor(SK_ColorBLACK); 111 opaque_background_.SetColor(SK_ColorBLACK);
143 opaque_background_.SetBounds(GetLocalBounds()); 112 opaque_background_.SetBounds(GetLocalBounds());
144 opaque_background_.SetOpacity(0.0f); 113 opaque_background_.SetOpacity(0.0f);
145 opaque_foreground_.SetColor(SK_ColorBLACK); 114 opaque_foreground_.SetColor(SK_ColorBLACK);
146 opaque_foreground_.SetBounds(GetLocalBounds()); 115 opaque_foreground_.SetBounds(GetLocalBounds());
147 opaque_foreground_.SetOpacity(0.0f); 116 opaque_foreground_.SetOpacity(0.0f);
148 } 117 }
149 118
150 ShelfWidget::DelegateView::~DelegateView() { 119 ShelfWidget::DelegateView::~DelegateView() {}
151 // Make sure that the dimmer goes away since it might have set an observer.
152 SetDimmed(false);
153 }
154
155 void ShelfWidget::DelegateView::SetDimmed(bool dimmed) {
156 // When starting dimming, attempt to create a dimmer view.
157 if (dimmed) {
158 if (!dimmer_view_) {
159 dimmer_view_ =
160 wm_shelf_->CreateDimmerView(disable_dimming_animations_for_test_);
161 }
162 return;
163 }
164
165 // Close the dimmer widget when stopping dimming.
166 if (dimmer_view_) {
167 dimmer_view_->GetDimmerWidget()->CloseNow();
168 dimmer_view_ = nullptr;
169 }
170 }
171
172 bool ShelfWidget::DelegateView::GetDimmed() const {
173 return dimmer_view_ && dimmer_view_->GetDimmerWidget()->IsVisible();
174 }
175 120
176 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { 121 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) {
177 layer->Add(&opaque_background_); 122 layer->Add(&opaque_background_);
178 layer->Add(&opaque_foreground_); 123 layer->Add(&opaque_foreground_);
179 ReorderLayers(); 124 ReorderLayers();
180 } 125 }
181 126
182 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { 127 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) {
183 if (MaterialDesignController::IsShelfMaterial()) 128 if (MaterialDesignController::IsShelfMaterial())
184 return; 129 return;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 194
250 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { 195 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) {
251 views::View::ReorderChildLayers(parent_layer); 196 views::View::ReorderChildLayers(parent_layer);
252 parent_layer->StackAtBottom(&opaque_background_); 197 parent_layer->StackAtBottom(&opaque_background_);
253 parent_layer->StackAtTop(&opaque_foreground_); 198 parent_layer->StackAtTop(&opaque_foreground_);
254 } 199 }
255 200
256 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { 201 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) {
257 opaque_background_.SetBounds(GetLocalBounds()); 202 opaque_background_.SetBounds(GetLocalBounds());
258 opaque_foreground_.SetBounds(GetLocalBounds()); 203 opaque_foreground_.SetBounds(GetLocalBounds());
259 if (dimmer_view_)
260 dimmer_view_->GetDimmerWidget()->SetBounds(GetBoundsInScreen());
261 }
262
263 void ShelfWidget::DelegateView::ForceUndimming(bool force) {
264 if (GetDimmed())
265 dimmer_view_->ForceUndimming(force);
266 }
267
268 int ShelfWidget::DelegateView::GetDimmingAlphaForTest() {
269 if (GetDimmed())
270 return dimmer_view_->GetDimmingAlphaForTest();
271 return -1;
272 }
273
274 gfx::Rect ShelfWidget::DelegateView::GetDimmerBoundsForTest() {
275 if (GetDimmed())
276 return dimmer_view_->GetDimmerWidget()->GetWindowBoundsInScreen();
277 return gfx::Rect();
278 } 204 }
279 205
280 void ShelfWidget::DelegateView::UpdateShelfOpaqueBackground(int alpha) { 206 void ShelfWidget::DelegateView::UpdateShelfOpaqueBackground(int alpha) {
281 const float kMaxAlpha = 255.0f; 207 const float kMaxAlpha = 255.0f;
282 opaque_background_.SetOpacity(alpha / kMaxAlpha); 208 opaque_background_.SetOpacity(alpha / kMaxAlpha);
283 } 209 }
284 210
285 void ShelfWidget::DelegateView::UpdateShelfAssetBackground(int alpha) { 211 void ShelfWidget::DelegateView::UpdateShelfAssetBackground(int alpha) {
286 asset_background_alpha_ = alpha; 212 asset_background_alpha_ = alpha;
287 SchedulePaint(); 213 SchedulePaint();
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 ShelfAlignment ShelfWidget::GetAlignment() const { 307 ShelfAlignment ShelfWidget::GetAlignment() const {
382 return wm_shelf_->GetAlignment(); 308 return wm_shelf_->GetAlignment();
383 } 309 }
384 310
385 void ShelfWidget::OnShelfAlignmentChanged() { 311 void ShelfWidget::OnShelfAlignmentChanged() {
386 shelf_view_->OnShelfAlignmentChanged(); 312 shelf_view_->OnShelfAlignmentChanged();
387 status_area_widget_->SetShelfAlignment(GetAlignment()); 313 status_area_widget_->SetShelfAlignment(GetAlignment());
388 delegate_view_->SchedulePaint(); 314 delegate_view_->SchedulePaint();
389 } 315 }
390 316
391 void ShelfWidget::SetDimsShelf(bool dimming) {
392 delegate_view_->SetDimmed(dimming);
393 // Repaint all children, allowing updates to reflect dimmed state eg:
394 // status area background, app list button and overflow button.
395 if (shelf_view_)
396 shelf_view_->SchedulePaintForAllButtons();
James Cook 2016/12/08 01:26:43 I think this is the only caller of SchedulePaintFo
Evan Stade 2016/12/08 17:13:38 Done.
397 status_area_widget_->SchedulePaint();
398 }
399
400 bool ShelfWidget::GetDimsShelf() const {
401 return delegate_view_->GetDimmed();
402 }
403
404 ShelfView* ShelfWidget::CreateShelfView() { 317 ShelfView* ShelfWidget::CreateShelfView() {
405 DCHECK(!shelf_view_); 318 DCHECK(!shelf_view_);
406 319
407 shelf_view_ = 320 shelf_view_ =
408 new ShelfView(WmShell::Get()->shelf_model(), 321 new ShelfView(WmShell::Get()->shelf_model(),
409 WmShell::Get()->shelf_delegate(), wm_shelf_, this); 322 WmShell::Get()->shelf_delegate(), wm_shelf_, this);
410 shelf_view_->Init(); 323 shelf_view_->Init();
411 GetContentsView()->AddChildView(shelf_view_); 324 GetContentsView()->AddChildView(shelf_view_);
412 return shelf_view_; 325 return shelf_view_;
413 } 326 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 delegate_view_->set_focus_cycler(focus_cycler); 363 delegate_view_->set_focus_cycler(focus_cycler);
451 if (focus_cycler) 364 if (focus_cycler)
452 focus_cycler->AddWidget(this); 365 focus_cycler->AddWidget(this);
453 } 366 }
454 367
455 FocusCycler* ShelfWidget::GetFocusCycler() { 368 FocusCycler* ShelfWidget::GetFocusCycler() {
456 return delegate_view_->focus_cycler(); 369 return delegate_view_->focus_cycler();
457 } 370 }
458 371
459 void ShelfWidget::Shutdown() { 372 void ShelfWidget::Shutdown() {
460 // Tear down the dimmer before |shelf_layout_manager_|, since the dimmer uses
461 // |shelf_layout_manager_| to get the shelf's WmWindow, via WmShelf.
462 delegate_view_->SetDimmed(false);
463
464 // Shutting down the status area widget may cause some widgets (e.g. bubbles) 373 // Shutting down the status area widget may cause some widgets (e.g. bubbles)
465 // to close, so uninstall the ShelfLayoutManager event filters first. Don't 374 // to close, so uninstall the ShelfLayoutManager event filters first. Don't
466 // reset the pointer until later because other widgets (e.g. app list) may 375 // reset the pointer until later because other widgets (e.g. app list) may
467 // access it later in shutdown. 376 // access it later in shutdown.
468 if (shelf_layout_manager_) 377 if (shelf_layout_manager_)
469 shelf_layout_manager_->PrepareForShutdown(); 378 shelf_layout_manager_->PrepareForShutdown();
470 379
471 if (status_area_widget_) { 380 if (status_area_widget_) {
472 background_animator_.RemoveObserver(status_area_widget_); 381 background_animator_.RemoveObserver(status_area_widget_);
473 WmShell::Get()->focus_cycler()->RemoveWidget(status_area_widget_); 382 WmShell::Get()->focus_cycler()->RemoveWidget(status_area_widget_);
474 status_area_widget_->Shutdown(); 383 status_area_widget_->Shutdown();
475 status_area_widget_ = nullptr; 384 status_area_widget_ = nullptr;
476 } 385 }
477 386
478 CloseNow(); 387 CloseNow();
479 } 388 }
480 389
481 void ShelfWidget::ForceUndimming(bool force) {
482 delegate_view_->ForceUndimming(force);
483 }
484
485 void ShelfWidget::UpdateIconPositionForPanel(WmWindow* panel) { 390 void ShelfWidget::UpdateIconPositionForPanel(WmWindow* panel) {
486 WmWindow* shelf_window = WmLookup::Get()->GetWindowForWidget(this); 391 WmWindow* shelf_window = WmLookup::Get()->GetWindowForWidget(this);
487 shelf_view_->UpdatePanelIconPosition( 392 shelf_view_->UpdatePanelIconPosition(
488 panel->GetIntProperty(WmWindowProperty::SHELF_ID), 393 panel->GetIntProperty(WmWindowProperty::SHELF_ID),
489 shelf_window->ConvertRectFromScreen(panel->GetBoundsInScreen()) 394 shelf_window->ConvertRectFromScreen(panel->GetBoundsInScreen())
490 .CenterPoint()); 395 .CenterPoint());
491 } 396 }
492 397
493 gfx::Rect ShelfWidget::GetScreenBoundsOfItemIconForWindow(WmWindow* window) { 398 gfx::Rect ShelfWidget::GetScreenBoundsOfItemIconForWindow(WmWindow* window) {
494 ShelfID id = window->GetIntProperty(WmWindowProperty::SHELF_ID); 399 ShelfID id = window->GetIntProperty(WmWindowProperty::SHELF_ID);
(...skipping 16 matching lines...) Expand all
511 416
512 void ShelfWidget::OnWidgetActivationChanged(views::Widget* widget, 417 void ShelfWidget::OnWidgetActivationChanged(views::Widget* widget,
513 bool active) { 418 bool active) {
514 activating_as_fallback_ = false; 419 activating_as_fallback_ = false;
515 if (active) 420 if (active)
516 delegate_view_->SetPaneFocusAndFocusDefault(); 421 delegate_view_->SetPaneFocusAndFocusDefault();
517 else 422 else
518 delegate_view_->GetFocusManager()->ClearFocus(); 423 delegate_view_->GetFocusManager()->ClearFocus();
519 } 424 }
520 425
521 int ShelfWidget::GetDimmingAlphaForTest() {
522 if (delegate_view_)
523 return delegate_view_->GetDimmingAlphaForTest();
524 return -1;
525 }
526
527 gfx::Rect ShelfWidget::GetDimmerBoundsForTest() {
528 if (delegate_view_)
529 return delegate_view_->GetDimmerBoundsForTest();
530 return gfx::Rect();
531 }
532
533 void ShelfWidget::DisableDimmingAnimationsForTest() {
534 DCHECK(delegate_view_);
535 delegate_view_->disable_dimming_animations_for_test();
536 }
537
538 void ShelfWidget::UpdateShelfItemBackground(int alpha) { 426 void ShelfWidget::UpdateShelfItemBackground(int alpha) {
539 if (shelf_view_) 427 if (shelf_view_)
540 shelf_view_->UpdateShelfItemBackground(alpha); 428 shelf_view_->UpdateShelfItemBackground(alpha);
541 } 429 }
542 430
543 void ShelfWidget::WillDeleteShelfLayoutManager() { 431 void ShelfWidget::WillDeleteShelfLayoutManager() {
544 shelf_layout_manager_->RemoveObserver(this); 432 shelf_layout_manager_->RemoveObserver(this);
545 shelf_layout_manager_ = nullptr; 433 shelf_layout_manager_ = nullptr;
546 } 434 }
547 435
548 } // namespace ash 436 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698