Index: athena/wm/split_view_controller.cc |
diff --git a/athena/wm/split_view_controller.cc b/athena/wm/split_view_controller.cc |
index cf39f2e0c60d44af99ccb6f571a4192a13640a48..e36b7a94e05623cbabd35e45564bdb0f691ae6e1 100644 |
--- a/athena/wm/split_view_controller.cc |
+++ b/athena/wm/split_view_controller.cc |
@@ -20,6 +20,21 @@ |
namespace athena { |
+namespace { |
+ |
+// Returns a target transform which is suitable for animating a windows's |
+// bounds. |
+gfx::Transform GetTargetTransformForBoundsAnimation(const gfx::Rect& from, |
+ const gfx::Rect& to) { |
+ gfx::Transform transform; |
+ transform.Translate(to.x() - from.x(), to.y() - from.y()); |
+ transform.Scale(to.width() / static_cast<float>(from.width()), |
+ to.height() / static_cast<float>(from.height())); |
+ return transform; |
+} |
+ |
+} // namespace |
+ |
SplitViewController::SplitViewController( |
aura::Window* container, |
WindowListProvider* window_list_provider) |
@@ -113,6 +128,20 @@ void SplitViewController::DeactivateSplitMode() { |
left_window_ = right_window_ = NULL; |
} |
+gfx::Rect SplitViewController::GetLeftTargetBounds() { |
+ gfx::Rect work_area = |
+ gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area(); |
+ return gfx::Rect(0, 0, container_->bounds().width() / 2, work_area.height()); |
+} |
+ |
+gfx::Rect SplitViewController::GetRightTargetBounds() { |
+ gfx::Rect work_area = |
+ gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area(); |
+ int container_width = container_->bounds().width(); |
+ return gfx::Rect( |
+ container_width / 2, 0, container_width / 2, work_area.height()); |
+} |
+ |
void SplitViewController::UpdateLayout(bool animate) { |
if (!left_window_) |
return; |
@@ -121,19 +150,16 @@ void SplitViewController::UpdateLayout(bool animate) { |
gfx::Transform right_transform; |
int container_width = container_->GetBoundsInScreen().width(); |
if (state_ == ACTIVE) { |
- // This method should only be called once in ACTIVE state when |
- // the left and rightwindows are still full screen and need to be resized. |
- CHECK_EQ(left_window_->bounds().width(), container_width); |
- CHECK_EQ(right_window_->bounds().width(), container_width); |
// Windows should be resized via an animation when entering the ACTIVE |
// state. |
CHECK(animate); |
// We scale the windows here, but when the animation finishes, we reset |
// the scaling and update the window bounds to the proper size - see |
// OnAnimationCompleted(). |
- left_transform.Scale(.5, 1); |
- right_transform.Scale(.5, 1); |
- right_transform.Translate(container_width, 0); |
+ left_transform = GetTargetTransformForBoundsAnimation( |
+ left_window_->bounds(), GetLeftTargetBounds()); |
+ right_transform = GetTargetTransformForBoundsAnimation( |
+ right_window_->bounds(), GetRightTargetBounds()); |
} else { |
left_transform.Translate(separator_position_ - container_width, 0); |
right_transform.Translate(separator_position_, 0); |
@@ -168,16 +194,11 @@ void SplitViewController::OnAnimationCompleted(aura::Window* window) { |
return; |
DCHECK(window == left_window_ || window == right_window_); |
if (state_ == ACTIVE) { |
- gfx::Rect window_bounds = gfx::Rect(container_->bounds().size()); |
- int container_width = window_bounds.width(); |
- window_bounds.set_width(container_width / 2); |
window->SetTransform(gfx::Transform()); |
- if (window == left_window_) { |
- left_window_->SetBounds(window_bounds); |
- } else { |
- window_bounds.set_x(container_width / 2); |
- right_window_->SetBounds(window_bounds); |
- } |
+ if (window == left_window_) |
+ left_window_->SetBounds(GetLeftTargetBounds()); |
+ else |
+ right_window_->SetBounds(GetRightTargetBounds()); |
} else { |
int container_width = container_->bounds().width(); |
window->SetTransform(gfx::Transform()); |