Index: athena/wm/split_view_controller.cc |
diff --git a/athena/wm/split_view_controller.cc b/athena/wm/split_view_controller.cc |
index 595a61ae8e0870903d53effa6929c81a828f96bc..7da36755f7e76433545753ba21a2e4c1f89f3b02 100644 |
--- a/athena/wm/split_view_controller.cc |
+++ b/athena/wm/split_view_controller.cc |
@@ -4,273 +4,29 @@ |
#include "athena/wm/split_view_controller.h" |
-#include <cmath> |
- |
-#include "athena/wm/public/window_list_provider.h" |
-#include "athena/wm/public/window_manager.h" |
-#include "base/bind.h" |
#include "ui/aura/window.h" |
-#include "ui/compositor/layer_animation_observer.h" |
-#include "ui/compositor/scoped_layer_animation_settings.h" |
#include "ui/events/event_handler.h" |
-#include "ui/gfx/display.h" |
-#include "ui/gfx/screen.h" |
namespace athena { |
-namespace { |
-// An animation observer that runs a callback at the end of the animation, and |
-// destroys itself. |
-class CallbackAnimationObserver : public ui::ImplicitAnimationObserver { |
- public: |
- explicit CallbackAnimationObserver(const base::Closure& closure) |
- : closure_(closure) {} |
- |
- virtual ~CallbackAnimationObserver() {} |
- |
- private: |
- // Overridden from ui::ImplicitAnimationObserver: |
- virtual void OnImplicitAnimationsCompleted() OVERRIDE { |
- if (!closure_.is_null()) |
- closure_.Run(); |
- delete this; |
- } |
- |
- const base::Closure closure_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CallbackAnimationObserver); |
-}; |
- |
-} // namespace |
- |
-SplitViewController::SplitViewController( |
- aura::Window* container, |
- WindowListProvider* window_list_provider, |
- WindowManager* window_manager) |
- : state_(INACTIVE), |
- container_(container), |
- window_manager_(window_manager), |
- window_list_provider_(window_list_provider), |
- current_activity_window_(NULL), |
- left_window_(NULL), |
- right_window_(NULL), |
- separator_position_(0), |
- weak_factory_(this) { |
- window_manager->AddObserver(this); |
+SplitViewController::SplitViewController() { |
} |
SplitViewController::~SplitViewController() { |
- window_manager_->RemoveObserver(this); |
} |
-bool SplitViewController::IsSplitViewModeActive() const { |
- return state_ == ACTIVE; |
+void SplitViewController::ScrollBegin(BezelController::Bezel bezel, |
+ float delta) { |
} |
-void SplitViewController::UpdateLayout(bool animate) { |
- if (!left_window_) |
- return; |
- CHECK(right_window_); |
- gfx::Transform left_transform; |
- 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); |
- } else { |
- left_transform.Translate(separator_position_ - container_width, 0); |
- right_transform.Translate(separator_position_, 0); |
- } |
- left_window_->Show(); |
- right_window_->Show(); |
- SetWindowTransform(left_window_, left_transform, animate); |
- SetWindowTransform(right_window_, right_transform, animate); |
-} |
- |
-void SplitViewController::SetWindowTransform(aura::Window* window, |
- const gfx::Transform& transform, |
- bool animate) { |
- if (animate) { |
- scoped_refptr<ui::LayerAnimator> animator = window->layer()->GetAnimator(); |
- ui::ScopedLayerAnimationSettings settings(animator); |
- settings.SetPreemptionStrategy( |
- ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
- settings.AddObserver(new CallbackAnimationObserver( |
- base::Bind(&SplitViewController::OnAnimationCompleted, |
- weak_factory_.GetWeakPtr(), |
- window))); |
- window->SetTransform(transform); |
- } else { |
- window->SetTransform(transform); |
- } |
-} |
- |
-void SplitViewController::OnAnimationCompleted(aura::Window* window) { |
- 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); |
- } |
- } else { |
- int container_width = container_->bounds().width(); |
- window->SetTransform(gfx::Transform()); |
- if (window == left_window_) { |
- if (separator_position_ == 0) |
- left_window_->Hide(); |
- if (state_ == INACTIVE) |
- left_window_ = NULL; |
- } else { |
- if (separator_position_ == container_width) |
- right_window_->Hide(); |
- if (state_ == INACTIVE) |
- right_window_ = NULL; |
- } |
- } |
-} |
- |
-void SplitViewController::UpdateSeparatorPositionFromScrollDelta(float delta) { |
- gfx::Screen* screen = gfx::Screen::GetScreenFor(container_); |
- const gfx::Rect& display_bounds = |
- screen->GetDisplayNearestWindow(container_).bounds(); |
- gfx::Rect container_bounds = container_->GetBoundsInScreen(); |
- separator_position_ = |
- delta > 0 ? ((int)delta) + display_bounds.x() - container_bounds.x() |
- : display_bounds.right() - container_bounds.x() + delta; |
-} |
- |
-aura::Window* SplitViewController::GetCurrentActivityWindow() { |
- if (!current_activity_window_) { |
- aura::Window::Windows windows = window_list_provider_->GetWindowList(); |
- if (windows.empty()) |
- return NULL; |
- current_activity_window_ = windows.back(); |
- } |
- return current_activity_window_; |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// Begin BezelController::ScrollDelegate overrides. |
-void SplitViewController::ScrollBegin(BezelController::Bezel bezel, |
- float delta) { |
- if (!CanScroll()) |
- return; |
- state_ = SCROLLING; |
- aura::Window* current_window = GetCurrentActivityWindow(); |
- CHECK(current_window); |
- |
- aura::Window::Windows windows = window_list_provider_->GetWindowList(); |
- CHECK(windows.size() >= 2); |
- aura::Window::Windows::const_iterator it = |
- std::find(windows.begin(), windows.end(), current_window); |
- CHECK(it != windows.end()); |
- |
- if (delta > 0) { |
- right_window_ = current_window; |
- // reverse iterator points to the position before normal iterator |it| |
- aura::Window::Windows::const_reverse_iterator rev_it(it); |
- // circle to end if needed. |
- left_window_ = rev_it == windows.rend() ? windows.back() : *(rev_it); |
- } else { |
- left_window_ = current_window; |
- ++it; |
- // circle to front if needed. |
- right_window_ = it == windows.end() ? windows.front() : *it; |
- } |
- |
- CHECK(left_window_); |
- CHECK(right_window_); |
- |
- // TODO(oshima|mfomitchev): crbug.com/388362 |
- // Until we are properly hiding off-screen windows in window manager: |
- // Loop through all windows and hide them |
- for (it = windows.begin(); it != windows.end(); ++it) { |
- if (*it != left_window_ && *it != right_window_) |
- (*it)->Hide(); |
- } |
- |
- UpdateSeparatorPositionFromScrollDelta(delta); |
- UpdateLayout(false); |
-} |
- |
-// Max distance from the scroll end position to the middle of the screen where |
-// we would go into the split view mode. |
-const int kMaxDistanceFromMiddle = 120; |
void SplitViewController::ScrollEnd() { |
- if (state_ != SCROLLING) |
- return; |
- |
- int container_width = container_->GetBoundsInScreen().width(); |
- if (std::abs(container_width / 2 - separator_position_) <= |
- kMaxDistanceFromMiddle) { |
- state_ = ACTIVE; |
- separator_position_ = container_width / 2; |
- } else if (separator_position_ < container_width / 2) { |
- separator_position_ = 0; |
- current_activity_window_ = right_window_; |
- state_ = INACTIVE; |
- } else { |
- separator_position_ = container_width; |
- current_activity_window_ = left_window_; |
- state_ = INACTIVE; |
- } |
- UpdateLayout(true); |
} |
void SplitViewController::ScrollUpdate(float delta) { |
- if (state_ != SCROLLING) |
- return; |
- UpdateSeparatorPositionFromScrollDelta(delta); |
- UpdateLayout(false); |
} |
bool SplitViewController::CanScroll() { |
- // TODO(mfomitchev): return false in vertical orientation, in full screen. |
- bool result = (!window_manager_->IsOverviewModeActive() && |
- !IsSplitViewModeActive() && |
- window_list_provider_->GetWindowList().size() >= 2); |
- return result; |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// WindowManagerObserver overrides |
-void SplitViewController::OnOverviewModeEnter() { |
- if (state_ == ACTIVE) { |
- CHECK(left_window_); |
- CHECK(right_window_); |
- window_list_provider_->MoveToFront(right_window_); |
- window_list_provider_->MoveToFront(left_window_); |
- // TODO(mfomitchev): This shouldn't be done here, but the overview mode's |
- // transition animation currently looks bad if the starting transform of |
- // any window is not gfx::Transform(). |
- right_window_->SetTransform(gfx::Transform()); |
- } else if (current_activity_window_) { |
- window_list_provider_->MoveToFront(current_activity_window_); |
- } |
- state_ = INACTIVE; |
- left_window_ = NULL; |
- right_window_ = NULL; |
- current_activity_window_ = NULL; |
-} |
- |
-void SplitViewController::OnOverviewModeExit() { |
+ return false; |
} |
} // namespace athena |