athena: Change the scrolling behaviour of the windows in overview mode.

Change the transforms of the windows in overview mode to better match the mocks.
Notable change in the code is that instead of computing the terminal transforms
at the start, and then computing the intermediate transforms from those, we
compute less amount of information at start, and compute the transform at each
state from those. This makes it easier to perform non-linear transforms during
the scrolls.

BUG=403849
R=oshima@chromium.org

Review URL: https://codereview.chromium.org/556043002

Cr-Commit-Position: refs/heads/master@{#294108}
parent 05a2bf0b
...@@ -33,16 +33,21 @@ ...@@ -33,16 +33,21 @@
namespace { namespace {
struct WindowOverviewState { const float kOverviewDefaultScale = 0.75f;
// The transform for when the window is at the topmost position.
gfx::Transform top;
// The transform for when the window is at the bottom-most position.
gfx::Transform bottom;
struct WindowOverviewState {
// The current overview state of the window. 0.f means the window is at the // The current overview state of the window. 0.f means the window is at the
// topmost position. 1.f means the window is at the bottom-most position. // topmost position. 1.f means the window is at the bottom-most position.
float progress; float progress;
// The top-most and bottom-most vertical position of the window in overview
// mode.
float max_y;
float min_y;
// |split| is set if this window is one of the two split windows in split-view
// mode.
bool split;
}; };
} // namespace } // namespace
...@@ -55,18 +60,51 @@ namespace athena { ...@@ -55,18 +60,51 @@ namespace athena {
namespace { namespace {
gfx::Transform GetTransformForSplitWindow(aura::Window* window, float scale) {
const float kScrollWindowPositionInOverview = 0.65f;
int x_translate = window->bounds().width() * (1 - scale) / 2;
gfx::Transform transform;
transform.Translate(
x_translate, window->bounds().height() * kScrollWindowPositionInOverview);
transform.Scale(scale, scale);
return transform;
}
// Gets the transform for the window in its current state. // Gets the transform for the window in its current state.
gfx::Transform GetTransformForState(WindowOverviewState* state) { gfx::Transform GetTransformForState(aura::Window* window,
return gfx::Tween::TransformValueBetween(state->progress, WindowOverviewState* state) {
state->top, if (state->split)
state->bottom); return GetTransformForSplitWindow(window, kOverviewDefaultScale);
const float kProgressToStartShrinking = 0.07;
const float kOverviewScale = 0.75f;
float scale = kOverviewScale;
if (state->progress < kProgressToStartShrinking) {
const float kShrunkMinimumScale = 0.7f;
scale = gfx::Tween::FloatValueBetween(
state->progress / kProgressToStartShrinking,
kShrunkMinimumScale,
kOverviewScale);
}
int container_width = window->parent()->bounds().width();
int window_width = window->bounds().width();
int window_x = window->bounds().x();
float x_translate = (container_width - (window_width * scale)) / 2 - window_x;
float y_translate = gfx::Tween::FloatValueBetween(
state->progress, state->min_y, state->max_y);
gfx::Transform transform;
transform.Translate(x_translate, y_translate);
transform.Scale(scale, scale);
return transform;
} }
// Sets the progress-state for the window in the overview mode. // Sets the progress-state for the window in the overview mode.
void SetWindowProgress(aura::Window* window, float progress) { void SetWindowProgress(aura::Window* window, float progress) {
WindowOverviewState* state = window->GetProperty(kWindowOverviewState); WindowOverviewState* state = window->GetProperty(kWindowOverviewState);
state->progress = progress; state->progress = progress;
window->SetTransform(GetTransformForState(state));
gfx::Transform transform = GetTransformForState(window, state);
window->SetTransform(transform);
} }
void HideWindowIfNotVisible(aura::Window* window, void HideWindowIfNotVisible(aura::Window* window,
...@@ -113,14 +151,6 @@ gfx::RectF GetTransformedBounds(aura::Window* window) { ...@@ -113,14 +151,6 @@ gfx::RectF GetTransformedBounds(aura::Window* window) {
return bounds; return bounds;
} }
gfx::Transform GetTransformForSplitWindow(aura::Window* window, float scale) {
int x_translate = window->bounds().width() * (1 - scale) / 2;
gfx::Transform transform;
transform.Translate(x_translate, window->bounds().height() * 0.65);
transform.Scale(scale, scale);
return transform;
}
void TransformSplitWindowScale(aura::Window* window, float scale) { void TransformSplitWindowScale(aura::Window* window, float scale) {
gfx::Transform transform = window->layer()->GetTargetTransform(); gfx::Transform transform = window->layer()->GetTargetTransform();
if (transform.Scale2d() == gfx::Vector2dF(scale, scale)) if (transform.Scale2d() == gfx::Vector2dF(scale, scale))
...@@ -209,11 +239,14 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -209,11 +239,14 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
(window == split_view_controller_->left_window() || (window == split_view_controller_->left_window() ||
window == split_view_controller_->right_window())) { window == split_view_controller_->right_window())) {
// Do not let the left/right windows be scrolled. // Do not let the left/right windows be scrolled.
state->top = GetTransformForSplitWindow(window, kMaxScale); gfx::Transform transform =
state->bottom = state->top; GetTransformForSplitWindow(window, kOverviewDefaultScale);
state->max_y = state->min_y = transform.To2dTranslation().y();
state->split = true;
--index; --index;
continue; continue;
} }
state->split = false;
UpdateTerminalStateForWindowAtIndex(window, index, windows.size()); UpdateTerminalStateForWindowAtIndex(window, index, windows.size());
} }
} }
...@@ -228,26 +261,15 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -228,26 +261,15 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
const int kGapBetweenWindowsBottom = 10; const int kGapBetweenWindowsBottom = 10;
const int kGapBetweenWindowsTop = 5; const int kGapBetweenWindowsTop = 5;
const int container_width = container_->bounds().width();
const int window_width = window->bounds().width();
const int window_x = window->bounds().x();
gfx::Transform top_transform;
int top = (window_count - index - 1) * kGapBetweenWindowsTop; int top = (window_count - index - 1) * kGapBetweenWindowsTop;
float x_translate =
(container_width - (window_width * kMinScale)) / 2 - window_x;
top_transform.Translate(x_translate, top);
top_transform.Scale(kMinScale, kMinScale);
gfx::Transform bottom_transform;
int bottom = GetScrollableHeight() - (index * kGapBetweenWindowsBottom); int bottom = GetScrollableHeight() - (index * kGapBetweenWindowsBottom);
x_translate = (container_width - (window_width * kMaxScale)) / 2 - window_x;
bottom_transform.Translate(x_translate, bottom - window->bounds().y());
bottom_transform.Scale(kMaxScale, kMaxScale);
WindowOverviewState* state = window->GetProperty(kWindowOverviewState); WindowOverviewState* state = window->GetProperty(kWindowOverviewState);
CHECK(state); CHECK(state);
state->top = top_transform; if (state->split)
state->bottom = bottom_transform; return;
state->min_y = top;
state->max_y = bottom - window->bounds().y();
state->progress = 0.f; state->progress = 0.f;
} }
...@@ -350,7 +372,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -350,7 +372,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
} }
int GetScrollableHeight() const { int GetScrollableHeight() const {
const float kScrollableFraction = 0.65f; const float kScrollableFraction = 0.85f;
const float kScrollableFractionInSplit = 0.5f; const float kScrollableFractionInSplit = 0.5f;
const float fraction = split_view_controller_->IsSplitViewModeActive() const float fraction = split_view_controller_->IsSplitViewModeActive()
? kScrollableFractionInSplit ? kScrollableFractionInSplit
...@@ -400,7 +422,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -400,7 +422,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
WindowOverviewState* dragged_state = WindowOverviewState* dragged_state =
dragged_window_->GetProperty(kWindowOverviewState); dragged_window_->GetProperty(kWindowOverviewState);
CHECK(dragged_state); CHECK(dragged_state);
gfx::Transform transform = GetTransformForState(dragged_state); gfx::Transform transform =
GetTransformForState(dragged_window_, dragged_state);
transform.Translate(-dragged_distance.x(), 0); transform.Translate(-dragged_distance.x(), 0);
dragged_window_->SetTransform(transform); dragged_window_->SetTransform(transform);
...@@ -452,12 +475,12 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -452,12 +475,12 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
} }
if (split_view_controller_->IsSplitViewModeActive()) { if (split_view_controller_->IsSplitViewModeActive()) {
float scale = kMaxScale; float scale = kOverviewDefaultScale;
if (split_drop == split_view_controller_->left_window()) if (split_drop == split_view_controller_->left_window())
scale = kMaxScaleForSplitTarget; scale = kMaxScaleForSplitTarget;
TransformSplitWindowScale(split_view_controller_->left_window(), scale); TransformSplitWindowScale(split_view_controller_->left_window(), scale);
scale = kMaxScale; scale = kOverviewDefaultScale;
if (split_drop == split_view_controller_->right_window()) if (split_drop == split_view_controller_->right_window())
scale = kMaxScaleForSplitTarget; scale = kMaxScaleForSplitTarget;
TransformSplitWindowScale(split_view_controller_->right_window(), scale); TransformSplitWindowScale(split_view_controller_->right_window(), scale);
...@@ -496,9 +519,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -496,9 +519,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
transform_x = container_->bounds().right() - transformed_bounds.x(); transform_x = container_->bounds().right() - transformed_bounds.x();
else else
transform_x = -(transformed_bounds.x() + transformed_bounds.width()); transform_x = -(transformed_bounds.x() + transformed_bounds.width());
float scale = gfx::Tween::FloatValueBetween( transform.Translate(transform_x / kOverviewDefaultScale, 0);
dragged_state->progress, kMinScale, kMaxScale);
transform.Translate(transform_x / scale, 0);
dragged_window_->SetTransform(transform); dragged_window_->SetTransform(transform);
dragged_window_->layer()->SetOpacity(kMinOpacity); dragged_window_->layer()->SetOpacity(kMinOpacity);
} }
...@@ -559,7 +580,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -559,7 +580,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
dragged_window_->layer()->GetAnimator()); dragged_window_->layer()->GetAnimator());
settings.SetPreemptionStrategy( settings.SetPreemptionStrategy(
ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
dragged_window_->SetTransform(GetTransformForState(dragged_state)); dragged_window_->SetTransform(
GetTransformForState(dragged_window_, dragged_state));
dragged_window_->layer()->SetOpacity(1.f); dragged_window_->layer()->SetOpacity(1.f);
dragged_window_ = NULL; dragged_window_ = NULL;
} }
...@@ -704,8 +726,6 @@ class WindowOverviewModeImpl : public WindowOverviewMode, ...@@ -704,8 +726,6 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
} }
const int kMinDistanceForDismissal = 300; const int kMinDistanceForDismissal = 300;
const float kMinScale = 0.6f;
const float kMaxScale = 0.75f;
const float kMaxOpacity = 1.0f; const float kMaxOpacity = 1.0f;
const float kMinOpacity = 0.2f; const float kMinOpacity = 0.2f;
const float kMaxScaleForSplitTarget = 0.9f; const float kMaxScaleForSplitTarget = 0.9f;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment