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

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

Issue 2053113002: Replaced BackgroundAnimator with ShelfBackgroundAnimator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Made the ShelfView add/remove itself as an observer from the ShelfBackgroundAnimator. Created 4 years, 4 months 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/shelf/shelf_widget.h" 5 #include "ash/shelf/shelf_widget.h"
6 6
7 #include "ash/aura/wm_shelf_aura.h" 7 #include "ash/aura/wm_shelf_aura.h"
8 #include "ash/aura/wm_window_aura.h" 8 #include "ash/aura/wm_window_aura.h"
9 #include "ash/common/ash_switches.h" 9 #include "ash/common/ash_switches.h"
10 #include "ash/common/focus_cycler.h" 10 #include "ash/common/focus_cycler.h"
11 #include "ash/common/material_design/material_design_controller.h" 11 #include "ash/common/material_design/material_design_controller.h"
12 #include "ash/common/session/session_state_delegate.h" 12 #include "ash/common/session/session_state_delegate.h"
13 #include "ash/common/shelf/shelf_background_animator_observer.h"
13 #include "ash/common/shelf/shelf_constants.h" 14 #include "ash/common/shelf/shelf_constants.h"
14 #include "ash/common/shelf/shelf_delegate.h" 15 #include "ash/common/shelf/shelf_delegate.h"
15 #include "ash/common/shelf/shelf_model.h" 16 #include "ash/common/shelf/shelf_model.h"
17 #include "ash/common/shelf/wm_shelf.h"
16 #include "ash/common/shelf/wm_shelf_util.h" 18 #include "ash/common/shelf/wm_shelf_util.h"
17 #include "ash/common/shell_window_ids.h" 19 #include "ash/common/shell_window_ids.h"
18 #include "ash/common/system/tray/system_tray_delegate.h" 20 #include "ash/common/system/tray/system_tray_delegate.h"
19 #include "ash/common/wm_root_window_controller.h" 21 #include "ash/common/wm_root_window_controller.h"
20 #include "ash/common/wm_shell.h" 22 #include "ash/common/wm_shell.h"
21 #include "ash/shelf/shelf_layout_manager.h" 23 #include "ash/shelf/shelf_layout_manager.h"
22 #include "ash/shelf/shelf_util.h" 24 #include "ash/shelf/shelf_util.h"
23 #include "ash/shelf/shelf_view.h" 25 #include "ash/shelf/shelf_view.h"
24 #include "ash/shell.h" 26 #include "ash/shell.h"
25 #include "ash/wm/status_area_layout_manager.h" 27 #include "ash/wm/status_area_layout_manager.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 void SetHovered(bool hovered); 74 void SetHovered(bool hovered);
73 75
74 // Force the dimmer to be undimmed. 76 // Force the dimmer to be undimmed.
75 void ForceUndimming(bool force); 77 void ForceUndimming(bool force);
76 78
77 // views::WidgetDelegate overrides: 79 // views::WidgetDelegate overrides:
78 views::Widget* GetWidget() override { return View::GetWidget(); } 80 views::Widget* GetWidget() override { return View::GetWidget(); }
79 const views::Widget* GetWidget() const override { return View::GetWidget(); } 81 const views::Widget* GetWidget() const override { return View::GetWidget(); }
80 82
81 // BackgroundAnimatorDelegate overrides: 83 // BackgroundAnimatorDelegate overrides:
82 void UpdateBackground(int alpha) override { 84 void UpdateBackground(BackgroundAnimator* animator, int alpha) override {
83 alpha_ = alpha; 85 alpha_ = alpha;
84 SchedulePaint(); 86 SchedulePaint();
85 } 87 }
86 88
89 void BackgroundAnimationEnded(BackgroundAnimator* animator) override {}
90
87 // views::View overrides: 91 // views::View overrides:
88 void OnPaintBackground(gfx::Canvas* canvas) override; 92 void OnPaintBackground(gfx::Canvas* canvas) override;
89 93
90 // A function to test the current alpha used. 94 // A function to test the current alpha used.
91 int get_dimming_alpha_for_test() { return alpha_; } 95 int get_dimming_alpha_for_test() { return alpha_; }
92 96
93 private: 97 private:
94 // This class monitors mouse events to see if it is on top of the shelf. 98 // This class monitors mouse events to see if it is on top of the shelf.
95 class DimmerEventFilter : public ui::EventHandler { 99 class DimmerEventFilter : public ui::EventHandler {
96 public: 100 public:
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 293
290 DISALLOW_COPY_AND_ASSIGN(ShelfWindowTargeter); 294 DISALLOW_COPY_AND_ASSIGN(ShelfWindowTargeter);
291 }; 295 };
292 296
293 } // namespace 297 } // namespace
294 298
295 // The contents view of the Shelf. This view contains ShelfView and 299 // The contents view of the Shelf. This view contains ShelfView and
296 // sizes it to the width of the shelf minus the size of the status area. 300 // sizes it to the width of the shelf minus the size of the status area.
297 class ShelfWidget::DelegateView : public views::WidgetDelegate, 301 class ShelfWidget::DelegateView : public views::WidgetDelegate,
298 public views::AccessiblePaneView, 302 public views::AccessiblePaneView,
299 public BackgroundAnimatorDelegate, 303 public aura::WindowObserver,
300 public aura::WindowObserver { 304 public ShelfBackgroundAnimatorObserver {
301 public: 305 public:
302 explicit DelegateView(ShelfWidget* shelf); 306 explicit DelegateView(ShelfWidget* shelf);
303 ~DelegateView() override; 307 ~DelegateView() override;
304 308
305 void set_focus_cycler(FocusCycler* focus_cycler) { 309 void set_focus_cycler(FocusCycler* focus_cycler) {
306 focus_cycler_ = focus_cycler; 310 focus_cycler_ = focus_cycler;
307 } 311 }
308 FocusCycler* focus_cycler() { return focus_cycler_; } 312 FocusCycler* focus_cycler() { return focus_cycler_; }
309 313
310 ui::Layer* opaque_background() { return &opaque_background_; } 314 ui::Layer* opaque_background() { return &opaque_background_; }
(...skipping 19 matching lines...) Expand all
330 334
331 // aura::WindowObserver overrides: 335 // aura::WindowObserver overrides:
332 // This will be called when the shelf itself changes its absolute position. 336 // This will be called when the shelf itself changes its absolute position.
333 // Since the |dimmer_| panel needs to be placed in screen coordinates it needs 337 // Since the |dimmer_| panel needs to be placed in screen coordinates it needs
334 // to be repositioned. The difference to the OnBoundsChanged call above is 338 // to be repositioned. The difference to the OnBoundsChanged call above is
335 // that this gets also triggered when the shelf only moves. 339 // that this gets also triggered when the shelf only moves.
336 void OnWindowBoundsChanged(aura::Window* window, 340 void OnWindowBoundsChanged(aura::Window* window,
337 const gfx::Rect& old_bounds, 341 const gfx::Rect& old_bounds,
338 const gfx::Rect& new_bounds) override; 342 const gfx::Rect& new_bounds) override;
339 343
340 // BackgroundAnimatorDelegate overrides: 344 // ShelfBackgroundAnimatorObserver:
341 void UpdateBackground(int alpha) override; 345 void UpdateShelfOpaqueBackground(int alpha) override;
346 void UpdateShelfAssetBackground(int alpha) override;
342 347
343 // Force the shelf to be presented in an undimmed state. 348 // Force the shelf to be presented in an undimmed state.
344 void ForceUndimming(bool force); 349 void ForceUndimming(bool force);
345 350
346 // A function to test the current alpha used by the dimming bar. If there is 351 // A function to test the current alpha used by the dimming bar. If there is
347 // no dimmer active, the function will return -1. 352 // no dimmer active, the function will return -1.
348 int GetDimmingAlphaForTest(); 353 int GetDimmingAlphaForTest();
349 354
350 // A function to test the bounds of the dimming bar. Returns gfx::Rect() if 355 // A function to test the bounds of the dimming bar. Returns gfx::Rect() if
351 // the dimmer is inactive. 356 // the dimmer is inactive.
352 gfx::Rect GetDimmerBoundsForTest(); 357 gfx::Rect GetDimmerBoundsForTest();
353 358
354 // Disable dimming animations for running tests. This needs to be called 359 // Disable dimming animations for running tests. This needs to be called
355 // prior to the creation of of the |dimmer_|. 360 // prior to the creation of of the |dimmer_|.
356 void disable_dimming_animations_for_test() { 361 void disable_dimming_animations_for_test() {
357 disable_dimming_animations_for_test_ = true; 362 disable_dimming_animations_for_test_ = true;
358 } 363 }
359 364
360 private: 365 private:
361 ShelfWidget* shelf_; 366 ShelfWidget* shelf_;
362 std::unique_ptr<views::Widget> dimmer_; 367 std::unique_ptr<views::Widget> dimmer_;
363 FocusCycler* focus_cycler_; 368 FocusCycler* focus_cycler_;
364 int alpha_; 369 int asset_background_alpha_;
370 // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551).
365 // A black background layer which is shown when a maximized window is visible. 371 // A black background layer which is shown when a maximized window is visible.
366 ui::Layer opaque_background_; 372 ui::Layer opaque_background_;
367 // A black foreground layer which is shown while transitioning between users. 373 // A black foreground layer which is shown while transitioning between users.
368 // Note: Since the back- and foreground layers have different functions they 374 // Note: Since the back- and foreground layers have different functions they
369 // can be used simultaneously - so no repurposing possible. 375 // can be used simultaneously - so no repurposing possible.
370 ui::Layer opaque_foreground_; 376 ui::Layer opaque_foreground_;
371 377
372 // The view which does the dimming. 378 // The view which does the dimming.
373 DimmerView* dimmer_view_; 379 DimmerView* dimmer_view_;
374 380
375 // True if dimming animations should be turned off. 381 // True if dimming animations should be turned off.
376 bool disable_dimming_animations_for_test_; 382 bool disable_dimming_animations_for_test_;
377 383
378 DISALLOW_COPY_AND_ASSIGN(DelegateView); 384 DISALLOW_COPY_AND_ASSIGN(DelegateView);
379 }; 385 };
380 386
381 ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) 387 ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf)
382 : shelf_(shelf), 388 : shelf_(shelf),
383 focus_cycler_(NULL), 389 focus_cycler_(NULL),
384 alpha_(0), 390 asset_background_alpha_(0),
385 opaque_background_(ui::LAYER_SOLID_COLOR), 391 opaque_background_(ui::LAYER_SOLID_COLOR),
386 opaque_foreground_(ui::LAYER_SOLID_COLOR), 392 opaque_foreground_(ui::LAYER_SOLID_COLOR),
387 dimmer_view_(NULL), 393 dimmer_view_(NULL),
388 disable_dimming_animations_for_test_(false) { 394 disable_dimming_animations_for_test_(false) {
389 SetLayoutManager(new views::FillLayout()); 395 SetLayoutManager(new views::FillLayout());
390 set_allow_deactivate_on_esc(true); 396 set_allow_deactivate_on_esc(true);
391 opaque_background_.SetColor(SK_ColorBLACK); 397 opaque_background_.SetColor(SK_ColorBLACK);
392 opaque_background_.SetBounds(GetLocalBounds()); 398 opaque_background_.SetBounds(GetLocalBounds());
393 opaque_background_.SetOpacity(0.0f); 399 opaque_background_.SetOpacity(0.0f);
394 opaque_foreground_.SetColor(SK_ColorBLACK); 400 opaque_foreground_.SetColor(SK_ColorBLACK);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 return dimmer_.get() && dimmer_->IsVisible(); 443 return dimmer_.get() && dimmer_->IsVisible();
438 } 444 }
439 445
440 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { 446 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) {
441 layer->Add(&opaque_background_); 447 layer->Add(&opaque_background_);
442 layer->Add(&opaque_foreground_); 448 layer->Add(&opaque_foreground_);
443 ReorderLayers(); 449 ReorderLayers();
444 } 450 }
445 451
446 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { 452 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) {
447 if (MaterialDesignController::IsShelfMaterial()) { 453 if (MaterialDesignController::IsShelfMaterial())
448 canvas->FillRect(bounds(), SkColorSetA(kShelfBaseColor, alpha_)); 454 return;
449 } else { 455
450 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 456 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
451 gfx::ImageSkia shelf_background = 457 gfx::ImageSkia shelf_background =
452 *rb->GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); 458 *rb->GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND);
453 const bool horizontal = IsHorizontalAlignment(shelf_->GetAlignment()); 459 const bool horizontal = IsHorizontalAlignment(shelf_->GetAlignment());
454 if (!horizontal) { 460 if (!horizontal) {
455 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( 461 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage(
456 shelf_background, shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT 462 shelf_background, shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT
457 ? SkBitmapOperations::ROTATION_90_CW 463 ? SkBitmapOperations::ROTATION_90_CW
458 : SkBitmapOperations::ROTATION_270_CW); 464 : SkBitmapOperations::ROTATION_270_CW);
465 }
466 const gfx::Rect dock_bounds(shelf_->shelf_layout_manager()->dock_bounds());
467 SkPaint paint;
468 paint.setAlpha(asset_background_alpha_);
469 canvas->DrawImageInt(
470 shelf_background, 0, 0, shelf_background.width(),
471 shelf_background.height(),
472 (horizontal && dock_bounds.x() == 0 && dock_bounds.width() > 0)
473 ? dock_bounds.width()
474 : 0,
475 0, horizontal ? width() - dock_bounds.width() : width(), height(), false,
476 paint);
477 if (horizontal && dock_bounds.width() > 0) {
478 // The part of the shelf background that is in the corner below the docked
479 // windows close to the work area is an arched gradient that blends
480 // vertically oriented docked background and horizontal shelf.
481 gfx::ImageSkia shelf_corner = *rb->GetImageSkiaNamed(IDR_ASH_SHELF_CORNER);
482 if (dock_bounds.x() == 0) {
483 shelf_corner = gfx::ImageSkiaOperations::CreateRotatedImage(
484 shelf_corner, SkBitmapOperations::ROTATION_90_CW);
459 } 485 }
460 const gfx::Rect dock_bounds(shelf_->shelf_layout_manager()->dock_bounds());
461 SkPaint paint;
462 paint.setAlpha(alpha_);
463 canvas->DrawImageInt( 486 canvas->DrawImageInt(
464 shelf_background, 0, 0, shelf_background.width(), 487 shelf_corner, 0, 0, shelf_corner.width(), shelf_corner.height(),
465 shelf_background.height(), 488 dock_bounds.x() > 0 ? dock_bounds.x() : dock_bounds.width() - height(),
466 (horizontal && dock_bounds.x() == 0 && dock_bounds.width() > 0) 489 0, height(), height(), false, paint);
467 ? dock_bounds.width() 490 // The part of the shelf background that is just below the docked windows
468 : 0, 491 // is drawn using the last (lowest) 1-pixel tall strip of the image asset.
469 0, horizontal ? width() - dock_bounds.width() : width(), height(), 492 // This avoids showing the border 3D shadow between the shelf and the
470 false, paint); 493 // dock.
471 if (horizontal && dock_bounds.width() > 0) { 494 canvas->DrawImageInt(shelf_background, 0, shelf_background.height() - 1,
472 // The part of the shelf background that is in the corner below the docked 495 shelf_background.width(), 1,
473 // windows close to the work area is an arched gradient that blends 496 dock_bounds.x() > 0 ? dock_bounds.x() + height() : 0,
474 // vertically oriented docked background and horizontal shelf. 497 0, dock_bounds.width() - height(), height(), false,
475 gfx::ImageSkia shelf_corner = 498 paint);
476 *rb->GetImageSkiaNamed(IDR_ASH_SHELF_CORNER);
477 if (dock_bounds.x() == 0) {
478 shelf_corner = gfx::ImageSkiaOperations::CreateRotatedImage(
479 shelf_corner, SkBitmapOperations::ROTATION_90_CW);
480 }
481 canvas->DrawImageInt(shelf_corner, 0, 0, shelf_corner.width(),
482 shelf_corner.height(),
483 dock_bounds.x() > 0 ? dock_bounds.x()
484 : dock_bounds.width() - height(),
485 0, height(), height(), false, paint);
486 // The part of the shelf background that is just below the docked windows
487 // is drawn using the last (lowest) 1-pixel tall strip of the image asset.
488 // This avoids showing the border 3D shadow between the shelf and the
489 // dock.
490 canvas->DrawImageInt(shelf_background, 0, shelf_background.height() - 1,
491 shelf_background.width(), 1,
492 dock_bounds.x() > 0 ? dock_bounds.x() + height() : 0,
493 0, dock_bounds.width() - height(), height(), false,
494 paint);
495 }
496 gfx::Rect black_rect =
497 shelf_->shelf_layout_manager()->SelectValueForShelfAlignment(
498 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels),
499 gfx::Rect(0, 0, kNumBlackPixels, height()),
500 gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height()));
501 canvas->FillRect(black_rect, SK_ColorBLACK);
502 } 499 }
500 gfx::Rect black_rect =
501 shelf_->shelf_layout_manager()->SelectValueForShelfAlignment(
502 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels),
503 gfx::Rect(0, 0, kNumBlackPixels, height()),
504 gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height()));
505 canvas->FillRect(black_rect, SK_ColorBLACK);
503 } 506 }
504 507
505 bool ShelfWidget::DelegateView::CanActivate() const { 508 bool ShelfWidget::DelegateView::CanActivate() const {
506 // Allow to activate as fallback. 509 // Allow to activate as fallback.
507 if (shelf_->activating_as_fallback_) 510 if (shelf_->activating_as_fallback_)
508 return true; 511 return true;
509 // Allow to activate from the focus cycler. 512 // Allow to activate from the focus cycler.
510 if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) 513 if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget())
511 return true; 514 return true;
512 // Disallow activating in other cases, especially when using mouse. 515 // Disallow activating in other cases, especially when using mouse.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 return dimmer_view_->get_dimming_alpha_for_test(); 549 return dimmer_view_->get_dimming_alpha_for_test();
547 return -1; 550 return -1;
548 } 551 }
549 552
550 gfx::Rect ShelfWidget::DelegateView::GetDimmerBoundsForTest() { 553 gfx::Rect ShelfWidget::DelegateView::GetDimmerBoundsForTest() {
551 if (GetDimmed()) 554 if (GetDimmed())
552 return dimmer_view_->GetBoundsInScreen(); 555 return dimmer_view_->GetBoundsInScreen();
553 return gfx::Rect(); 556 return gfx::Rect();
554 } 557 }
555 558
556 void ShelfWidget::DelegateView::UpdateBackground(int alpha) { 559 void ShelfWidget::DelegateView::UpdateShelfOpaqueBackground(int alpha) {
557 alpha_ = alpha; 560 const float kMaxAlpha = 255.0f;
561 opaque_background_.SetOpacity(alpha / kMaxAlpha);
562 }
563
564 void ShelfWidget::DelegateView::UpdateShelfAssetBackground(int alpha) {
565 asset_background_alpha_ = alpha;
558 SchedulePaint(); 566 SchedulePaint();
559 } 567 }
560 568
561 ShelfWidget::ShelfWidget(WmWindow* wm_shelf_container, 569 ShelfWidget::ShelfWidget(WmWindow* wm_shelf_container,
562 WmWindow* wm_status_container, 570 WmWindow* wm_status_container,
563 WmShelfAura* wm_shelf_aura, 571 WmShelfAura* wm_shelf_aura,
564 WorkspaceController* workspace_controller) 572 WorkspaceController* workspace_controller)
565 : delegate_view_(new DelegateView(this)), 573 : wm_shelf_aura_(wm_shelf_aura),
566 background_animator_(delegate_view_, 574 delegate_view_(new DelegateView(this)),
567 0, 575 background_animator_(SHELF_BACKGROUND_DEFAULT, wm_shelf_aura_),
568 GetShelfConstant(SHELF_BACKGROUND_ALPHA)),
569 activating_as_fallback_(false) { 576 activating_as_fallback_(false) {
577 background_animator_.AddObserver(delegate_view_);
578
570 views::Widget::InitParams params( 579 views::Widget::InitParams params(
571 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 580 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
572 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 581 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
573 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 582 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
574 params.delegate = delegate_view_; 583 params.delegate = delegate_view_;
575 wm_shelf_container->GetRootWindowController() 584 wm_shelf_container->GetRootWindowController()
576 ->ConfigureWidgetInitParamsForContainer( 585 ->ConfigureWidgetInitParamsForContainer(
577 this, wm_shelf_container->GetShellWindowId(), &params); 586 this, wm_shelf_container->GetShellWindowId(), &params);
578 Init(params); 587 Init(params);
579 588
580 // The shelf should not take focus when initially shown. 589 // The shelf should not take focus when initially shown.
581 set_focus_on_creation(false); 590 set_focus_on_creation(false);
582 SetContentsView(delegate_view_); 591 SetContentsView(delegate_view_);
583 delegate_view_->SetParentLayer(GetLayer()); 592 delegate_view_->SetParentLayer(GetLayer());
584 593
585 shelf_layout_manager_ = new ShelfLayoutManager(this); 594 shelf_layout_manager_ = new ShelfLayoutManager(this);
586 shelf_layout_manager_->AddObserver(this); 595 shelf_layout_manager_->AddObserver(this);
587 aura::Window* shelf_container = 596 aura::Window* shelf_container =
588 WmWindowAura::GetAuraWindow(wm_shelf_container); 597 WmWindowAura::GetAuraWindow(wm_shelf_container);
589 shelf_container->SetLayoutManager(shelf_layout_manager_); 598 shelf_container->SetLayoutManager(shelf_layout_manager_);
590 shelf_layout_manager_->set_workspace_controller(workspace_controller); 599 shelf_layout_manager_->set_workspace_controller(workspace_controller);
591 workspace_controller->SetShelf(shelf_layout_manager_); 600 workspace_controller->SetShelf(shelf_layout_manager_);
592 wm_shelf_aura->SetShelfLayoutManager(shelf_layout_manager_); 601 background_animator_.PaintBackground(
602 shelf_layout_manager_->GetShelfBackgroundType(),
603 BACKGROUND_CHANGE_IMMEDIATE);
604 wm_shelf_aura_->SetShelfLayoutManager(shelf_layout_manager_);
593 605
594 // TODO(jamescook): Move ownership to RootWindowController. 606 // TODO(jamescook): Move ownership to RootWindowController.
595 status_area_widget_ = 607 status_area_widget_ =
596 new StatusAreaWidget(wm_status_container, wm_shelf_aura); 608 new StatusAreaWidget(wm_status_container, wm_shelf_aura_);
597 status_area_widget_->CreateTrayViews(); 609 status_area_widget_->CreateTrayViews();
598 if (WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted()) 610 if (WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted())
599 status_area_widget_->Show(); 611 status_area_widget_->Show();
600 WmShell::Get()->focus_cycler()->AddWidget(status_area_widget_); 612 WmShell::Get()->focus_cycler()->AddWidget(status_area_widget_);
613 background_animator_.AddObserver(status_area_widget_);
601 614
602 aura::Window* status_container = 615 aura::Window* status_container =
603 WmWindowAura::GetAuraWindow(wm_status_container); 616 WmWindowAura::GetAuraWindow(wm_status_container);
604 status_container->SetLayoutManager( 617 status_container->SetLayoutManager(
605 new StatusAreaLayoutManager(status_container, this)); 618 new StatusAreaLayoutManager(status_container, this));
606 619
607 shelf_container->SetEventTargeter(std::unique_ptr<ui::EventTargeter>( 620 shelf_container->SetEventTargeter(std::unique_ptr<ui::EventTargeter>(
608 new ShelfWindowTargeter(shelf_container, shelf_layout_manager_))); 621 new ShelfWindowTargeter(shelf_container, shelf_layout_manager_)));
609 status_container->SetEventTargeter(std::unique_ptr<ui::EventTargeter>( 622 status_container->SetEventTargeter(std::unique_ptr<ui::EventTargeter>(
610 new ShelfWindowTargeter(status_container, shelf_layout_manager_))); 623 new ShelfWindowTargeter(status_container, shelf_layout_manager_)));
611 624
612 views::Widget::AddObserver(this); 625 views::Widget::AddObserver(this);
613 } 626 }
614 627
615 ShelfWidget::~ShelfWidget() { 628 ShelfWidget::~ShelfWidget() {
616 // Must call Shutdown() before destruction. 629 // Must call Shutdown() before destruction.
617 DCHECK(!status_area_widget_); 630 DCHECK(!status_area_widget_);
618 WmShell::Get()->focus_cycler()->RemoveWidget(this); 631 WmShell::Get()->focus_cycler()->RemoveWidget(this);
619 SetFocusCycler(nullptr); 632 SetFocusCycler(nullptr);
620 RemoveObserver(this); 633 RemoveObserver(this);
634 background_animator_.RemoveObserver(delegate_view_);
621 } 635 }
622 636
623 void ShelfWidget::SetPaintsBackground( 637 void ShelfWidget::SetPaintsBackground(
624 ShelfBackgroundType background_type, 638 ShelfBackgroundType background_type,
625 BackgroundAnimatorChangeType change_type) { 639 BackgroundAnimatorChangeType change_type) {
626 ui::Layer* opaque_background = delegate_view_->opaque_background(); 640 background_animator_.PaintBackground(background_type, change_type);
627 float target_opacity =
628 (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f;
629 std::unique_ptr<ui::ScopedLayerAnimationSettings> opaque_background_animation;
630 if (change_type != BACKGROUND_CHANGE_IMMEDIATE) {
631 opaque_background_animation.reset(
632 new ui::ScopedLayerAnimationSettings(opaque_background->GetAnimator()));
633 opaque_background_animation->SetTransitionDuration(
634 base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs));
635 }
636 opaque_background->SetOpacity(target_opacity);
637
638 // TODO(mukai): use ui::Layer on both opaque_background and normal background
639 // retire background_animator_ at all. It would be simpler.
640 // See also DockedBackgroundWidget::SetPaintsBackground.
641 background_animator_.SetPaintsBackground(
642 background_type != SHELF_BACKGROUND_DEFAULT, change_type);
643 } 641 }
644 642
645 ShelfBackgroundType ShelfWidget::GetBackgroundType() const { 643 ShelfBackgroundType ShelfWidget::GetBackgroundType() const {
646 if (delegate_view_->opaque_background()->GetTargetOpacity() == 1.0f) 644 return background_animator_.target_background_type();
647 return SHELF_BACKGROUND_MAXIMIZED;
648 if (background_animator_.paints_background())
649 return SHELF_BACKGROUND_OVERLAP;
650
651 return SHELF_BACKGROUND_DEFAULT;
652 } 645 }
653 646
654 void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) { 647 void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) {
655 if (IsShelfHiddenBehindBlackBar() == hide) 648 if (IsShelfHiddenBehindBlackBar() == hide)
656 return; 649 return;
657 650
658 ui::Layer* opaque_foreground = delegate_view_->opaque_foreground(); 651 ui::Layer* opaque_foreground = delegate_view_->opaque_foreground();
659 float target_opacity = hide ? 1.0f : 0.0f; 652 float target_opacity = hide ? 1.0f : 0.0f;
660 std::unique_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation; 653 std::unique_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation;
661 opaque_foreground_animation.reset( 654 opaque_foreground_animation.reset(
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 // status area background, app list button and overflow button. 708 // status area background, app list button and overflow button.
716 if (shelf_) 709 if (shelf_)
717 shelf_->SchedulePaint(); 710 shelf_->SchedulePaint();
718 status_area_widget_->SchedulePaint(); 711 status_area_widget_->SchedulePaint();
719 } 712 }
720 713
721 bool ShelfWidget::GetDimsShelf() const { 714 bool ShelfWidget::GetDimsShelf() const {
722 return delegate_view_->GetDimmed(); 715 return delegate_view_->GetDimmed();
723 } 716 }
724 717
725 void ShelfWidget::CreateShelf(WmShelfAura* wm_shelf_aura) { 718 void ShelfWidget::CreateShelf() {
726 DCHECK(!shelf_); 719 DCHECK(!shelf_);
727 720
728 shelf_.reset(new Shelf(WmShell::Get()->shelf_model(), wm_shelf_aura, this)); 721 shelf_.reset(new Shelf(WmShell::Get()->shelf_model(), wm_shelf_aura_, this,
722 &background_animator_));
729 // Must be initialized before the delegate is notified because the delegate 723 // Must be initialized before the delegate is notified because the delegate
730 // may try to access the WmShelf. 724 // may try to access the WmShelf.
731 wm_shelf_aura->SetShelf(shelf_.get()); 725 wm_shelf_aura_->SetShelf(shelf_.get());
732 WmShell::Get()->shelf_delegate()->OnShelfCreated(shelf_.get()); 726 WmShell::Get()->shelf_delegate()->OnShelfCreated(shelf_.get());
733 727
734 SetFocusCycler(WmShell::Get()->focus_cycler()); 728 SetFocusCycler(WmShell::Get()->focus_cycler());
735 } 729 }
736 730
737 void ShelfWidget::PostCreateShelf() { 731 void ShelfWidget::PostCreateShelf() {
738 shelf_->SetVisible( 732 shelf_->SetVisible(
739 WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted()); 733 WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted());
740 shelf_layout_manager_->LayoutShelf(); 734 shelf_layout_manager_->LayoutShelf();
741 shelf_layout_manager_->UpdateAutoHideState(); 735 shelf_layout_manager_->UpdateAutoHideState();
(...skipping 21 matching lines...) Expand all
763 757
764 void ShelfWidget::Shutdown() { 758 void ShelfWidget::Shutdown() {
765 // Shutting down the status area widget may cause some widgets (e.g. bubbles) 759 // Shutting down the status area widget may cause some widgets (e.g. bubbles)
766 // to close, so uninstall the ShelfLayoutManager event filters first. Don't 760 // to close, so uninstall the ShelfLayoutManager event filters first. Don't
767 // reset the pointer until later because other widgets (e.g. app list) may 761 // reset the pointer until later because other widgets (e.g. app list) may
768 // access it later in shutdown. 762 // access it later in shutdown.
769 if (shelf_layout_manager_) 763 if (shelf_layout_manager_)
770 shelf_layout_manager_->PrepareForShutdown(); 764 shelf_layout_manager_->PrepareForShutdown();
771 765
772 if (status_area_widget_) { 766 if (status_area_widget_) {
767 background_animator_.RemoveObserver(status_area_widget_);
773 WmShell::Get()->focus_cycler()->RemoveWidget(status_area_widget_); 768 WmShell::Get()->focus_cycler()->RemoveWidget(status_area_widget_);
774 status_area_widget_->Shutdown(); 769 status_area_widget_->Shutdown();
775 status_area_widget_ = nullptr; 770 status_area_widget_ = nullptr;
776 } 771 }
777 } 772 }
778 773
779 void ShelfWidget::ForceUndimming(bool force) { 774 void ShelfWidget::ForceUndimming(bool force) {
780 delegate_view_->ForceUndimming(force); 775 delegate_view_->ForceUndimming(force);
781 } 776 }
782 777
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 shelf_layout_manager_->UpdateAutoHideForMouseEvent(event); 812 shelf_layout_manager_->UpdateAutoHideForMouseEvent(event);
818 } 813 }
819 814
820 void ShelfWidget::OnGestureEvent(ui::GestureEvent* event) { 815 void ShelfWidget::OnGestureEvent(ui::GestureEvent* event) {
821 Widget::OnGestureEvent(event); 816 Widget::OnGestureEvent(event);
822 if (Shell::GetInstance()->in_mus() && shelf_layout_manager_) 817 if (Shell::GetInstance()->in_mus() && shelf_layout_manager_)
823 shelf_layout_manager_->UpdateAutoHideForGestureEvent(event); 818 shelf_layout_manager_->UpdateAutoHideForGestureEvent(event);
824 } 819 }
825 820
826 } // namespace ash 821 } // namespace ash
OLDNEW
« ash/shelf/shelf.h ('K') | « ash/shelf/shelf_widget.h ('k') | ash/test/ash_md_test_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698