Index: ash/shelf/shelf_widget.cc |
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc |
index e16244c3d2f4a02aa6977fa95f2bbbb7b41f89bf..f912011365f934f25a5be883108fd0fcb12ada19 100644 |
--- a/ash/shelf/shelf_widget.cc |
+++ b/ash/shelf/shelf_widget.cc |
@@ -325,6 +325,7 @@ class ShelfWidget::DelegateView : public views::WidgetDelegate, |
FocusCycler* focus_cycler() { return focus_cycler_; } |
ui::Layer* opaque_background() { return &opaque_background_; } |
+ ui::Layer* opaque_foreground() { return &opaque_foreground_; } |
// Set if the shelf area is dimmed (eg when a window is maximized). |
void SetDimmed(bool dimmed); |
@@ -383,7 +384,12 @@ class ShelfWidget::DelegateView : public views::WidgetDelegate, |
scoped_ptr<views::Widget> dimmer_; |
FocusCycler* focus_cycler_; |
int alpha_; |
+ // A black background layer which is shown when a maximized window is visible. |
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_; |
// The view which does the dimming. |
DimmerView* dimmer_view_; |
@@ -399,12 +405,16 @@ ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) |
focus_cycler_(NULL), |
alpha_(0), |
opaque_background_(ui::LAYER_SOLID_COLOR), |
+ opaque_foreground_(ui::LAYER_SOLID_COLOR), |
dimmer_view_(NULL), |
disable_dimming_animations_for_test_(false) { |
set_allow_deactivate_on_esc(true); |
opaque_background_.SetColor(SK_ColorBLACK); |
opaque_background_.SetBounds(GetLocalBounds()); |
opaque_background_.SetOpacity(0.0f); |
+ opaque_foreground_.SetColor(SK_ColorBLACK); |
+ opaque_foreground_.SetBounds(GetLocalBounds()); |
+ opaque_foreground_.SetOpacity(0.0f); |
} |
ShelfWidget::DelegateView::~DelegateView() { |
@@ -450,6 +460,7 @@ bool ShelfWidget::DelegateView::GetDimmed() const { |
void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { |
layer->Add(&opaque_background_); |
+ layer->Add(&opaque_foreground_); |
ReorderLayers(); |
} |
@@ -556,10 +567,12 @@ void ShelfWidget::DelegateView::Layout() { |
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()); |
if (dimmer_) |
dimmer_->SetBounds(GetBoundsInScreen()); |
} |
@@ -678,6 +691,27 @@ ShelfBackgroundType ShelfWidget::GetBackgroundType() const { |
return SHELF_BACKGROUND_DEFAULT; |
} |
+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; |
+ scoped_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; |
+} |
+ |
// static |
bool ShelfWidget::ShelfAlignmentAllowed() { |
user::LoginStatus login_status = |