Chromium Code Reviews| Index: ash/common/wm/overview/window_selector_item.cc |
| diff --git a/ash/common/wm/overview/window_selector_item.cc b/ash/common/wm/overview/window_selector_item.cc |
| index 91d08e97c7bf56069619e81a3fe30c6f596d2c6e..e26f72de5cb43479a95f269672983843b6e649c3 100644 |
| --- a/ash/common/wm/overview/window_selector_item.cc |
| +++ b/ash/common/wm/overview/window_selector_item.cc |
| @@ -10,6 +10,7 @@ |
| #include "ash/common/material_design/material_design_controller.h" |
| #include "ash/common/metrics/user_metrics_action.h" |
| #include "ash/common/shell_window_ids.h" |
| +#include "ash/common/wm/overview/cleanup_animation_observer.h" |
| #include "ash/common/wm/overview/overview_animation_type.h" |
| #include "ash/common/wm/overview/scoped_overview_animation_settings.h" |
| #include "ash/common/wm/overview/scoped_overview_animation_settings_factory.h" |
| @@ -30,7 +31,9 @@ |
| #include "grit/ash_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| +#include "ui/compositor/layer_animation_sequence.h" |
| #include "ui/gfx/canvas.h" |
| +#include "ui/gfx/color_utils.h" |
| #include "ui/gfx/geometry/safe_integer_conversions.h" |
| #include "ui/gfx/geometry/vector2d.h" |
| #include "ui/gfx/paint_vector_icon.h" |
| @@ -97,6 +100,13 @@ static const float kDimmedItemOpacity = 0.5f; |
| // Opacity for fading out during closing a window. |
| static const float kClosingItemOpacity = 0.8f; |
| +// Opacity for the item header. |
| +static const float kHeaderOpacity = |
| + (SkColorGetA(kLabelBackgroundColor) / 255.f); |
| + |
| +// The time duration for fade out animations when exiting overview mode. |
| +static const int kTransitionMilliseconds = 300; |
| + |
| // Duration of background opacity transition for the selected label. |
| static const int kSelectorFadeInMilliseconds = 350; |
| @@ -156,43 +166,124 @@ OverviewCloseButton::OverviewCloseButton(views::ButtonListener* listener) |
| OverviewCloseButton::~OverviewCloseButton() {} |
| +} // namespace |
| + |
| // A View having rounded corners and a specified background color which is |
| // only painted within the bounds defined by the rounded corners. |
| // TODO(varkha): This duplicates code from RoundedImageView. Refactor these |
| // classes and move into ui/views. |
| -class RoundedContainerView : public views::View { |
| +class WindowSelectorItem::RoundedContainerView |
| + : public views::View, |
| + public gfx::AnimationDelegate, |
| + public ui::LayerAnimationObserver { |
| public: |
| - RoundedContainerView(int corner_radius, SkColor background) |
| - : corner_radius_(corner_radius), background_(background) {} |
| + RoundedContainerView(WindowSelectorItem* item, |
| + int corner_radius, |
| + SkColor background) |
| + : item_(item), |
| + corner_radius_(corner_radius), |
| + previous_color_(background), |
| + color_(background), |
| + last_alpha_(0), |
| + current_value_(0), |
| + layer_(nullptr), |
| + animation_(new gfx::SlideAnimation(this)) {} |
| ~RoundedContainerView() override {} |
| + void OnItemRestored() { item_ = nullptr; } |
| + |
| + void ObserveLayer(ui::Layer* layer) { |
| + layer_ = layer; |
| + layer_->GetAnimator()->AddObserver(this); |
| + } |
| + |
| + void set_color(SkColor color) { color_ = color; } |
| + |
| + void SetBackgroundOpacity(float opacity) { |
|
bruthig
2016/09/02 16:00:12
nit: IMO this would be better named as AnimateBack
varkha
2016/09/08 00:09:50
Done.
|
| + animation_->SetSlideDuration(kSelectorFadeInMilliseconds); |
| + animation_->Reset(0); |
| + animation_->Show(); |
| + color_ = SkColorSetA(color_, opacity * 255); |
| + } |
| + |
| void OnPaint(gfx::Canvas* canvas) override { |
| views::View::OnPaint(canvas); |
| - |
| SkScalar radius = SkIntToScalar(corner_radius_); |
| - const SkScalar kRadius[8] = {radius, radius, radius, radius, |
| - radius, radius, radius, radius}; |
| + const SkScalar kRadius[8] = {radius, radius, radius, radius, 0, 0, 0, 0}; |
| SkPath path; |
| gfx::Rect bounds(size()); |
| - bounds.set_height(bounds.height() + radius); |
| path.addRoundRect(gfx::RectToSkRect(bounds), kRadius); |
| SkPaint paint; |
| paint.setAntiAlias(true); |
| canvas->ClipPath(path, true); |
| - canvas->DrawColor(background_); |
| + |
| + SkColor color = previous_color_; |
| + if (color_ != color) |
| + color = color_utils::AlphaBlend(color_, previous_color_, current_value_); |
| + canvas->DrawColor(color); |
| + last_alpha_ = SkColorGetA(color); |
| } |
| private: |
| + // gfx::AnimationDelegate: |
| + void AnimationEnded(const gfx::Animation* animation) override { |
| + previous_color_ = color_; |
| + } |
| + |
| + void AnimationProgressed(const gfx::Animation* animation) override { |
| + current_value_ = animation_->CurrentValueBetween(0, 255); |
| + SchedulePaintInRect(GetLocalBounds()); |
| + } |
| + |
| + void AnimationCanceled(const gfx::Animation* animation) override { |
| + previous_color_ = color_; |
| + current_value_ = 255; |
| + SchedulePaintInRect(GetLocalBounds()); |
| + } |
| + |
| + // ui::LayerAnimationObserver: |
| + void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override { |
| + if (0 != (sequence->properties() & |
| + ui::LayerAnimationElement::AnimatableProperty::OPACITY)) { |
| + if (item_) |
| + item_->HideHeaderAndSetShape(0); |
| + if (layer_) { |
| + layer_->GetAnimator()->RemoveObserver(this); |
| + layer_ = nullptr; |
| + } |
| + animation_->SetSlideDuration(400); |
|
bruthig
2016/09/02 16:00:12
nit: Can the 400 be made a named constant like kSe
varkha
2016/09/02 21:38:37
Done.
|
| + animation_->Reset(0); |
| + animation_->Show(); |
| + } |
| + } |
| + |
| + void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override { |
| + if (0 != (sequence->properties() & |
| + ui::LayerAnimationElement::AnimatableProperty::OPACITY)) { |
| + if (layer_) { |
| + layer_->GetAnimator()->RemoveObserver(this); |
| + layer_ = nullptr; |
| + } |
| + } |
| + } |
| + |
| + void OnLayerAnimationScheduled( |
| + ui::LayerAnimationSequence* sequence) override {} |
| + |
| + WindowSelectorItem* item_; |
| int corner_radius_; |
| - SkColor background_; |
| + SkColor previous_color_; |
| + SkColor color_; |
| + int last_alpha_; |
| + int current_value_; |
| + ui::Layer* layer_; |
| + std::unique_ptr<gfx::SlideAnimation> animation_; |
|
bruthig
2016/09/02 16:00:12
Is a SlideAnimation required or would a LinearAnim
varkha
2016/09/08 00:09:50
SlideAnimation saves from some of the headaches li
|
| DISALLOW_COPY_AND_ASSIGN(RoundedContainerView); |
| }; |
| -} // namespace |
| - |
| bool WindowSelectorItem::use_mask_ = false; |
| bool WindowSelectorItem::use_shape_ = false; |
| @@ -223,8 +314,10 @@ gfx::Rect WindowSelectorItem::OverviewLabelButton::GetChildAreaBounds() { |
| class WindowSelectorItem::CaptionContainerView : public views::View { |
| public: |
| CaptionContainerView(WindowSelectorItem::OverviewLabelButton* label, |
| - views::ImageButton* close_button) |
| - : label_(label), close_button_(close_button) { |
| + views::ImageButton* close_button, |
| + WindowSelectorItem::RoundedContainerView* background) |
| + : label_(label), close_button_(close_button), background_(background) { |
| + AddChildView(background_); |
| AddChildView(label_); |
| AddChildView(close_button_); |
| } |
| @@ -239,6 +332,13 @@ class WindowSelectorItem::CaptionContainerView : public views::View { |
| // events from reaching the transformed window in overview. |
| gfx::Rect bounds(GetLocalBounds()); |
| bounds.Inset(kWindowSelectorMargin, kWindowSelectorMargin); |
| + gfx::Rect background_bounds(bounds); |
| + background_bounds.set_height(close_button_->GetPreferredSize().height()); |
| + background_bounds.set_y(background_bounds.y() + |
| + close_button_->GetPreferredSize().height() - |
| + background_bounds.height()); |
| + background_->SetBoundsRect(background_bounds); |
| + |
| const int visible_height = close_button_->GetPreferredSize().height(); |
| gfx::Insets label_padding(0, 0, bounds.height() - visible_height, |
| visible_height); |
| @@ -250,11 +350,10 @@ class WindowSelectorItem::CaptionContainerView : public views::View { |
| close_button_->SetBoundsRect(bounds); |
| } |
| - void OnBoundsChanged(const gfx::Rect& previous_bounds) override { Layout(); } |
| - |
| private: |
| WindowSelectorItem::OverviewLabelButton* label_; |
| views::ImageButton* close_button_; |
| + WindowSelectorItem::RoundedContainerView* background_; |
| DISALLOW_COPY_AND_ASSIGN(CaptionContainerView); |
| }; |
| @@ -265,10 +364,13 @@ WindowSelectorItem::WindowSelectorItem(WmWindow* window, |
| root_window_(window->GetRootWindow()), |
| transform_window_(window), |
| in_bounds_update_(false), |
| + selected_(false), |
| + first_time_update_(true), |
| caption_container_view_(nullptr), |
| window_label_button_view_(nullptr), |
| close_button_(new OverviewCloseButton(this)), |
| - window_selector_(window_selector) { |
| + window_selector_(window_selector), |
| + background_view_(nullptr) { |
| CreateWindowLabel(window->GetTitle()); |
| if (!ash::MaterialDesignController::IsOverviewMaterial()) { |
| views::Widget::InitParams params; |
| @@ -300,6 +402,8 @@ WindowSelectorItem::WindowSelectorItem(WmWindow* window, |
| } |
| WindowSelectorItem::~WindowSelectorItem() { |
| + if (background_view_) |
| + background_view_->OnItemRestored(); |
| GetWindow()->RemoveObserver(this); |
| } |
| @@ -309,6 +413,11 @@ WmWindow* WindowSelectorItem::GetWindow() { |
| void WindowSelectorItem::RestoreWindow() { |
| transform_window_.RestoreWindow(); |
| + if (background_view_) |
| + background_view_->OnItemRestored(); |
| + UpdateHeaderLayout( |
| + OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS); |
| + FadeOut(std::move(window_label_)); |
| } |
| void WindowSelectorItem::ShowWindowOnExit() { |
| @@ -347,28 +456,21 @@ void WindowSelectorItem::SetBounds(const gfx::Rect& target_bounds, |
| void WindowSelectorItem::SetSelected(bool selected) { |
| if (!ash::MaterialDesignController::IsOverviewMaterial()) |
| return; |
| - WmWindow* window = |
| - WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| - ui::ScopedLayerAnimationSettings animation_settings( |
| - window->GetLayer()->GetAnimator()); |
| - animation_settings.SetTransitionDuration( |
| - base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); |
| - animation_settings.SetTweenType(selected ? gfx::Tween::FAST_OUT_LINEAR_IN |
| - : gfx::Tween::LINEAR_OUT_SLOW_IN); |
| - animation_settings.SetPreemptionStrategy( |
| - ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| - window->SetOpacity(selected ? 0.0f : 1.0f); |
| - |
| - ui::ScopedLayerAnimationSettings animation_settings_shadow( |
| - shadow_->shadow_layer()->GetAnimator()); |
| - animation_settings_shadow.SetTransitionDuration( |
| - base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); |
| - animation_settings_shadow.SetTweenType(selected |
| - ? gfx::Tween::FAST_OUT_LINEAR_IN |
| - : gfx::Tween::LINEAR_OUT_SLOW_IN); |
| - animation_settings_shadow.SetPreemptionStrategy( |
| - ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| - shadow_->shadow_layer()->SetOpacity(selected ? 0.0f : 1.0f); |
| + selected_ = selected; |
| + background_view_->SetBackgroundOpacity(selected ? 0.0f : kHeaderOpacity); |
| + |
| + if (shadow_) { |
| + ui::ScopedLayerAnimationSettings animation_settings_shadow( |
| + shadow_->shadow_layer()->GetAnimator()); |
| + animation_settings_shadow.SetTransitionDuration( |
| + base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); |
| + animation_settings_shadow.SetTweenType( |
| + selected ? gfx::Tween::FAST_OUT_LINEAR_IN |
| + : gfx::Tween::LINEAR_OUT_SLOW_IN); |
| + animation_settings_shadow.SetPreemptionStrategy( |
| + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| + shadow_->shadow_layer()->SetOpacity(selected ? 0.0f : 1.0f); |
| + } |
| } |
| void WindowSelectorItem::RecomputeWindowTransforms() { |
| @@ -409,6 +511,10 @@ void WindowSelectorItem::CloseWindow() { |
| transform_window_.Close(); |
| } |
| +void WindowSelectorItem::HideHeaderAndSetShape(int radius) { |
| + transform_window_.HideHeaderAndSetShape(use_mask_, use_shape_, radius); |
|
bruthig
2016/09/02 16:00:12
[Discussed offline] Since HideHeaderAndSetShape()
varkha
2016/09/08 00:09:50
Agreed. I will be posting removal of those command
|
| +} |
| + |
| void WindowSelectorItem::SetDimmed(bool dimmed) { |
| dimmed_ = dimmed; |
| SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); |
| @@ -473,17 +579,17 @@ void WindowSelectorItem::SetItemBounds(const gfx::Rect& target_bounds, |
| screen_rect, selector_item_bounds); |
| ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
| transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
| - // Rounded corners are achieved by using a mask layer on the original window |
| - // before the transform. Dividing by scale factor obtains the corner radius |
| - // which when scaled will yield |kLabelBackgroundRadius|. |
| - transform_window_.SetTransform( |
| - root_window_, transform, use_mask_, use_shape_, |
| - (kLabelBackgroundRadius / GetItemScale(target_bounds.size()))); |
| + transform_window_.SetTransform(root_window_, transform, use_mask_); |
| transform_window_.set_overview_transform(transform); |
| } |
| void WindowSelectorItem::SetOpacity(float opacity) { |
| window_label_->SetOpacity(opacity); |
| + if (background_view_) { |
| + background_view_->SetBackgroundOpacity(selected_ ? 0.f : kHeaderOpacity * |
| + opacity); |
| + } |
| + |
| if (!ash::MaterialDesignController::IsOverviewMaterial()) |
| close_button_widget_->SetOpacity(opacity); |
| @@ -514,23 +620,38 @@ void WindowSelectorItem::UpdateWindowLabel( |
| void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { |
| const bool material = ash::MaterialDesignController::IsOverviewMaterial(); |
| - window_label_.reset(new views::Widget); |
| - views::Widget::InitParams params; |
| - params.type = views::Widget::InitParams::TYPE_POPUP; |
| - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| - params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| - params.visible_on_all_workspaces = true; |
| - params.name = "OverviewModeLabel"; |
| - window_label_->set_focus_on_creation(false); |
| + |
| + if (material) { |
| + background_view_ = new RoundedContainerView( |
|
bruthig
2016/09/02 16:00:12
nit: It would be helpful to have a comment about w
varkha
2016/09/08 00:09:50
Done.
|
| + this, kLabelBackgroundRadius, transform_window_.GetTopColor()); |
| + } |
| + |
| + views::Widget::InitParams params_label; |
| + params_label.type = views::Widget::InitParams::TYPE_POPUP; |
| + params_label.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| + params_label.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| + params_label.visible_on_all_workspaces = true; |
| + params_label.name = "OverviewModeLabel"; |
| + params_label.activatable = |
| + views::Widget::InitParams::Activatable::ACTIVATABLE_DEFAULT; |
| + params_label.accept_events = true; |
| root_window_->GetRootWindowController() |
| ->ConfigureWidgetInitParamsForContainer( |
| - window_label_.get(), kShellWindowId_StatusContainer, ¶ms); |
| - window_label_->Init(params); |
| + window_label_.get(), |
| + transform_window_.window()->GetParent()->GetShellWindowId(), |
| + ¶ms_label); |
| + window_label_.reset(new views::Widget); |
| + window_label_->set_focus_on_creation(false); |
| + window_label_->Init(params_label); |
| window_label_button_view_ = new OverviewLabelButton(this, title); |
| window_label_button_view_->SetBorder(views::Border::NullBorder()); |
| window_label_button_view_->SetEnabledTextColors(kLabelColor); |
| window_label_button_view_->set_animate_on_state_change(false); |
| if (material) { |
| + WmWindow* label_window = |
| + WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| + label_window->GetParent()->StackChildAbove(label_window, |
| + transform_window_.window()); |
| window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| } else { |
| window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| @@ -545,10 +666,11 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { |
| // Hint at the background color that the label will be drawn onto (for |
| // subpixel antialiasing). Does not actually set the background color. |
| window_label_button_view_->SetBackgroundColorHint(kLabelBackgroundColor); |
| - caption_container_view_ = |
| - new CaptionContainerView(window_label_button_view_, close_button_); |
| + caption_container_view_ = new CaptionContainerView( |
| + window_label_button_view_, close_button_, background_view_); |
| window_label_->SetContentsView(caption_container_view_); |
| window_label_button_view_->SetVisible(false); |
| + window_label_->SetOpacity(0); |
| window_label_->Show(); |
| shadow_.reset(new ::wm::Shadow()); |
| @@ -556,23 +678,14 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { |
| shadow_->layer()->SetVisible(true); |
| window_label_->GetLayer()->Add(shadow_->layer()); |
| window_label_->GetLayer()->SetMasksToBounds(false); |
| - |
| - views::View* background_view = |
| - new RoundedContainerView(kLabelBackgroundRadius, kLabelBackgroundColor); |
| - window_label_selector_.reset(new views::Widget); |
| - params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO; |
| - params.accept_events = false; |
| - params.name = "OverviewModeLabelSelector"; |
| - window_label_selector_->Init(params); |
| - window_label_selector_->set_focus_on_creation(false); |
| - window_label_selector_->SetContentsView(background_view); |
| - window_label_selector_->Show(); |
| + UpdateHeaderLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
| } else { |
| // Indicate that the label will be drawn onto a transparent background |
| // (disables subpixel antialiasing). |
| window_label_button_view_->SetBackgroundColorHint(SK_ColorTRANSPARENT); |
| window_label_->SetContentsView(window_label_button_view_); |
| } |
| + first_time_update_ = false; |
| } |
| void WindowSelectorItem::UpdateHeaderLayout( |
| @@ -582,44 +695,43 @@ void WindowSelectorItem::UpdateHeaderLayout( |
| if (ash::MaterialDesignController::IsOverviewMaterial()) { |
| gfx::Rect label_rect(close_button_->GetPreferredSize()); |
| - label_rect.set_y(-label_rect.height()); |
| label_rect.set_width(transformed_window_bounds.width()); |
| - |
| + // For tabbed windows the initial bounds of the caption are set such that it |
| + // appears to be "growing" up from the window content area. |
| + label_rect.set_y(first_time_update_ ? -transform_window_.GetTopInset() |
| + : -label_rect.height()); |
| if (!window_label_button_view_->visible()) { |
| window_label_button_view_->SetVisible(true); |
|
bruthig
2016/09/02 16:00:12
Am I correct that this SetVisible() call invokes a
varkha
2016/09/08 00:09:50
I don't think so. |window_label_button_view_| is j
bruthig
2016/09/08 18:32:49
Acknowledged.
|
| + if (background_view_) { |
| + background_view_->ObserveLayer(window_label_->GetLayer()); |
| + background_view_->set_color(kLabelBackgroundColor); |
| + } |
| SetupFadeInAfterLayout(window_label_.get()); |
| - SetupFadeInAfterLayout(window_label_selector_.get()); |
| } |
| WmWindow* window_label_window = |
| WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| - WmWindow* window_label_selector_window = |
| - WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = |
| ScopedOverviewAnimationSettingsFactory::Get() |
| ->CreateOverviewAnimationSettings(animation_type, |
| window_label_window); |
| - std::unique_ptr<ScopedOverviewAnimationSettings> |
| - animation_settings_selector = |
| - ScopedOverviewAnimationSettingsFactory::Get() |
| - ->CreateOverviewAnimationSettings(animation_type, |
| - window_label_selector_window); |
| - window_label_selector_window->SetBounds(label_rect); |
| // |window_label_window| covers both the transformed window and the header |
| // as well as the gap between the windows to prevent events from reaching |
| // the window including its sizing borders. |
| - label_rect.set_height(label_rect.height() + |
| - transformed_window_bounds.height()); |
| - gfx::Rect shadow_bounds(label_rect.size()); |
| + if (!first_time_update_) { |
| + label_rect.set_height(close_button_->GetPreferredSize().height() + |
| + transformed_window_bounds.height()); |
| + } |
| label_rect.Inset(-kWindowSelectorMargin, -kWindowSelectorMargin); |
| window_label_window->SetBounds(label_rect); |
| gfx::Transform label_transform; |
| label_transform.Translate(transformed_window_bounds.x(), |
| transformed_window_bounds.y()); |
| window_label_window->SetTransform(label_transform); |
| - window_label_selector_window->SetTransform(label_transform); |
| - shadow_bounds.Offset(kWindowSelectorMargin, kWindowSelectorMargin); |
| - shadow_->SetContentBounds(shadow_bounds); |
| + gfx::Rect shadow_bounds(label_rect.size()); |
| + shadow_bounds.Inset(kWindowSelectorMargin, kWindowSelectorMargin); |
| + if (shadow_) |
| + shadow_->SetContentBounds(shadow_bounds); |
| } else { |
| if (!close_button_->visible()) { |
| close_button_->SetVisible(true); |
| @@ -647,21 +759,14 @@ void WindowSelectorItem::AnimateOpacity(float opacity, |
| transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
| transform_window_.SetOpacity(opacity); |
| + const float header_opacity = selected_ ? 0.f : kHeaderOpacity * opacity; |
| WmWindow* window_label_window = |
| WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label = |
| ScopedOverviewAnimationSettingsFactory::Get() |
| ->CreateOverviewAnimationSettings(animation_type, |
| window_label_window); |
| - window_label_window->SetOpacity(opacity); |
| - |
| - WmWindow* window_label_selector_window = |
| - WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| - std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector = |
| - ScopedOverviewAnimationSettingsFactory::Get() |
| - ->CreateOverviewAnimationSettings(animation_type, |
| - window_label_selector_window); |
| - window_label_selector_window->SetOpacity(opacity); |
| + window_label_window->SetOpacity(header_opacity); |
| } |
| void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
| @@ -670,4 +775,34 @@ void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
| GetWindow()->GetTitle())); |
| } |
| +void WindowSelectorItem::FadeOut(std::unique_ptr<views::Widget> widget) { |
| + widget->SetOpacity(1.f); |
| + |
| + // Fade out the widget. This animation continues past the lifetime of |this|. |
| + // TODO(varkha): Add a new OverviewAnimationType for this. |
| + WmWindow* widget_window = WmLookup::Get()->GetWindowForWidget(widget.get()); |
| + widget_window->GetLayer()->GetAnimator()->SchedulePauseForProperties( |
| + base::TimeDelta::FromMilliseconds(kTransitionMilliseconds / 4), |
| + ui::LayerAnimationElement::OPACITY); |
| + ui::ScopedLayerAnimationSettings animation_settings( |
| + widget_window->GetLayer()->GetAnimator()); |
| + animation_settings.SetTransitionDuration( |
| + base::TimeDelta::FromMilliseconds(kTransitionMilliseconds / 4 * 3)); |
| + animation_settings.SetTweenType(gfx::Tween::EASE_OUT); |
| + animation_settings.SetPreemptionStrategy( |
| + ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); |
| + // CleanupAnimationObserver will delete itself (and the widget) when the |
| + // opacity animation is complete. |
| + // Ownership over the observer is passed to the window_selector_->delegate() |
| + // which has longer lifetime so that animations can continue even after the |
| + // overview mode is shut down. |
| + views::Widget* widget_ptr = widget.get(); |
| + std::unique_ptr<CleanupAnimationObserver> observer( |
| + new CleanupAnimationObserver(std::move(widget))); |
| + animation_settings.AddObserver(observer.get()); |
| + window_selector_->delegate()->AddDelayedAnimationObserver( |
| + std::move(observer)); |
| + widget_ptr->SetOpacity(0.f); |
| +} |
| + |
| } // namespace ash |