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

Side by Side Diff: ash/common/wm/overview/window_selector_item.cc

Issue 2239233002: [ash-md] Fades overview header in and out (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: [ash-md] Fades overview header in and out (crash fix for non-md path) 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/common/wm/overview/window_selector_item.h" 5 #include "ash/common/wm/overview/window_selector_item.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "ash/common/material_design/material_design_controller.h" 10 #include "ash/common/material_design/material_design_controller.h"
11 #include "ash/common/metrics/user_metrics_action.h" 11 #include "ash/common/metrics/user_metrics_action.h"
12 #include "ash/common/shell_window_ids.h" 12 #include "ash/common/shell_window_ids.h"
13 #include "ash/common/wm/overview/cleanup_animation_observer.h"
13 #include "ash/common/wm/overview/overview_animation_type.h" 14 #include "ash/common/wm/overview/overview_animation_type.h"
14 #include "ash/common/wm/overview/scoped_overview_animation_settings.h" 15 #include "ash/common/wm/overview/scoped_overview_animation_settings.h"
15 #include "ash/common/wm/overview/scoped_overview_animation_settings_factory.h" 16 #include "ash/common/wm/overview/scoped_overview_animation_settings_factory.h"
16 #include "ash/common/wm/overview/scoped_transform_overview_window.h" 17 #include "ash/common/wm/overview/scoped_transform_overview_window.h"
17 #include "ash/common/wm/overview/window_selector.h" 18 #include "ash/common/wm/overview/window_selector.h"
18 #include "ash/common/wm/overview/window_selector_controller.h" 19 #include "ash/common/wm/overview/window_selector_controller.h"
19 #include "ash/common/wm/window_state.h" 20 #include "ash/common/wm/window_state.h"
20 #include "ash/common/wm_lookup.h" 21 #include "ash/common/wm_lookup.h"
21 #include "ash/common/wm_root_window_controller.h" 22 #include "ash/common/wm_root_window_controller.h"
22 #include "ash/common/wm_shell.h" 23 #include "ash/common/wm_shell.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 static const int kWindowSelectorMargin = kWindowMarginMD * 2; 62 static const int kWindowSelectorMargin = kWindowMarginMD * 2;
62 63
63 // Foreground label color. 64 // Foreground label color.
64 static const SkColor kLabelColor = SK_ColorWHITE; 65 static const SkColor kLabelColor = SK_ColorWHITE;
65 66
66 // TODO(tdanderson): Move this to a central location. 67 // TODO(tdanderson): Move this to a central location.
67 static const SkColor kCloseButtonColor = SK_ColorWHITE; 68 static const SkColor kCloseButtonColor = SK_ColorWHITE;
68 69
69 // Label background color used with Material Design. 70 // Label background color used with Material Design.
70 // TODO(varkha): Make background color conform to window header. 71 // TODO(varkha): Make background color conform to window header.
71 static const SkColor kLabelBackgroundColor = SkColorSetARGB(25, 255, 255, 255); 72 static const SkColor kLabelBackgroundColor = SkColorSetARGB(254, 225, 225, 225);
72 73
73 // Corner radius for the selection tiles used with Material Design. 74 // Corner radius for the selection tiles used with Material Design.
74 static int kLabelBackgroundRadius = 2; 75 static int kLabelBackgroundRadius = 2;
75 76
76 // Label shadow color. 77 // Label shadow color.
77 static const SkColor kLabelShadow = SkColorSetARGB(176, 0, 0, 0); 78 static const SkColor kLabelShadow = SkColorSetARGB(176, 0, 0, 0);
78 79
79 // Vertical padding for the label, on top of it. 80 // Vertical padding for the label, on top of it.
80 static const int kVerticalLabelPadding = 20; 81 static const int kVerticalLabelPadding = 20;
81 82
82 // Horizontal padding for the label, on both sides. Used with Material Design. 83 // Horizontal padding for the label, on both sides. Used with Material Design.
83 static const int kHorizontalLabelPaddingMD = 8; 84 static const int kHorizontalLabelPaddingMD = 8;
84 85
85 // Solid shadow length from the label 86 // Solid shadow length from the label
86 static const int kVerticalShadowOffset = 1; 87 static const int kVerticalShadowOffset = 1;
87 88
88 // Amount of blur applied to the label shadow 89 // Amount of blur applied to the label shadow
89 static const int kShadowBlur = 10; 90 static const int kShadowBlur = 10;
90 91
91 // Height of an item header in Material Design. 92 // Height of an item header in Material Design.
92 static const int kHeaderHeight = 32; 93 static const int kHeaderHeight = 32;
93 94
94 // Opacity for dimmed items. 95 // Opacity for dimmed items.
95 static const float kDimmedItemOpacity = 0.5f; 96 static const float kDimmedItemOpacity = 0.5f;
96 97
97 // Opacity for fading out during closing a window. 98 // Opacity for fading out during closing a window.
98 static const float kClosingItemOpacity = 0.8f; 99 static const float kClosingItemOpacity = 0.8f;
99 100
101 // Opacity for the item header.
102 static const float kHeaderOpacity = 0.2f;
103
100 // Duration of background opacity transition for the selected label. 104 // Duration of background opacity transition for the selected label.
101 static const int kSelectorFadeInMilliseconds = 350; 105 static const int kSelectorFadeInMilliseconds = 350;
102 106
107 // The time duration for fade out animations when exiting overview mode.
108 const int kTransitionMilliseconds = 300;
109
103 // Before closing a window animate both the window and the caption to shrink by 110 // Before closing a window animate both the window and the caption to shrink by
104 // this fraction of size. 111 // this fraction of size.
105 static const float kPreCloseScale = 0.02f; 112 static const float kPreCloseScale = 0.02f;
106 113
107 // Convenience method to fade in a Window with predefined animation settings. 114 // Convenience method to fade in a Window with predefined animation settings.
108 // Note: The fade in animation will occur after a delay where the delay is how 115 // Note: The fade in animation will occur after a delay where the delay is how
109 // long the lay out animations take. 116 // long the lay out animations take.
110 void SetupFadeInAfterLayout(views::Widget* widget) { 117 void SetupFadeInAfterLayout(views::Widget* widget) {
111 WmWindow* window = WmLookup::Get()->GetWindowForWidget(widget); 118 WmWindow* window = WmLookup::Get()->GetWindowForWidget(widget);
112 window->SetOpacity(0.0f); 119 window->SetOpacity(0.0f);
113 std::unique_ptr<ScopedOverviewAnimationSettings> 120 std::unique_ptr<ScopedOverviewAnimationSettings>
114 scoped_overview_animation_settings = 121 scoped_overview_animation_settings =
115 ScopedOverviewAnimationSettingsFactory::Get() 122 ScopedOverviewAnimationSettingsFactory::Get()
116 ->CreateOverviewAnimationSettings( 123 ->CreateOverviewAnimationSettings(
117 OverviewAnimationType:: 124 OverviewAnimationType::
118 OVERVIEW_ANIMATION_ENTER_OVERVIEW_MODE_FADE_IN, 125 OVERVIEW_ANIMATION_ENTER_OVERVIEW_MODE_FADE_IN,
119 window); 126 window);
120 window->SetOpacity(1.0f); 127 window->SetOpacity(1.0f);
121 } 128 }
122 129
130 void SetupOpacityAfterLayout(views::Widget* widget) {
131 WmWindow* window = WmLookup::Get()->GetWindowForWidget(widget);
132 std::unique_ptr<ScopedOverviewAnimationSettings>
133 scoped_overview_animation_settings =
134 ScopedOverviewAnimationSettingsFactory::Get()
135 ->CreateOverviewAnimationSettings(
136 OverviewAnimationType::OVERVIEW_ANIMATION_FADE_IN_HEADER,
137 window);
138 window->SetOpacity(kHeaderOpacity);
139 }
140
123 // An image button with a close window icon. 141 // An image button with a close window icon.
124 class OverviewCloseButton : public views::ImageButton { 142 class OverviewCloseButton : public views::ImageButton {
125 public: 143 public:
126 explicit OverviewCloseButton(views::ButtonListener* listener); 144 explicit OverviewCloseButton(views::ButtonListener* listener);
127 ~OverviewCloseButton() override; 145 ~OverviewCloseButton() override;
128 146
129 private: 147 private:
130 gfx::ImageSkia icon_image_; 148 gfx::ImageSkia icon_image_;
131 149
132 DISALLOW_COPY_AND_ASSIGN(OverviewCloseButton); 150 DISALLOW_COPY_AND_ASSIGN(OverviewCloseButton);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 276
259 DISALLOW_COPY_AND_ASSIGN(CaptionContainerView); 277 DISALLOW_COPY_AND_ASSIGN(CaptionContainerView);
260 }; 278 };
261 279
262 WindowSelectorItem::WindowSelectorItem(WmWindow* window, 280 WindowSelectorItem::WindowSelectorItem(WmWindow* window,
263 WindowSelector* window_selector) 281 WindowSelector* window_selector)
264 : dimmed_(false), 282 : dimmed_(false),
265 root_window_(window->GetRootWindow()), 283 root_window_(window->GetRootWindow()),
266 transform_window_(window), 284 transform_window_(window),
267 in_bounds_update_(false), 285 in_bounds_update_(false),
286 selected_(false),
287 first_time_(true),
268 caption_container_view_(nullptr), 288 caption_container_view_(nullptr),
269 window_label_button_view_(nullptr), 289 window_label_button_view_(nullptr),
270 close_button_(new OverviewCloseButton(this)), 290 close_button_(new OverviewCloseButton(this)),
271 window_selector_(window_selector) { 291 window_selector_(window_selector) {
272 CreateWindowLabel(window->GetTitle()); 292 CreateWindowLabel(window->GetTitle());
273 if (!ash::MaterialDesignController::IsOverviewMaterial()) { 293 if (!ash::MaterialDesignController::IsOverviewMaterial()) {
274 views::Widget::InitParams params; 294 views::Widget::InitParams params;
275 params.type = views::Widget::InitParams::TYPE_POPUP; 295 params.type = views::Widget::InitParams::TYPE_POPUP;
276 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 296 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
277 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 297 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
(...skipping 23 matching lines...) Expand all
301 WindowSelectorItem::~WindowSelectorItem() { 321 WindowSelectorItem::~WindowSelectorItem() {
302 GetWindow()->RemoveObserver(this); 322 GetWindow()->RemoveObserver(this);
303 } 323 }
304 324
305 WmWindow* WindowSelectorItem::GetWindow() { 325 WmWindow* WindowSelectorItem::GetWindow() {
306 return transform_window_.window(); 326 return transform_window_.window();
307 } 327 }
308 328
309 void WindowSelectorItem::RestoreWindow() { 329 void WindowSelectorItem::RestoreWindow() {
310 transform_window_.RestoreWindow(); 330 transform_window_.RestoreWindow();
331 UpdateHeaderLayout(
332 OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS);
333 FadeOut(std::move(window_label_));
334 if (window_label_selector_)
335 FadeOut(std::move(window_label_selector_));
311 } 336 }
312 337
313 void WindowSelectorItem::ShowWindowOnExit() { 338 void WindowSelectorItem::ShowWindowOnExit() {
314 transform_window_.ShowWindowOnExit(); 339 transform_window_.ShowWindowOnExit();
315 } 340 }
316 341
317 void WindowSelectorItem::PrepareForOverview() { 342 void WindowSelectorItem::PrepareForOverview() {
318 transform_window_.PrepareForOverview(); 343 transform_window_.PrepareForOverview();
319 } 344 }
320 345
(...skipping 18 matching lines...) Expand all
339 // SetItemBounds is called before UpdateHeaderLayout so the header can 364 // SetItemBounds is called before UpdateHeaderLayout so the header can
340 // properly use the updated windows bounds. 365 // properly use the updated windows bounds.
341 UpdateHeaderLayout(animation_type); 366 UpdateHeaderLayout(animation_type);
342 if (!ash::MaterialDesignController::IsOverviewMaterial()) 367 if (!ash::MaterialDesignController::IsOverviewMaterial())
343 UpdateWindowLabel(target_bounds, animation_type); 368 UpdateWindowLabel(target_bounds, animation_type);
344 } 369 }
345 370
346 void WindowSelectorItem::SetSelected(bool selected) { 371 void WindowSelectorItem::SetSelected(bool selected) {
347 if (!ash::MaterialDesignController::IsOverviewMaterial()) 372 if (!ash::MaterialDesignController::IsOverviewMaterial())
348 return; 373 return;
374 selected_ = selected;
349 WmWindow* window = 375 WmWindow* window =
350 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); 376 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get());
351 ui::ScopedLayerAnimationSettings animation_settings( 377 ui::ScopedLayerAnimationSettings animation_settings(
352 window->GetLayer()->GetAnimator()); 378 window->GetLayer()->GetAnimator());
353 animation_settings.SetTransitionDuration( 379 animation_settings.SetTransitionDuration(
354 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); 380 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds));
355 animation_settings.SetTweenType(selected ? gfx::Tween::FAST_OUT_LINEAR_IN 381 animation_settings.SetTweenType(selected ? gfx::Tween::FAST_OUT_LINEAR_IN
356 : gfx::Tween::LINEAR_OUT_SLOW_IN); 382 : gfx::Tween::LINEAR_OUT_SLOW_IN);
357 animation_settings.SetPreemptionStrategy( 383 animation_settings.SetPreemptionStrategy(
358 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 384 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
359 window->SetOpacity(selected ? 0.0f : 1.0f); 385 window->SetOpacity(selected ? 0.0f : kHeaderOpacity);
360 386
361 ui::ScopedLayerAnimationSettings animation_settings_shadow( 387 ui::ScopedLayerAnimationSettings animation_settings_shadow(
362 shadow_->shadow_layer()->GetAnimator()); 388 shadow_->shadow_layer()->GetAnimator());
363 animation_settings_shadow.SetTransitionDuration( 389 animation_settings_shadow.SetTransitionDuration(
364 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); 390 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds));
365 animation_settings_shadow.SetTweenType(selected 391 animation_settings_shadow.SetTweenType(selected
366 ? gfx::Tween::FAST_OUT_LINEAR_IN 392 ? gfx::Tween::FAST_OUT_LINEAR_IN
367 : gfx::Tween::LINEAR_OUT_SLOW_IN); 393 : gfx::Tween::LINEAR_OUT_SLOW_IN);
368 animation_settings_shadow.SetPreemptionStrategy( 394 animation_settings_shadow.SetPreemptionStrategy(
369 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 395 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 screen_rect, target_bounds, top_view_inset, title_height); 496 screen_rect, target_bounds, top_view_inset, title_height);
471 gfx::Transform transform = ScopedTransformOverviewWindow::GetTransformForRect( 497 gfx::Transform transform = ScopedTransformOverviewWindow::GetTransformForRect(
472 screen_rect, selector_item_bounds); 498 screen_rect, selector_item_bounds);
473 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; 499 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings;
474 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); 500 transform_window_.BeginScopedAnimation(animation_type, &animation_settings);
475 // Rounded corners are achieved by using a mask layer on the original window 501 // Rounded corners are achieved by using a mask layer on the original window
476 // before the transform. Dividing by scale factor obtains the corner radius 502 // before the transform. Dividing by scale factor obtains the corner radius
477 // which when scaled will yield |kLabelBackgroundRadius|. 503 // which when scaled will yield |kLabelBackgroundRadius|.
478 transform_window_.SetTransform( 504 transform_window_.SetTransform(
479 root_window_, transform, use_mask_, use_shape_, 505 root_window_, transform, use_mask_, use_shape_,
480 (kLabelBackgroundRadius / GetItemScale(target_bounds.size()))); 506 (kLabelBackgroundRadius / GetItemScale(target_bounds.size())),
507 animation_type != OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
481 transform_window_.set_overview_transform(transform); 508 transform_window_.set_overview_transform(transform);
482 } 509 }
483 510
484 void WindowSelectorItem::SetOpacity(float opacity) { 511 void WindowSelectorItem::SetOpacity(float opacity) {
485 window_label_->SetOpacity(opacity); 512 window_label_->SetOpacity(opacity);
513 if (window_label_selector_) {
514 window_label_selector_->SetOpacity(selected_ ? 0.f
515 : kHeaderOpacity * opacity);
516 }
517
486 if (!ash::MaterialDesignController::IsOverviewMaterial()) 518 if (!ash::MaterialDesignController::IsOverviewMaterial())
487 close_button_widget_->SetOpacity(opacity); 519 close_button_widget_->SetOpacity(opacity);
488 520
489 transform_window_.SetOpacity(opacity); 521 transform_window_.SetOpacity(opacity);
490 } 522 }
491 523
492 void WindowSelectorItem::UpdateWindowLabel( 524 void WindowSelectorItem::UpdateWindowLabel(
493 const gfx::Rect& window_bounds, 525 const gfx::Rect& window_bounds,
494 OverviewAnimationType animation_type) { 526 OverviewAnimationType animation_type) {
495 if (!window_label_->IsVisible()) { 527 if (!window_label_->IsVisible()) {
(...skipping 10 matching lines...) Expand all
506 animation_type, 538 animation_type,
507 WmLookup::Get()->GetWindowForWidget(window_label_.get())); 539 WmLookup::Get()->GetWindowForWidget(window_label_.get()));
508 540
509 WmWindow* window_label_window = 541 WmWindow* window_label_window =
510 WmLookup::Get()->GetWindowForWidget(window_label_.get()); 542 WmLookup::Get()->GetWindowForWidget(window_label_.get());
511 window_label_window->SetBounds(label_bounds); 543 window_label_window->SetBounds(label_bounds);
512 } 544 }
513 545
514 void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { 546 void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
515 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); 547 const bool material = ash::MaterialDesignController::IsOverviewMaterial();
516 window_label_.reset(new views::Widget);
517 views::Widget::InitParams params; 548 views::Widget::InitParams params;
518 params.type = views::Widget::InitParams::TYPE_POPUP; 549 params.type = views::Widget::InitParams::TYPE_POPUP;
519 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 550 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
520 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 551 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
521 params.visible_on_all_workspaces = true; 552 params.visible_on_all_workspaces = true;
522 window_label_->set_focus_on_creation(false);
523 root_window_->GetRootWindowController() 553 root_window_->GetRootWindowController()
524 ->ConfigureWidgetInitParamsForContainer( 554 ->ConfigureWidgetInitParamsForContainer(
525 window_label_.get(), kShellWindowId_StatusContainer, &params); 555 window_label_.get(), kShellWindowId_StatusContainer, &params);
556
557 if (material) {
558 views::View* background_view =
559 new RoundedContainerView(kLabelBackgroundRadius, kLabelBackgroundColor);
560 window_label_selector_.reset(new views::Widget);
561 params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
562 params.accept_events = false;
563 window_label_selector_->Init(params);
564 window_label_selector_->set_focus_on_creation(false);
565 window_label_selector_->SetContentsView(background_view);
566 window_label_selector_->Show();
567 }
568
569 params.activatable =
570 views::Widget::InitParams::Activatable::ACTIVATABLE_DEFAULT;
571 params.accept_events = true;
572 window_label_.reset(new views::Widget);
573 window_label_->set_focus_on_creation(false);
526 window_label_->Init(params); 574 window_label_->Init(params);
527 window_label_button_view_ = new OverviewLabelButton(this, title); 575 window_label_button_view_ = new OverviewLabelButton(this, title);
528 window_label_button_view_->SetBorder(views::Border::NullBorder()); 576 window_label_button_view_->SetBorder(views::Border::NullBorder());
529 window_label_button_view_->SetEnabledTextColors(kLabelColor); 577 window_label_button_view_->SetEnabledTextColors(kLabelColor);
530 window_label_button_view_->set_animate_on_state_change(false); 578 window_label_button_view_->set_animate_on_state_change(false);
531 if (material) { 579 if (material) {
532 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 580 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
533 } else { 581 } else {
534 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 582 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
535 window_label_button_view_->SetTextShadows(gfx::ShadowValues( 583 window_label_button_view_->SetTextShadows(gfx::ShadowValues(
(...skipping 11 matching lines...) Expand all
547 new CaptionContainerView(window_label_button_view_, close_button_); 595 new CaptionContainerView(window_label_button_view_, close_button_);
548 window_label_->SetContentsView(caption_container_view_); 596 window_label_->SetContentsView(caption_container_view_);
549 window_label_button_view_->SetVisible(false); 597 window_label_button_view_->SetVisible(false);
550 window_label_->Show(); 598 window_label_->Show();
551 599
552 shadow_.reset(new ::wm::Shadow()); 600 shadow_.reset(new ::wm::Shadow());
553 shadow_->Init(::wm::Shadow::STYLE_INACTIVE); 601 shadow_->Init(::wm::Shadow::STYLE_INACTIVE);
554 shadow_->layer()->SetVisible(true); 602 shadow_->layer()->SetVisible(true);
555 window_label_->GetLayer()->Add(shadow_->layer()); 603 window_label_->GetLayer()->Add(shadow_->layer());
556 window_label_->GetLayer()->SetMasksToBounds(false); 604 window_label_->GetLayer()->SetMasksToBounds(false);
557 605 UpdateHeaderLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
558 views::View* background_view =
559 new RoundedContainerView(kLabelBackgroundRadius, kLabelBackgroundColor);
560 window_label_selector_.reset(new views::Widget);
561 params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
562 params.accept_events = false;
563 window_label_selector_->Init(params);
564 window_label_selector_->set_focus_on_creation(false);
565 window_label_selector_->SetContentsView(background_view);
566 window_label_selector_->Show();
567 } else { 606 } else {
568 // Indicate that the label will be drawn onto a transparent background 607 // Indicate that the label will be drawn onto a transparent background
569 // (disables subpixel antialiasing). 608 // (disables subpixel antialiasing).
570 window_label_button_view_->SetBackgroundColorHint(SK_ColorTRANSPARENT); 609 window_label_button_view_->SetBackgroundColorHint(SK_ColorTRANSPARENT);
571 window_label_->SetContentsView(window_label_button_view_); 610 window_label_->SetContentsView(window_label_button_view_);
572 } 611 }
612 first_time_ = false;
573 } 613 }
574 614
575 void WindowSelectorItem::UpdateHeaderLayout( 615 void WindowSelectorItem::UpdateHeaderLayout(
576 OverviewAnimationType animation_type) { 616 OverviewAnimationType animation_type) {
577 gfx::Rect transformed_window_bounds = root_window_->ConvertRectFromScreen( 617 gfx::Rect transformed_window_bounds = root_window_->ConvertRectFromScreen(
578 transform_window_.GetTransformedBounds(hide_header())); 618 transform_window_.GetTransformedBounds(hide_header()));
579 619
580 if (ash::MaterialDesignController::IsOverviewMaterial()) { 620 if (ash::MaterialDesignController::IsOverviewMaterial()) {
581 gfx::Rect label_rect(close_button_->GetPreferredSize()); 621 gfx::Rect label_rect(close_button_->GetPreferredSize());
582 label_rect.set_y(-label_rect.height()); 622 if (first_time_) {
623 if (transform_window_.GetTopInset() == 0) {
624 label_rect.set_y(0);
625 label_rect.set_height(0);
626 } else {
627 label_rect.set_y(-transform_window_.GetTopInset());
628 }
629 } else {
630 label_rect.set_y(-label_rect.height());
631 }
583 label_rect.set_width(transformed_window_bounds.width()); 632 label_rect.set_width(transformed_window_bounds.width());
584 633
585 if (!window_label_button_view_->visible()) { 634 if (!window_label_button_view_->visible()) {
586 window_label_button_view_->SetVisible(true); 635 window_label_button_view_->SetVisible(true);
587 SetupFadeInAfterLayout(window_label_.get()); 636 SetupFadeInAfterLayout(window_label_.get());
588 SetupFadeInAfterLayout(window_label_selector_.get()); 637 SetupFadeInAfterLayout(window_label_selector_.get());
638 SetupOpacityAfterLayout(window_label_selector_.get());
589 } 639 }
590 WmWindow* window_label_window = 640 WmWindow* window_label_window =
591 WmLookup::Get()->GetWindowForWidget(window_label_.get()); 641 WmLookup::Get()->GetWindowForWidget(window_label_.get());
592 WmWindow* window_label_selector_window = 642 WmWindow* window_label_selector_window =
593 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); 643 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get());
594 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = 644 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings =
595 ScopedOverviewAnimationSettingsFactory::Get() 645 ScopedOverviewAnimationSettingsFactory::Get()
596 ->CreateOverviewAnimationSettings(animation_type, 646 ->CreateOverviewAnimationSettings(animation_type,
597 window_label_window); 647 window_label_window);
598 std::unique_ptr<ScopedOverviewAnimationSettings> 648 std::unique_ptr<ScopedOverviewAnimationSettings>
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 } 687 }
638 688
639 void WindowSelectorItem::AnimateOpacity(float opacity, 689 void WindowSelectorItem::AnimateOpacity(float opacity,
640 OverviewAnimationType animation_type) { 690 OverviewAnimationType animation_type) {
641 DCHECK_GE(opacity, 0.f); 691 DCHECK_GE(opacity, 0.f);
642 DCHECK_LE(opacity, 1.f); 692 DCHECK_LE(opacity, 1.f);
643 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; 693 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings;
644 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); 694 transform_window_.BeginScopedAnimation(animation_type, &animation_settings);
645 transform_window_.SetOpacity(opacity); 695 transform_window_.SetOpacity(opacity);
646 696
697 const float header_opacity = selected_ ? 0.f : kHeaderOpacity * opacity;
647 WmWindow* window_label_window = 698 WmWindow* window_label_window =
648 WmLookup::Get()->GetWindowForWidget(window_label_.get()); 699 WmLookup::Get()->GetWindowForWidget(window_label_.get());
649 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label = 700 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label =
650 ScopedOverviewAnimationSettingsFactory::Get() 701 ScopedOverviewAnimationSettingsFactory::Get()
651 ->CreateOverviewAnimationSettings(animation_type, 702 ->CreateOverviewAnimationSettings(animation_type,
652 window_label_window); 703 window_label_window);
653 window_label_window->SetOpacity(opacity); 704 window_label_window->SetOpacity(header_opacity);
654 705
655 WmWindow* window_label_selector_window = 706 WmWindow* window_label_selector_window =
656 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); 707 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get());
657 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector = 708 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector =
658 ScopedOverviewAnimationSettingsFactory::Get() 709 ScopedOverviewAnimationSettingsFactory::Get()
659 ->CreateOverviewAnimationSettings(animation_type, 710 ->CreateOverviewAnimationSettings(animation_type,
660 window_label_selector_window); 711 window_label_selector_window);
661 window_label_selector_window->SetOpacity(opacity); 712 window_label_selector_window->SetOpacity(header_opacity);
662 } 713 }
663 714
664 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { 715 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() {
665 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( 716 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16(
666 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, 717 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME,
667 GetWindow()->GetTitle())); 718 GetWindow()->GetTitle()));
668 } 719 }
669 720
721 void WindowSelectorItem::FadeOut(std::unique_ptr<views::Widget> widget) {
722 widget->SetOpacity(1.f);
723
724 // Fade out the widget. This animation continues past the lifetime of |this|.
725 WmWindow* widget_window = WmLookup::Get()->GetWindowForWidget(widget.get());
726 ui::ScopedLayerAnimationSettings animation_settings(
727 widget_window->GetLayer()->GetAnimator());
728 animation_settings.SetTransitionDuration(
729 base::TimeDelta::FromMilliseconds(kTransitionMilliseconds));
730 animation_settings.SetTweenType(gfx::Tween::EASE_OUT);
731 animation_settings.SetPreemptionStrategy(
732 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
733 // CleanupAnimationObserver will delete itself (and the widget) when the
734 // opacity animation is complete.
735 // Ownership over the observer is passed to the window_selector_->delegate()
736 // which has longer lifetime so that animations can continue even after the
737 // overview mode is shut down.
738 views::Widget* widget_ptr = widget.get();
739 std::unique_ptr<CleanupAnimationObserver> observer(
740 new CleanupAnimationObserver(std::move(widget)));
741 animation_settings.AddObserver(observer.get());
742 window_selector_->delegate()->AddDelayedAnimationObserver(
743 std::move(observer));
744 widget_ptr->SetOpacity(0.f);
745 }
746
670 } // namespace ash 747 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698