Index: athena/wm/window_overview_mode.cc |
diff --git a/athena/wm/window_overview_mode.cc b/athena/wm/window_overview_mode.cc |
index 7b3c73e0fc77156a093cf49fe34945a4f3cc8441..fbab9979c7298634d691ee963f8abab9cb492c91 100644 |
--- a/athena/wm/window_overview_mode.cc |
+++ b/athena/wm/window_overview_mode.cc |
@@ -32,16 +32,21 @@ |
namespace { |
-struct WindowOverviewState { |
- // 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; |
+const float kOverviewDefaultScale = 0.75f; |
+struct WindowOverviewState { |
// 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. |
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 |
@@ -54,18 +59,51 @@ namespace athena { |
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. |
-gfx::Transform GetTransformForState(WindowOverviewState* state) { |
- return gfx::Tween::TransformValueBetween(state->progress, |
- state->top, |
- state->bottom); |
+gfx::Transform GetTransformForState(aura::Window* window, |
+ WindowOverviewState* state) { |
+ if (state->split) |
+ 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. |
void SetWindowProgress(aura::Window* window, float progress) { |
WindowOverviewState* state = window->GetProperty(kWindowOverviewState); |
state->progress = progress; |
- window->SetTransform(GetTransformForState(state)); |
+ |
+ gfx::Transform transform = GetTransformForState(window, state); |
+ window->SetTransform(transform); |
} |
void HideWindowIfNotVisible(aura::Window* window, |
@@ -112,14 +150,6 @@ gfx::RectF GetTransformedBounds(aura::Window* window) { |
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) { |
gfx::Transform transform = window->layer()->GetTargetTransform(); |
if (transform.Scale2d() == gfx::Vector2dF(scale, scale)) |
@@ -208,11 +238,14 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
(window == split_view_controller_->left_window() || |
window == split_view_controller_->right_window())) { |
// Do not let the left/right windows be scrolled. |
- state->top = GetTransformForSplitWindow(window, kMaxScale); |
- state->bottom = state->top; |
+ gfx::Transform transform = |
+ GetTransformForSplitWindow(window, kOverviewDefaultScale); |
+ state->max_y = state->min_y = transform.To2dTranslation().y(); |
+ state->split = true; |
--index; |
continue; |
} |
+ state->split = false; |
UpdateTerminalStateForWindowAtIndex(window, index, windows.size()); |
} |
} |
@@ -227,26 +260,15 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
const int kGapBetweenWindowsBottom = 10; |
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; |
- 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); |
- 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); |
CHECK(state); |
- state->top = top_transform; |
- state->bottom = bottom_transform; |
+ if (state->split) |
+ return; |
+ state->min_y = top; |
+ state->max_y = bottom - window->bounds().y(); |
state->progress = 0.f; |
} |
@@ -349,7 +371,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
} |
int GetScrollableHeight() const { |
- const float kScrollableFraction = 0.65f; |
+ const float kScrollableFraction = 0.85f; |
const float kScrollableFractionInSplit = 0.5f; |
const float fraction = split_view_controller_->IsSplitViewModeActive() |
? kScrollableFractionInSplit |
@@ -399,7 +421,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
WindowOverviewState* dragged_state = |
dragged_window_->GetProperty(kWindowOverviewState); |
CHECK(dragged_state); |
- gfx::Transform transform = GetTransformForState(dragged_state); |
+ gfx::Transform transform = |
+ GetTransformForState(dragged_window_, dragged_state); |
transform.Translate(-dragged_distance.x(), 0); |
dragged_window_->SetTransform(transform); |
@@ -451,12 +474,12 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
} |
if (split_view_controller_->IsSplitViewModeActive()) { |
- float scale = kMaxScale; |
+ float scale = kOverviewDefaultScale; |
if (split_drop == split_view_controller_->left_window()) |
scale = kMaxScaleForSplitTarget; |
TransformSplitWindowScale(split_view_controller_->left_window(), scale); |
- scale = kMaxScale; |
+ scale = kOverviewDefaultScale; |
if (split_drop == split_view_controller_->right_window()) |
scale = kMaxScaleForSplitTarget; |
TransformSplitWindowScale(split_view_controller_->right_window(), scale); |
@@ -498,9 +521,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
transform_x = container_->bounds().right() - transformed_bounds.x(); |
else |
transform_x = -(transformed_bounds.x() + transformed_bounds.width()); |
- float scale = gfx::Tween::FloatValueBetween( |
- dragged_state->progress, kMinScale, kMaxScale); |
- transform.Translate(transform_x / scale, 0); |
+ transform.Translate(transform_x / kOverviewDefaultScale, 0); |
dragged_window_->SetTransform(transform); |
dragged_window_->layer()->SetOpacity(kMinOpacity); |
} |
@@ -560,7 +581,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
dragged_window_->layer()->GetAnimator()); |
settings.SetPreemptionStrategy( |
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_ = NULL; |
} |
@@ -705,8 +727,6 @@ class WindowOverviewModeImpl : public WindowOverviewMode, |
} |
const int kMinDistanceForDismissal = 300; |
- const float kMinScale = 0.6f; |
- const float kMaxScale = 0.75f; |
const float kMaxOpacity = 1.0f; |
const float kMinOpacity = 0.2f; |
const float kMaxScaleForSplitTarget = 0.9f; |