| 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/shelf/shelf_widget.h" | 5 #include "ash/shelf/shelf_widget.h" |
| 6 | 6 |
| 7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
| 8 #include "ash/focus_cycler.h" | 8 #include "ash/focus_cycler.h" |
| 9 #include "ash/root_window_controller.h" | 9 #include "ash/root_window_controller.h" |
| 10 #include "ash/session/session_state_delegate.h" | 10 #include "ash/session/session_state_delegate.h" |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 public: | 318 public: |
| 319 explicit DelegateView(ShelfWidget* shelf); | 319 explicit DelegateView(ShelfWidget* shelf); |
| 320 virtual ~DelegateView(); | 320 virtual ~DelegateView(); |
| 321 | 321 |
| 322 void set_focus_cycler(FocusCycler* focus_cycler) { | 322 void set_focus_cycler(FocusCycler* focus_cycler) { |
| 323 focus_cycler_ = focus_cycler; | 323 focus_cycler_ = focus_cycler; |
| 324 } | 324 } |
| 325 FocusCycler* focus_cycler() { return focus_cycler_; } | 325 FocusCycler* focus_cycler() { return focus_cycler_; } |
| 326 | 326 |
| 327 ui::Layer* opaque_background() { return &opaque_background_; } | 327 ui::Layer* opaque_background() { return &opaque_background_; } |
| 328 ui::Layer* opaque_foreground() { return &opaque_foreground_; } |
| 328 | 329 |
| 329 // Set if the shelf area is dimmed (eg when a window is maximized). | 330 // Set if the shelf area is dimmed (eg when a window is maximized). |
| 330 void SetDimmed(bool dimmed); | 331 void SetDimmed(bool dimmed); |
| 331 bool GetDimmed() const; | 332 bool GetDimmed() const; |
| 332 | 333 |
| 333 void SetParentLayer(ui::Layer* layer); | 334 void SetParentLayer(ui::Layer* layer); |
| 334 | 335 |
| 335 // views::View overrides: | 336 // views::View overrides: |
| 336 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; | 337 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; |
| 337 | 338 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 // prior to the creation of of the |dimmer_|. | 377 // prior to the creation of of the |dimmer_|. |
| 377 void disable_dimming_animations_for_test() { | 378 void disable_dimming_animations_for_test() { |
| 378 disable_dimming_animations_for_test_ = true; | 379 disable_dimming_animations_for_test_ = true; |
| 379 } | 380 } |
| 380 | 381 |
| 381 private: | 382 private: |
| 382 ShelfWidget* shelf_; | 383 ShelfWidget* shelf_; |
| 383 scoped_ptr<views::Widget> dimmer_; | 384 scoped_ptr<views::Widget> dimmer_; |
| 384 FocusCycler* focus_cycler_; | 385 FocusCycler* focus_cycler_; |
| 385 int alpha_; | 386 int alpha_; |
| 387 // A black background layer which is shown when a maximized window is visible. |
| 386 ui::Layer opaque_background_; | 388 ui::Layer opaque_background_; |
| 389 // A black foreground layer which is shown while transitioning between users. |
| 390 // Note: Since the back- and foreground layers have different functions they |
| 391 // can be used simultaneously - so no repurposing possible. |
| 392 ui::Layer opaque_foreground_; |
| 387 | 393 |
| 388 // The view which does the dimming. | 394 // The view which does the dimming. |
| 389 DimmerView* dimmer_view_; | 395 DimmerView* dimmer_view_; |
| 390 | 396 |
| 391 // True if dimming animations should be turned off. | 397 // True if dimming animations should be turned off. |
| 392 bool disable_dimming_animations_for_test_; | 398 bool disable_dimming_animations_for_test_; |
| 393 | 399 |
| 394 DISALLOW_COPY_AND_ASSIGN(DelegateView); | 400 DISALLOW_COPY_AND_ASSIGN(DelegateView); |
| 395 }; | 401 }; |
| 396 | 402 |
| 397 ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) | 403 ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) |
| 398 : shelf_(shelf), | 404 : shelf_(shelf), |
| 399 focus_cycler_(NULL), | 405 focus_cycler_(NULL), |
| 400 alpha_(0), | 406 alpha_(0), |
| 401 opaque_background_(ui::LAYER_SOLID_COLOR), | 407 opaque_background_(ui::LAYER_SOLID_COLOR), |
| 408 opaque_foreground_(ui::LAYER_SOLID_COLOR), |
| 402 dimmer_view_(NULL), | 409 dimmer_view_(NULL), |
| 403 disable_dimming_animations_for_test_(false) { | 410 disable_dimming_animations_for_test_(false) { |
| 404 set_allow_deactivate_on_esc(true); | 411 set_allow_deactivate_on_esc(true); |
| 405 opaque_background_.SetColor(SK_ColorBLACK); | 412 opaque_background_.SetColor(SK_ColorBLACK); |
| 406 opaque_background_.SetBounds(GetLocalBounds()); | 413 opaque_background_.SetBounds(GetLocalBounds()); |
| 407 opaque_background_.SetOpacity(0.0f); | 414 opaque_background_.SetOpacity(0.0f); |
| 415 opaque_foreground_.SetColor(SK_ColorBLACK); |
| 416 opaque_foreground_.SetBounds(GetLocalBounds()); |
| 417 opaque_foreground_.SetOpacity(0.0f); |
| 408 } | 418 } |
| 409 | 419 |
| 410 ShelfWidget::DelegateView::~DelegateView() { | 420 ShelfWidget::DelegateView::~DelegateView() { |
| 411 // Make sure that the dimmer goes away since it might have set an observer. | 421 // Make sure that the dimmer goes away since it might have set an observer. |
| 412 SetDimmed(false); | 422 SetDimmed(false); |
| 413 } | 423 } |
| 414 | 424 |
| 415 void ShelfWidget::DelegateView::SetDimmed(bool value) { | 425 void ShelfWidget::DelegateView::SetDimmed(bool value) { |
| 416 if (value == (dimmer_.get() != NULL)) | 426 if (value == (dimmer_.get() != NULL)) |
| 417 return; | 427 return; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 443 dimmer_.reset(NULL); | 453 dimmer_.reset(NULL); |
| 444 } | 454 } |
| 445 } | 455 } |
| 446 | 456 |
| 447 bool ShelfWidget::DelegateView::GetDimmed() const { | 457 bool ShelfWidget::DelegateView::GetDimmed() const { |
| 448 return dimmer_.get() && dimmer_->IsVisible(); | 458 return dimmer_.get() && dimmer_->IsVisible(); |
| 449 } | 459 } |
| 450 | 460 |
| 451 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { | 461 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { |
| 452 layer->Add(&opaque_background_); | 462 layer->Add(&opaque_background_); |
| 463 layer->Add(&opaque_foreground_); |
| 453 ReorderLayers(); | 464 ReorderLayers(); |
| 454 } | 465 } |
| 455 | 466 |
| 456 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { | 467 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { |
| 457 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 468 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 458 gfx::ImageSkia shelf_background = | 469 gfx::ImageSkia shelf_background = |
| 459 *rb.GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); | 470 *rb.GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); |
| 460 if (SHELF_ALIGNMENT_BOTTOM != shelf_->GetAlignment()) | 471 if (SHELF_ALIGNMENT_BOTTOM != shelf_->GetAlignment()) |
| 461 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( | 472 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( |
| 462 shelf_background, | 473 shelf_background, |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 } else { | 560 } else { |
| 550 child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), | 561 child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), |
| 551 width(), child_at(i)->height()); | 562 width(), child_at(i)->height()); |
| 552 } | 563 } |
| 553 } | 564 } |
| 554 } | 565 } |
| 555 | 566 |
| 556 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { | 567 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { |
| 557 views::View::ReorderChildLayers(parent_layer); | 568 views::View::ReorderChildLayers(parent_layer); |
| 558 parent_layer->StackAtBottom(&opaque_background_); | 569 parent_layer->StackAtBottom(&opaque_background_); |
| 570 parent_layer->StackAtTop(&opaque_foreground_); |
| 559 } | 571 } |
| 560 | 572 |
| 561 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { | 573 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { |
| 562 opaque_background_.SetBounds(GetLocalBounds()); | 574 opaque_background_.SetBounds(GetLocalBounds()); |
| 575 opaque_foreground_.SetBounds(GetLocalBounds()); |
| 563 if (dimmer_) | 576 if (dimmer_) |
| 564 dimmer_->SetBounds(GetBoundsInScreen()); | 577 dimmer_->SetBounds(GetBoundsInScreen()); |
| 565 } | 578 } |
| 566 | 579 |
| 567 void ShelfWidget::DelegateView::OnWindowBoundsChanged( | 580 void ShelfWidget::DelegateView::OnWindowBoundsChanged( |
| 568 aura::Window* window, | 581 aura::Window* window, |
| 569 const gfx::Rect& old_bounds, | 582 const gfx::Rect& old_bounds, |
| 570 const gfx::Rect& new_bounds) { | 583 const gfx::Rect& new_bounds) { |
| 571 // Coming here the shelf got repositioned and since the |dimmer_| is placed | 584 // Coming here the shelf got repositioned and since the |dimmer_| is placed |
| 572 // in screen coordinates and not relative to the parent it needs to be | 585 // in screen coordinates and not relative to the parent it needs to be |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 | 684 |
| 672 ShelfBackgroundType ShelfWidget::GetBackgroundType() const { | 685 ShelfBackgroundType ShelfWidget::GetBackgroundType() const { |
| 673 if (delegate_view_->opaque_background()->GetTargetOpacity() == 1.0f) | 686 if (delegate_view_->opaque_background()->GetTargetOpacity() == 1.0f) |
| 674 return SHELF_BACKGROUND_MAXIMIZED; | 687 return SHELF_BACKGROUND_MAXIMIZED; |
| 675 if (background_animator_.paints_background()) | 688 if (background_animator_.paints_background()) |
| 676 return SHELF_BACKGROUND_OVERLAP; | 689 return SHELF_BACKGROUND_OVERLAP; |
| 677 | 690 |
| 678 return SHELF_BACKGROUND_DEFAULT; | 691 return SHELF_BACKGROUND_DEFAULT; |
| 679 } | 692 } |
| 680 | 693 |
| 694 void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) { |
| 695 if (IsShelfHiddenBehindBlackBar() == hide) |
| 696 return; |
| 697 |
| 698 ui::Layer* opaque_foreground = delegate_view_->opaque_foreground(); |
| 699 float target_opacity = hide ? 1.0f : 0.0f; |
| 700 scoped_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation; |
| 701 opaque_foreground_animation.reset(new ui::ScopedLayerAnimationSettings( |
| 702 opaque_foreground->GetAnimator())); |
| 703 opaque_foreground_animation->SetTransitionDuration( |
| 704 base::TimeDelta::FromMilliseconds(animation_time_ms)); |
| 705 opaque_foreground_animation->SetPreemptionStrategy( |
| 706 ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); |
| 707 |
| 708 opaque_foreground->SetOpacity(target_opacity); |
| 709 } |
| 710 |
| 711 bool ShelfWidget::IsShelfHiddenBehindBlackBar() const { |
| 712 return delegate_view_->opaque_foreground()->GetTargetOpacity() != 0.0f; |
| 713 } |
| 714 |
| 681 // static | 715 // static |
| 682 bool ShelfWidget::ShelfAlignmentAllowed() { | 716 bool ShelfWidget::ShelfAlignmentAllowed() { |
| 683 user::LoginStatus login_status = | 717 user::LoginStatus login_status = |
| 684 Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); | 718 Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); |
| 685 | 719 |
| 686 switch (login_status) { | 720 switch (login_status) { |
| 687 case user::LOGGED_IN_USER: | 721 case user::LOGGED_IN_USER: |
| 688 case user::LOGGED_IN_OWNER: | 722 case user::LOGGED_IN_OWNER: |
| 689 return true; | 723 return true; |
| 690 case user::LOGGED_IN_LOCKED: | 724 case user::LOGGED_IN_LOCKED: |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 DCHECK(delegate_view_); | 836 DCHECK(delegate_view_); |
| 803 return delegate_view_->disable_dimming_animations_for_test(); | 837 return delegate_view_->disable_dimming_animations_for_test(); |
| 804 } | 838 } |
| 805 | 839 |
| 806 void ShelfWidget::WillDeleteShelf() { | 840 void ShelfWidget::WillDeleteShelf() { |
| 807 shelf_layout_manager_->RemoveObserver(this); | 841 shelf_layout_manager_->RemoveObserver(this); |
| 808 shelf_layout_manager_ = NULL; | 842 shelf_layout_manager_ = NULL; |
| 809 } | 843 } |
| 810 | 844 |
| 811 } // namespace ash | 845 } // namespace ash |
| OLD | NEW |