Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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; | |
|
bruthig
2016/08/30 17:57:33
Should this have 'static' just like the rest of th
varkha
2016/09/02 11:22:51
Done.
| |
| 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 Loading... | |
| 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 24 matching lines...) Expand all Loading... | |
| 302 WindowSelectorItem::~WindowSelectorItem() { | 322 WindowSelectorItem::~WindowSelectorItem() { |
| 303 GetWindow()->RemoveObserver(this); | 323 GetWindow()->RemoveObserver(this); |
| 304 } | 324 } |
| 305 | 325 |
| 306 WmWindow* WindowSelectorItem::GetWindow() { | 326 WmWindow* WindowSelectorItem::GetWindow() { |
| 307 return transform_window_.window(); | 327 return transform_window_.window(); |
| 308 } | 328 } |
| 309 | 329 |
| 310 void WindowSelectorItem::RestoreWindow() { | 330 void WindowSelectorItem::RestoreWindow() { |
| 311 transform_window_.RestoreWindow(); | 331 transform_window_.RestoreWindow(); |
| 332 UpdateHeaderLayout( | |
| 333 OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS); | |
| 334 FadeOut(std::move(window_label_)); | |
| 335 if (window_label_selector_) | |
| 336 FadeOut(std::move(window_label_selector_)); | |
| 312 } | 337 } |
| 313 | 338 |
| 314 void WindowSelectorItem::ShowWindowOnExit() { | 339 void WindowSelectorItem::ShowWindowOnExit() { |
| 315 transform_window_.ShowWindowOnExit(); | 340 transform_window_.ShowWindowOnExit(); |
| 316 } | 341 } |
| 317 | 342 |
| 318 void WindowSelectorItem::PrepareForOverview() { | 343 void WindowSelectorItem::PrepareForOverview() { |
| 319 transform_window_.PrepareForOverview(); | 344 transform_window_.PrepareForOverview(); |
| 320 } | 345 } |
| 321 | 346 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 340 // SetItemBounds is called before UpdateHeaderLayout so the header can | 365 // SetItemBounds is called before UpdateHeaderLayout so the header can |
| 341 // properly use the updated windows bounds. | 366 // properly use the updated windows bounds. |
| 342 UpdateHeaderLayout(animation_type); | 367 UpdateHeaderLayout(animation_type); |
| 343 if (!ash::MaterialDesignController::IsOverviewMaterial()) | 368 if (!ash::MaterialDesignController::IsOverviewMaterial()) |
| 344 UpdateWindowLabel(target_bounds, animation_type); | 369 UpdateWindowLabel(target_bounds, animation_type); |
| 345 } | 370 } |
| 346 | 371 |
| 347 void WindowSelectorItem::SetSelected(bool selected) { | 372 void WindowSelectorItem::SetSelected(bool selected) { |
| 348 if (!ash::MaterialDesignController::IsOverviewMaterial()) | 373 if (!ash::MaterialDesignController::IsOverviewMaterial()) |
| 349 return; | 374 return; |
| 375 selected_ = selected; | |
| 350 WmWindow* window = | 376 WmWindow* window = |
| 351 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); | 377 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| 352 ui::ScopedLayerAnimationSettings animation_settings( | 378 ui::ScopedLayerAnimationSettings animation_settings( |
| 353 window->GetLayer()->GetAnimator()); | 379 window->GetLayer()->GetAnimator()); |
| 354 animation_settings.SetTransitionDuration( | 380 animation_settings.SetTransitionDuration( |
| 355 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); | 381 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); |
| 356 animation_settings.SetTweenType(selected ? gfx::Tween::FAST_OUT_LINEAR_IN | 382 animation_settings.SetTweenType(selected ? gfx::Tween::FAST_OUT_LINEAR_IN |
| 357 : gfx::Tween::LINEAR_OUT_SLOW_IN); | 383 : gfx::Tween::LINEAR_OUT_SLOW_IN); |
| 358 animation_settings.SetPreemptionStrategy( | 384 animation_settings.SetPreemptionStrategy( |
| 359 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 385 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| 360 window->SetOpacity(selected ? 0.0f : 1.0f); | 386 window->SetOpacity(selected ? 0.0f : kHeaderOpacity); |
| 361 | 387 |
| 362 ui::ScopedLayerAnimationSettings animation_settings_shadow( | 388 ui::ScopedLayerAnimationSettings animation_settings_shadow( |
| 363 shadow_->shadow_layer()->GetAnimator()); | 389 shadow_->shadow_layer()->GetAnimator()); |
| 364 animation_settings_shadow.SetTransitionDuration( | 390 animation_settings_shadow.SetTransitionDuration( |
| 365 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); | 391 base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds)); |
| 366 animation_settings_shadow.SetTweenType(selected | 392 animation_settings_shadow.SetTweenType(selected |
| 367 ? gfx::Tween::FAST_OUT_LINEAR_IN | 393 ? gfx::Tween::FAST_OUT_LINEAR_IN |
| 368 : gfx::Tween::LINEAR_OUT_SLOW_IN); | 394 : gfx::Tween::LINEAR_OUT_SLOW_IN); |
| 369 animation_settings_shadow.SetPreemptionStrategy( | 395 animation_settings_shadow.SetPreemptionStrategy( |
| 370 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 396 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 471 screen_rect, target_bounds, top_view_inset, title_height); | 497 screen_rect, target_bounds, top_view_inset, title_height); |
| 472 gfx::Transform transform = ScopedTransformOverviewWindow::GetTransformForRect( | 498 gfx::Transform transform = ScopedTransformOverviewWindow::GetTransformForRect( |
| 473 screen_rect, selector_item_bounds); | 499 screen_rect, selector_item_bounds); |
| 474 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; | 500 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
| 475 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); | 501 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
| 476 // Rounded corners are achieved by using a mask layer on the original window | 502 // Rounded corners are achieved by using a mask layer on the original window |
| 477 // before the transform. Dividing by scale factor obtains the corner radius | 503 // before the transform. Dividing by scale factor obtains the corner radius |
| 478 // which when scaled will yield |kLabelBackgroundRadius|. | 504 // which when scaled will yield |kLabelBackgroundRadius|. |
| 479 transform_window_.SetTransform( | 505 transform_window_.SetTransform( |
| 480 root_window_, transform, use_mask_, use_shape_, | 506 root_window_, transform, use_mask_, use_shape_, |
| 481 (kLabelBackgroundRadius / GetItemScale(target_bounds.size()))); | 507 (kLabelBackgroundRadius / GetItemScale(target_bounds.size())), |
| 508 animation_type != OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | |
| 482 transform_window_.set_overview_transform(transform); | 509 transform_window_.set_overview_transform(transform); |
| 483 } | 510 } |
| 484 | 511 |
| 485 void WindowSelectorItem::SetOpacity(float opacity) { | 512 void WindowSelectorItem::SetOpacity(float opacity) { |
| 486 window_label_->SetOpacity(opacity); | 513 window_label_->SetOpacity(opacity); |
| 514 if (window_label_selector_) { | |
| 515 window_label_selector_->SetOpacity(selected_ ? 0.f | |
| 516 : kHeaderOpacity * opacity); | |
| 517 } | |
| 518 | |
| 487 if (!ash::MaterialDesignController::IsOverviewMaterial()) | 519 if (!ash::MaterialDesignController::IsOverviewMaterial()) |
| 488 close_button_widget_->SetOpacity(opacity); | 520 close_button_widget_->SetOpacity(opacity); |
| 489 | 521 |
| 490 transform_window_.SetOpacity(opacity); | 522 transform_window_.SetOpacity(opacity); |
| 491 } | 523 } |
| 492 | 524 |
| 493 void WindowSelectorItem::UpdateWindowLabel( | 525 void WindowSelectorItem::UpdateWindowLabel( |
| 494 const gfx::Rect& window_bounds, | 526 const gfx::Rect& window_bounds, |
| 495 OverviewAnimationType animation_type) { | 527 OverviewAnimationType animation_type) { |
| 496 if (!window_label_->IsVisible()) { | 528 if (!window_label_->IsVisible()) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 507 animation_type, | 539 animation_type, |
| 508 WmLookup::Get()->GetWindowForWidget(window_label_.get())); | 540 WmLookup::Get()->GetWindowForWidget(window_label_.get())); |
| 509 | 541 |
| 510 WmWindow* window_label_window = | 542 WmWindow* window_label_window = |
| 511 WmLookup::Get()->GetWindowForWidget(window_label_.get()); | 543 WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| 512 window_label_window->SetBounds(label_bounds); | 544 window_label_window->SetBounds(label_bounds); |
| 513 } | 545 } |
| 514 | 546 |
| 515 void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { | 547 void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { |
| 516 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); | 548 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); |
| 517 window_label_.reset(new views::Widget); | |
| 518 views::Widget::InitParams params; | 549 views::Widget::InitParams params; |
| 519 params.type = views::Widget::InitParams::TYPE_POPUP; | 550 params.type = views::Widget::InitParams::TYPE_POPUP; |
| 520 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 551 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 521 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 552 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| 522 params.visible_on_all_workspaces = true; | 553 params.visible_on_all_workspaces = true; |
| 523 params.name = "OverviewModeLabel"; | 554 params.name = "OverviewModeLabel"; |
| 524 window_label_->set_focus_on_creation(false); | |
| 525 root_window_->GetRootWindowController() | 555 root_window_->GetRootWindowController() |
| 526 ->ConfigureWidgetInitParamsForContainer( | 556 ->ConfigureWidgetInitParamsForContainer( |
| 527 window_label_.get(), kShellWindowId_StatusContainer, ¶ms); | 557 window_label_.get(), kShellWindowId_StatusContainer, ¶ms); |
| 558 | |
| 559 if (material) { | |
| 560 views::View* background_view = | |
| 561 new RoundedContainerView(kLabelBackgroundRadius, kLabelBackgroundColor); | |
| 562 window_label_selector_.reset(new views::Widget); | |
| 563 params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO; | |
|
bruthig
2016/08/30 17:57:33
I feel like re-using |params| like this creates mo
varkha
2016/09/02 11:22:51
I've managed to kill the second widget with some r
| |
| 564 params.accept_events = false; | |
| 565 window_label_selector_->Init(params); | |
| 566 window_label_selector_->set_focus_on_creation(false); | |
| 567 window_label_selector_->SetContentsView(background_view); | |
| 568 window_label_selector_->Show(); | |
| 569 } | |
| 570 | |
| 571 params.activatable = | |
| 572 views::Widget::InitParams::Activatable::ACTIVATABLE_DEFAULT; | |
| 573 params.accept_events = true; | |
| 574 params.name = "OverviewModeLabelSelector"; | |
| 575 window_label_.reset(new views::Widget); | |
| 576 window_label_->set_focus_on_creation(false); | |
| 528 window_label_->Init(params); | 577 window_label_->Init(params); |
| 529 window_label_button_view_ = new OverviewLabelButton(this, title); | 578 window_label_button_view_ = new OverviewLabelButton(this, title); |
| 530 window_label_button_view_->SetBorder(views::Border::NullBorder()); | 579 window_label_button_view_->SetBorder(views::Border::NullBorder()); |
| 531 window_label_button_view_->SetEnabledTextColors(kLabelColor); | 580 window_label_button_view_->SetEnabledTextColors(kLabelColor); |
| 532 window_label_button_view_->set_animate_on_state_change(false); | 581 window_label_button_view_->set_animate_on_state_change(false); |
| 533 if (material) { | 582 if (material) { |
| 534 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 583 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 535 } else { | 584 } else { |
| 536 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER); | 585 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| 537 window_label_button_view_->SetTextShadows(gfx::ShadowValues( | 586 window_label_button_view_->SetTextShadows(gfx::ShadowValues( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 549 new CaptionContainerView(window_label_button_view_, close_button_); | 598 new CaptionContainerView(window_label_button_view_, close_button_); |
| 550 window_label_->SetContentsView(caption_container_view_); | 599 window_label_->SetContentsView(caption_container_view_); |
| 551 window_label_button_view_->SetVisible(false); | 600 window_label_button_view_->SetVisible(false); |
| 552 window_label_->Show(); | 601 window_label_->Show(); |
| 553 | 602 |
| 554 shadow_.reset(new ::wm::Shadow()); | 603 shadow_.reset(new ::wm::Shadow()); |
| 555 shadow_->Init(::wm::Shadow::STYLE_INACTIVE); | 604 shadow_->Init(::wm::Shadow::STYLE_INACTIVE); |
| 556 shadow_->layer()->SetVisible(true); | 605 shadow_->layer()->SetVisible(true); |
| 557 window_label_->GetLayer()->Add(shadow_->layer()); | 606 window_label_->GetLayer()->Add(shadow_->layer()); |
| 558 window_label_->GetLayer()->SetMasksToBounds(false); | 607 window_label_->GetLayer()->SetMasksToBounds(false); |
| 559 | 608 UpdateHeaderLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
| 560 views::View* background_view = | |
| 561 new RoundedContainerView(kLabelBackgroundRadius, kLabelBackgroundColor); | |
| 562 window_label_selector_.reset(new views::Widget); | |
| 563 params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO; | |
| 564 params.accept_events = false; | |
| 565 params.name = "OverviewModeLabelSelector"; | |
| 566 window_label_selector_->Init(params); | |
| 567 window_label_selector_->set_focus_on_creation(false); | |
| 568 window_label_selector_->SetContentsView(background_view); | |
| 569 window_label_selector_->Show(); | |
| 570 } else { | 609 } else { |
| 571 // Indicate that the label will be drawn onto a transparent background | 610 // Indicate that the label will be drawn onto a transparent background |
| 572 // (disables subpixel antialiasing). | 611 // (disables subpixel antialiasing). |
| 573 window_label_button_view_->SetBackgroundColorHint(SK_ColorTRANSPARENT); | 612 window_label_button_view_->SetBackgroundColorHint(SK_ColorTRANSPARENT); |
| 574 window_label_->SetContentsView(window_label_button_view_); | 613 window_label_->SetContentsView(window_label_button_view_); |
| 575 } | 614 } |
| 615 first_time_ = false; | |
| 576 } | 616 } |
| 577 | 617 |
| 578 void WindowSelectorItem::UpdateHeaderLayout( | 618 void WindowSelectorItem::UpdateHeaderLayout( |
| 579 OverviewAnimationType animation_type) { | 619 OverviewAnimationType animation_type) { |
| 580 gfx::Rect transformed_window_bounds = root_window_->ConvertRectFromScreen( | 620 gfx::Rect transformed_window_bounds = root_window_->ConvertRectFromScreen( |
| 581 transform_window_.GetTransformedBounds(hide_header())); | 621 transform_window_.GetTransformedBounds(hide_header())); |
| 582 | 622 |
| 583 if (ash::MaterialDesignController::IsOverviewMaterial()) { | 623 if (ash::MaterialDesignController::IsOverviewMaterial()) { |
| 584 gfx::Rect label_rect(close_button_->GetPreferredSize()); | 624 gfx::Rect label_rect(close_button_->GetPreferredSize()); |
| 585 label_rect.set_y(-label_rect.height()); | 625 if (first_time_) { |
| 626 if (transform_window_.GetTopInset() == 0) { | |
| 627 label_rect.set_y(0); | |
| 628 label_rect.set_height(0); | |
| 629 } else { | |
| 630 label_rect.set_y(-transform_window_.GetTopInset()); | |
| 631 } | |
| 632 } else { | |
| 633 label_rect.set_y(-label_rect.height()); | |
| 634 } | |
| 586 label_rect.set_width(transformed_window_bounds.width()); | 635 label_rect.set_width(transformed_window_bounds.width()); |
| 587 | 636 |
| 588 if (!window_label_button_view_->visible()) { | 637 if (!window_label_button_view_->visible()) { |
| 589 window_label_button_view_->SetVisible(true); | 638 window_label_button_view_->SetVisible(true); |
| 590 SetupFadeInAfterLayout(window_label_.get()); | 639 SetupFadeInAfterLayout(window_label_.get()); |
| 591 SetupFadeInAfterLayout(window_label_selector_.get()); | 640 SetupFadeInAfterLayout(window_label_selector_.get()); |
| 641 SetupOpacityAfterLayout(window_label_selector_.get()); | |
| 592 } | 642 } |
| 593 WmWindow* window_label_window = | 643 WmWindow* window_label_window = |
| 594 WmLookup::Get()->GetWindowForWidget(window_label_.get()); | 644 WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| 595 WmWindow* window_label_selector_window = | 645 WmWindow* window_label_selector_window = |
| 596 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); | 646 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| 597 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = | 647 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = |
| 598 ScopedOverviewAnimationSettingsFactory::Get() | 648 ScopedOverviewAnimationSettingsFactory::Get() |
| 599 ->CreateOverviewAnimationSettings(animation_type, | 649 ->CreateOverviewAnimationSettings(animation_type, |
| 600 window_label_window); | 650 window_label_window); |
| 601 std::unique_ptr<ScopedOverviewAnimationSettings> | 651 std::unique_ptr<ScopedOverviewAnimationSettings> |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 640 } | 690 } |
| 641 | 691 |
| 642 void WindowSelectorItem::AnimateOpacity(float opacity, | 692 void WindowSelectorItem::AnimateOpacity(float opacity, |
| 643 OverviewAnimationType animation_type) { | 693 OverviewAnimationType animation_type) { |
| 644 DCHECK_GE(opacity, 0.f); | 694 DCHECK_GE(opacity, 0.f); |
| 645 DCHECK_LE(opacity, 1.f); | 695 DCHECK_LE(opacity, 1.f); |
| 646 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; | 696 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
| 647 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); | 697 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
| 648 transform_window_.SetOpacity(opacity); | 698 transform_window_.SetOpacity(opacity); |
| 649 | 699 |
| 700 const float header_opacity = selected_ ? 0.f : kHeaderOpacity * opacity; | |
| 650 WmWindow* window_label_window = | 701 WmWindow* window_label_window = |
| 651 WmLookup::Get()->GetWindowForWidget(window_label_.get()); | 702 WmLookup::Get()->GetWindowForWidget(window_label_.get()); |
| 652 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label = | 703 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label = |
| 653 ScopedOverviewAnimationSettingsFactory::Get() | 704 ScopedOverviewAnimationSettingsFactory::Get() |
| 654 ->CreateOverviewAnimationSettings(animation_type, | 705 ->CreateOverviewAnimationSettings(animation_type, |
| 655 window_label_window); | 706 window_label_window); |
| 656 window_label_window->SetOpacity(opacity); | 707 window_label_window->SetOpacity(header_opacity); |
| 657 | 708 |
| 658 WmWindow* window_label_selector_window = | 709 WmWindow* window_label_selector_window = |
| 659 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); | 710 WmLookup::Get()->GetWindowForWidget(window_label_selector_.get()); |
| 660 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector = | 711 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector = |
| 661 ScopedOverviewAnimationSettingsFactory::Get() | 712 ScopedOverviewAnimationSettingsFactory::Get() |
| 662 ->CreateOverviewAnimationSettings(animation_type, | 713 ->CreateOverviewAnimationSettings(animation_type, |
| 663 window_label_selector_window); | 714 window_label_selector_window); |
| 664 window_label_selector_window->SetOpacity(opacity); | 715 window_label_selector_window->SetOpacity(header_opacity); |
| 665 } | 716 } |
| 666 | 717 |
| 667 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { | 718 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
| 668 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( | 719 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( |
| 669 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, | 720 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, |
| 670 GetWindow()->GetTitle())); | 721 GetWindow()->GetTitle())); |
| 671 } | 722 } |
| 672 | 723 |
| 724 void WindowSelectorItem::FadeOut(std::unique_ptr<views::Widget> widget) { | |
| 725 widget->SetOpacity(1.f); | |
| 726 | |
| 727 // Fade out the widget. This animation continues past the lifetime of |this|. | |
| 728 WmWindow* widget_window = WmLookup::Get()->GetWindowForWidget(widget.get()); | |
| 729 ui::ScopedLayerAnimationSettings animation_settings( | |
|
bruthig
2016/08/30 17:57:33
For consistency, would it make more sense to add a
varkha
2016/09/02 11:22:51
Yes, will do.
| |
| 730 widget_window->GetLayer()->GetAnimator()); | |
| 731 animation_settings.SetTransitionDuration( | |
| 732 base::TimeDelta::FromMilliseconds(kTransitionMilliseconds)); | |
| 733 animation_settings.SetTweenType(gfx::Tween::EASE_OUT); | |
| 734 animation_settings.SetPreemptionStrategy( | |
| 735 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | |
| 736 // CleanupAnimationObserver will delete itself (and the widget) when the | |
| 737 // opacity animation is complete. | |
| 738 // Ownership over the observer is passed to the window_selector_->delegate() | |
| 739 // which has longer lifetime so that animations can continue even after the | |
| 740 // overview mode is shut down. | |
| 741 views::Widget* widget_ptr = widget.get(); | |
| 742 std::unique_ptr<CleanupAnimationObserver> observer( | |
| 743 new CleanupAnimationObserver(std::move(widget))); | |
| 744 animation_settings.AddObserver(observer.get()); | |
| 745 window_selector_->delegate()->AddDelayedAnimationObserver( | |
| 746 std::move(observer)); | |
| 747 widget_ptr->SetOpacity(0.f); | |
| 748 } | |
| 749 | |
| 673 } // namespace ash | 750 } // namespace ash |
| OLD | NEW |