| Index: ash/system/tray/system_tray_bubble.cc
|
| diff --git a/ash/system/tray/system_tray_bubble.cc b/ash/system/tray/system_tray_bubble.cc
|
| index 3951244d7e860753af6d117f5dd08ddea1adcf59..712d766e4066fe9c198ef3fb60c4193beda6eb33 100644
|
| --- a/ash/system/tray/system_tray_bubble.cc
|
| +++ b/ash/system/tray/system_tray_bubble.cc
|
| @@ -33,6 +33,10 @@ namespace {
|
| // detailed view.
|
| const int kDetailedBubbleMaxHeight = kTrayPopupItemHeight * 5;
|
|
|
| +// Duration of swipe animation used when transitioning from a default to
|
| +// detailed view or vice versa.
|
| +const int kSwipeDelayMS = 150;
|
| +
|
| // A view with some special behaviour for tray items in the popup:
|
| // - optionally changes background color on hover.
|
| class TrayPopupItemContainer : public views::View {
|
| @@ -149,54 +153,55 @@ void SystemTrayBubble::UpdateView(
|
| const std::vector<ash::SystemTrayItem*>& items,
|
| BubbleType bubble_type) {
|
| DCHECK(bubble_type != BUBBLE_TYPE_NOTIFICATION);
|
| - DCHECK(bubble_type != bubble_type_);
|
| -
|
| - const int kSwipeDelayMS = 150;
|
| - base::TimeDelta swipe_duration =
|
| - base::TimeDelta::FromMilliseconds(kSwipeDelayMS);
|
| - scoped_ptr<ui::Layer> scoped_layer(bubble_view_->RecreateLayer());
|
| - // Keep the reference to layer as we need it after releasing it.
|
| - ui::Layer* layer = scoped_layer.get();
|
| - DCHECK(layer);
|
| - layer->SuppressPaint();
|
| -
|
| - // When transitioning from detailed view to default view, animate the existing
|
| - // view (slide out towards the right).
|
| - if (bubble_type == BUBBLE_TYPE_DEFAULT) {
|
| - // Make sure the old view is visibile over the new view during the
|
| - // animation.
|
| - layer->parent()->StackAbove(layer, bubble_view_->layer());
|
| - ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
|
| - settings.AddObserver(
|
| - new AnimationObserverDeleteLayer(scoped_layer.release()));
|
| - settings.SetTransitionDuration(swipe_duration);
|
| - settings.SetTweenType(ui::Tween::EASE_OUT);
|
| - gfx::Transform transform;
|
| - transform.Translate(layer->bounds().width(), 0.0);
|
| - layer->SetTransform(transform);
|
| - }
|
|
|
| - {
|
| - // Add a shadow layer to make the old layer darker as the animation
|
| - // progresses.
|
| - ui::Layer* shadow = new ui::Layer(ui::LAYER_SOLID_COLOR);
|
| - shadow->SetColor(SK_ColorBLACK);
|
| - shadow->SetOpacity(0.01f);
|
| - shadow->SetBounds(layer->bounds());
|
| - layer->Add(shadow);
|
| - layer->StackAtTop(shadow);
|
| + scoped_ptr<ui::Layer> scoped_layer;
|
| + if (bubble_type != bubble_type_) {
|
| + base::TimeDelta swipe_duration =
|
| + base::TimeDelta::FromMilliseconds(kSwipeDelayMS);
|
| + scoped_layer.reset(bubble_view_->RecreateLayer());
|
| + // Keep the reference to layer as we need it after releasing it.
|
| + ui::Layer* layer = scoped_layer.get();
|
| + DCHECK(layer);
|
| + layer->SuppressPaint();
|
| +
|
| + // When transitioning from detailed view to default view, animate the
|
| + // existing view (slide out towards the right).
|
| + if (bubble_type == BUBBLE_TYPE_DEFAULT) {
|
| + // Make sure the old view is visibile over the new view during the
|
| + // animation.
|
| + layer->parent()->StackAbove(layer, bubble_view_->layer());
|
| + ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
|
| + settings.AddObserver(
|
| + new AnimationObserverDeleteLayer(scoped_layer.release()));
|
| + settings.SetTransitionDuration(swipe_duration);
|
| + settings.SetTweenType(ui::Tween::EASE_OUT);
|
| + gfx::Transform transform;
|
| + transform.Translate(layer->bounds().width(), 0.0);
|
| + layer->SetTransform(transform);
|
| + }
|
| +
|
| {
|
| - // Animate the darkening effect a little longer than the swipe-in. This is
|
| - // to make sure the darkening animation does not end up finishing early,
|
| - // because the dark layer goes away at the end of the animation, and there
|
| - // is a brief moment when the old view is still visible, but it does not
|
| - // have the shadow layer on top.
|
| - ui::ScopedLayerAnimationSettings settings(shadow->GetAnimator());
|
| - settings.AddObserver(new AnimationObserverDeleteLayer(shadow));
|
| - settings.SetTransitionDuration(swipe_duration +
|
| - base::TimeDelta::FromMilliseconds(150));
|
| - settings.SetTweenType(ui::Tween::LINEAR);
|
| - shadow->SetOpacity(0.15f);
|
| + // Add a shadow layer to make the old layer darker as the animation
|
| + // progresses.
|
| + ui::Layer* shadow = new ui::Layer(ui::LAYER_SOLID_COLOR);
|
| + shadow->SetColor(SK_ColorBLACK);
|
| + shadow->SetOpacity(0.01f);
|
| + shadow->SetBounds(layer->bounds());
|
| + layer->Add(shadow);
|
| + layer->StackAtTop(shadow);
|
| + {
|
| + // Animate the darkening effect a little longer than the swipe-in. This
|
| + // is to make sure the darkening animation does not end up finishing
|
| + // early, because the dark layer goes away at the end of the animation,
|
| + // and there is a brief moment when the old view is still visible, but
|
| + // it does not have the shadow layer on top.
|
| + ui::ScopedLayerAnimationSettings settings(shadow->GetAnimator());
|
| + settings.AddObserver(new AnimationObserverDeleteLayer(shadow));
|
| + settings.SetTransitionDuration(swipe_duration +
|
| + base::TimeDelta::FromMilliseconds(150));
|
| + settings.SetTweenType(ui::Tween::LINEAR);
|
| + shadow->SetOpacity(0.15f);
|
| + }
|
| }
|
| }
|
|
|
| @@ -220,21 +225,24 @@ void SystemTrayBubble::UpdateView(
|
| bubble_view_->SetMaxHeight(0); // Clear max height limit.
|
| }
|
|
|
| - // When transitioning from default view to detailed view, animate the new
|
| - // view (slide in from the right).
|
| - if (bubble_type == BUBBLE_TYPE_DETAILED) {
|
| - ui::Layer* new_layer = bubble_view_->layer();
|
| - gfx::Rect bounds = new_layer->bounds();
|
| - gfx::Transform transform;
|
| - transform.Translate(bounds.width(), 0.0);
|
| - new_layer->SetTransform(transform);
|
| - {
|
| - ui::ScopedLayerAnimationSettings settings(new_layer->GetAnimator());
|
| - settings.AddObserver(
|
| - new AnimationObserverDeleteLayer(scoped_layer.release()));
|
| - settings.SetTransitionDuration(swipe_duration);
|
| - settings.SetTweenType(ui::Tween::EASE_OUT);
|
| - new_layer->SetTransform(gfx::Transform());
|
| + if (scoped_layer.get()) {
|
| + // When transitioning from default view to detailed view, animate the new
|
| + // view (slide in from the right).
|
| + if (bubble_type == BUBBLE_TYPE_DETAILED) {
|
| + ui::Layer* new_layer = bubble_view_->layer();
|
| + gfx::Rect bounds = new_layer->bounds();
|
| + gfx::Transform transform;
|
| + transform.Translate(bounds.width(), 0.0);
|
| + new_layer->SetTransform(transform);
|
| + {
|
| + ui::ScopedLayerAnimationSettings settings(new_layer->GetAnimator());
|
| + settings.AddObserver(
|
| + new AnimationObserverDeleteLayer(scoped_layer.release()));
|
| + settings.SetTransitionDuration(
|
| + base::TimeDelta::FromMilliseconds(kSwipeDelayMS));
|
| + settings.SetTweenType(ui::Tween::EASE_OUT);
|
| + new_layer->SetTransform(gfx::Transform());
|
| + }
|
| }
|
| }
|
| }
|
|
|