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

Side by Side Diff: ash/common/wm/overview/window_grid.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 (more tests) Created 4 years, 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_grid.h" 5 #include "ash/common/wm/overview/window_grid.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 } 403 }
404 404
405 if (!ash::MaterialDesignController::IsOverviewMaterial() && 405 if (!ash::MaterialDesignController::IsOverviewMaterial() &&
406 base::CommandLine::ForCurrentProcess()->HasSwitch( 406 base::CommandLine::ForCurrentProcess()->HasSwitch(
407 switches::kAshEnableStableOverviewOrder)) { 407 switches::kAshEnableStableOverviewOrder)) {
408 // Reorder windows to try to minimize movement to target overview positions. 408 // Reorder windows to try to minimize movement to target overview positions.
409 // This also creates a stable window ordering. 409 // This also creates a stable window ordering.
410 ReorderItemsGreedyLeastMovement(&windows_in_root, root_window_, 410 ReorderItemsGreedyLeastMovement(&windows_in_root, root_window_,
411 window_selector_->text_filter_bottom()); 411 window_selector_->text_filter_bottom());
412 } 412 }
413 PrepareForUsingMasksOrShapes(windows_in_root.size());
413 for (auto* window : windows_in_root) { 414 for (auto* window : windows_in_root) {
414 window_observer_.Add(window); 415 window_observer_.Add(window);
415 window_list_.push_back(new WindowSelectorItem(window, window_selector_)); 416 window_list_.push_back(new WindowSelectorItem(window, window_selector_));
416 } 417 }
417 } 418 }
418 419
419 WindowGrid::~WindowGrid() {} 420 WindowGrid::~WindowGrid() {}
420 421
421 void WindowGrid::Shutdown() { 422 void WindowGrid::Shutdown() {
422 if (shield_widget_) { 423 if (shield_widget_) {
423 // Fade out the shield widget. This animation continues past the lifetime 424 // Fade out the shield widget. This animation continues past the lifetime
424 // of |this|. 425 // of |this|.
425 WmWindow* widget_window = 426 WmWindow* widget_window =
426 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); 427 WmLookup::Get()->GetWindowForWidget(shield_widget_.get());
427 ui::ScopedLayerAnimationSettings animation_settings( 428 ui::ScopedLayerAnimationSettings animation_settings(
428 widget_window->GetLayer()->GetAnimator()); 429 widget_window->GetLayer()->GetAnimator());
429 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 430 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
430 kOverviewSelectorTransitionMilliseconds)); 431 kOverviewSelectorTransitionMilliseconds));
431 animation_settings.SetTweenType(gfx::Tween::EASE_IN); 432 animation_settings.SetTweenType(gfx::Tween::EASE_IN_2);
432 animation_settings.SetPreemptionStrategy( 433 animation_settings.SetPreemptionStrategy(
433 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 434 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
434 // CleanupAnimationObserver will delete itself (and the shield widget) when 435 // CleanupAnimationObserver will delete itself (and the shield widget) when
435 // the opacity animation is complete. 436 // the opacity animation is complete.
436 // Ownership over the observer is passed to the window_selector_->delegate() 437 // Ownership over the observer is passed to the window_selector_->delegate()
437 // which has longer lifetime so that animations can continue even after the 438 // which has longer lifetime so that animations can continue even after the
438 // overview mode is shut down. 439 // overview mode is shut down.
439 views::Widget* shield_widget = shield_widget_.get(); 440 views::Widget* shield_widget = shield_widget_.get();
440 std::unique_ptr<CleanupAnimationObserver> observer( 441 std::unique_ptr<CleanupAnimationObserver> observer(
441 new CleanupAnimationObserver(std::move(shield_widget_))); 442 new CleanupAnimationObserver(std::move(shield_widget_)));
442 animation_settings.AddObserver(observer.get()); 443 animation_settings.AddObserver(observer.get());
443 window_selector_->delegate()->AddDelayedAnimationObserver( 444 window_selector_->delegate()->AddDelayedAnimationObserver(
444 std::move(observer)); 445 std::move(observer));
445 shield_widget->SetOpacity(0.f); 446 shield_widget->SetOpacity(0.f);
446 } 447 }
447 } 448 }
448 449
449 void WindowGrid::PrepareForOverview() { 450 void WindowGrid::PrepareForOverview() {
450 if (ash::MaterialDesignController::IsOverviewMaterial()) 451 if (ash::MaterialDesignController::IsOverviewMaterial())
451 InitShieldWidget(); 452 InitShieldWidget();
452 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter) 453 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter)
453 (*iter)->PrepareForOverview(); 454 (*iter)->PrepareForOverview();
454 prepared_for_overview_ = true; 455 prepared_for_overview_ = true;
455 } 456 }
456 457
457 void WindowGrid::PositionWindowsMD(bool animate) { 458 void WindowGrid::PositionWindowsMD(bool animate) {
458 if (window_list_.empty()) 459 if (window_list_.empty())
459 return; 460 return;
460 461 PrepareForUsingMasksOrShapes(window_list_.size());
461 const int kUnlimited = -1;
462 const size_t windows_count = window_list_.size();
463 const base::CommandLine* command_line =
464 base::CommandLine::ForCurrentProcess();
465 int windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks;
466 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseMaskInOverview) &&
467 (!base::StringToInt(command_line->GetSwitchValueASCII(
468 switches::kAshMaxWindowsToUseMaskInOverview),
469 &windows_to_use_masks) ||
470 windows_to_use_masks <= kUnlimited)) {
471 windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks;
472 }
473 int windows_to_use_shapes = kUnlimited;
474 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseShapeInOverview) &&
475 (!base::StringToInt(command_line->GetSwitchValueASCII(
476 switches::kAshMaxWindowsToUseShapeInOverview),
477 &windows_to_use_shapes) ||
478 windows_to_use_shapes <= kUnlimited)) {
479 windows_to_use_shapes = kUnlimited;
480 }
481 WindowSelectorItem::set_use_mask(windows_to_use_masks <= kUnlimited ||
482 static_cast<int>(windows_count) <=
483 windows_to_use_masks);
484 WindowSelectorItem::set_use_shape(windows_to_use_shapes <= kUnlimited ||
485 static_cast<int>(windows_count) <=
486 windows_to_use_shapes);
487
488 gfx::Rect total_bounds = 462 gfx::Rect total_bounds =
489 root_window_->ConvertRectToScreen(wm::GetDisplayWorkAreaBoundsInParent( 463 root_window_->ConvertRectToScreen(wm::GetDisplayWorkAreaBoundsInParent(
490 root_window_->GetChildByShellWindowId( 464 root_window_->GetChildByShellWindowId(
491 kShellWindowId_DefaultContainer))); 465 kShellWindowId_DefaultContainer)));
492 // Windows occupy vertically centered area with additional vertical insets. 466 // Windows occupy vertically centered area with additional vertical insets.
493 int horizontal_inset = 467 int horizontal_inset =
494 gfx::ToFlooredInt(std::min(kOverviewInsetRatio * total_bounds.width(), 468 gfx::ToFlooredInt(std::min(kOverviewInsetRatio * total_bounds.width(),
495 kOverviewInsetRatio * total_bounds.height())); 469 kOverviewInsetRatio * total_bounds.height()));
496 int vertical_inset = 470 int vertical_inset =
497 horizontal_inset + 471 horizontal_inset +
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 // |right_bound| was reverted. Perform one last pass to position the |rects|. 560 // |right_bound| was reverted. Perform one last pass to position the |rects|.
587 if (make_last_adjustment) { 561 if (make_last_adjustment) {
588 gfx::Rect overview_bounds(total_bounds); 562 gfx::Rect overview_bounds(total_bounds);
589 overview_bounds.set_width(right_bound - total_bounds.x()); 563 overview_bounds.set_width(right_bound - total_bounds.x());
590 FitWindowRectsInBounds(overview_bounds, 564 FitWindowRectsInBounds(overview_bounds,
591 std::min(kMaxHeight + 2 * kWindowMarginMD, height), 565 std::min(kMaxHeight + 2 * kWindowMarginMD, height),
592 &rects, &max_bottom, &min_right, &max_right); 566 &rects, &max_bottom, &min_right, &max_right);
593 } 567 }
594 // Position the windows centering the left-aligned rows vertically. 568 // Position the windows centering the left-aligned rows vertically.
595 gfx::Vector2d offset(0, (total_bounds.bottom() - max_bottom) / 2); 569 gfx::Vector2d offset(0, (total_bounds.bottom() - max_bottom) / 2);
596 for (size_t i = 0; i < windows_count; ++i) { 570 for (size_t i = 0; i < window_list_.size(); ++i) {
597 window_list_[i]->SetBounds( 571 window_list_[i]->SetBounds(
598 rects[i] + offset, 572 rects[i] + offset,
599 animate 573 animate
600 ? OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS 574 ? OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS
601 : OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 575 : OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
602 } 576 }
603 577
604 // If the selection widget is active, reposition it without any animation. 578 // If the selection widget is active, reposition it without any animation.
605 if (selection_widget_) 579 if (selection_widget_)
606 MoveSelectionWidgetToTarget(animate); 580 MoveSelectionWidgetToTarget(animate);
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 WmWindow* widget_window = 829 WmWindow* widget_window =
856 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); 830 WmLookup::Get()->GetWindowForWidget(shield_widget_.get());
857 const gfx::Rect bounds = widget_window->GetParent()->GetBounds(); 831 const gfx::Rect bounds = widget_window->GetParent()->GetBounds();
858 widget_window->SetBounds(bounds); 832 widget_window->SetBounds(bounds);
859 widget_window->SetName("OverviewModeShield"); 833 widget_window->SetName("OverviewModeShield");
860 834
861 ui::ScopedLayerAnimationSettings animation_settings( 835 ui::ScopedLayerAnimationSettings animation_settings(
862 widget_window->GetLayer()->GetAnimator()); 836 widget_window->GetLayer()->GetAnimator());
863 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 837 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
864 kOverviewSelectorTransitionMilliseconds)); 838 kOverviewSelectorTransitionMilliseconds));
865 animation_settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); 839 animation_settings.SetTweenType(gfx::Tween::EASE_IN);
866 animation_settings.SetPreemptionStrategy( 840 animation_settings.SetPreemptionStrategy(
867 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 841 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
868 shield_widget_->SetOpacity(kShieldOpacity); 842 shield_widget_->SetOpacity(kShieldOpacity);
869 } 843 }
870 844
871 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) { 845 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) {
872 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); 846 const bool material = ash::MaterialDesignController::IsOverviewMaterial();
873 const int border_thickness = material ? kWindowSelectionBorderThicknessMD 847 const int border_thickness = material ? kWindowSelectionBorderThicknessMD
874 : kWindowSelectionBorderThickness; 848 : kWindowSelectionBorderThickness;
875 const int border_color = 849 const int border_color =
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 if (*min_right > left) 1029 if (*min_right > left)
1056 *min_right = left; 1030 *min_right = left;
1057 if (*max_right < left) 1031 if (*max_right < left)
1058 *max_right = left; 1032 *max_right = left;
1059 } 1033 }
1060 *max_bottom = top + height; 1034 *max_bottom = top + height;
1061 } 1035 }
1062 return windows_fit; 1036 return windows_fit;
1063 } 1037 }
1064 1038
1039 void WindowGrid::PrepareForUsingMasksOrShapes(size_t windows_count) const {
1040 const int kUnlimited = -1;
1041 const base::CommandLine* command_line =
1042 base::CommandLine::ForCurrentProcess();
1043 int windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks;
1044 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseMaskInOverview) &&
1045 (!base::StringToInt(command_line->GetSwitchValueASCII(
1046 switches::kAshMaxWindowsToUseMaskInOverview),
1047 &windows_to_use_masks) ||
1048 windows_to_use_masks <= kUnlimited)) {
1049 windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks;
1050 }
1051 int windows_to_use_shapes = kUnlimited;
1052 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseShapeInOverview) &&
1053 (!base::StringToInt(command_line->GetSwitchValueASCII(
1054 switches::kAshMaxWindowsToUseShapeInOverview),
1055 &windows_to_use_shapes) ||
1056 windows_to_use_shapes <= kUnlimited)) {
1057 windows_to_use_shapes = kUnlimited;
1058 }
1059 WindowSelectorItem::set_use_mask(windows_to_use_masks <= kUnlimited ||
1060 static_cast<int>(windows_count) <=
1061 windows_to_use_masks);
1062 WindowSelectorItem::set_use_shape(windows_to_use_shapes <= kUnlimited ||
1063 static_cast<int>(windows_count) <=
1064 windows_to_use_shapes);
1065 }
1066
1065 } // namespace ash 1067 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698