| Index: athena/wm/window_overview_mode.cc
|
| diff --git a/athena/wm/window_overview_mode.cc b/athena/wm/window_overview_mode.cc
|
| index b34229309a2c5326c51df2b892a8cd3cdf656cbe..080567f3b50ccf57e5e16aa03dc090e46f8fd5f5 100644
|
| --- a/athena/wm/window_overview_mode.cc
|
| +++ b/athena/wm/window_overview_mode.cc
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "athena/wm/overview_toolbar.h"
|
| #include "athena/wm/public/window_list_provider.h"
|
| +#include "athena/wm/split_view_controller.h"
|
| #include "base/bind.h"
|
| #include "base/macros.h"
|
| #include "ui/aura/scoped_window_targeter.h"
|
| @@ -107,6 +108,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| public:
|
| WindowOverviewModeImpl(aura::Window* container,
|
| const WindowListProvider* window_list_provider,
|
| + SplitViewController* split_view_controller,
|
| WindowOverviewModeDelegate* delegate)
|
| : container_(container),
|
| window_list_provider_(window_list_provider),
|
| @@ -115,9 +117,17 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| container,
|
| scoped_ptr<ui::EventTargeter>(
|
| new StaticWindowTargeter(container)))),
|
| - dragged_window_(NULL) {
|
| + dragged_window_(NULL),
|
| + split_({false, NULL, NULL}) {
|
| + CHECK(delegate_);
|
| container_->set_target_handler(this);
|
|
|
| + split_.enabled = split_view_controller->IsSplitViewModeActive();
|
| + if (split_.enabled) {
|
| + split_.left = split_view_controller->left_window();
|
| + split_.right = split_view_controller->right_window();
|
| + }
|
| +
|
| // Prepare the desired transforms for all the windows, and set the initial
|
| // state on the windows.
|
| ComputeTerminalStatesForAllWindows();
|
| @@ -149,6 +159,15 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
|
|
| WindowOverviewState* state = new WindowOverviewState;
|
| window->SetProperty(kWindowOverviewState, state);
|
| + if (split_.enabled && (window == split_.left || window == split_.right)) {
|
| + // Do not let the left/right windows be scrolled.
|
| + int x_translate = window->bounds().width() * (1 - kMaxScale) / 2;
|
| + state->top.Translate(x_translate, window->bounds().height() * 0.65);
|
| + state->top.Scale(kMaxScale, kMaxScale);
|
| + state->bottom = state->top;
|
| + --index;
|
| + continue;
|
| + }
|
| UpdateTerminalStateForWindowAtIndex(window, index, windows.size());
|
| }
|
| }
|
| @@ -185,14 +204,21 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| // Sets the initial position for the windows for the overview mode.
|
| void SetInitialWindowStates() {
|
| aura::Window::Windows windows = window_list_provider_->GetWindowList();
|
| - size_t window_count = windows.size();
|
| // The initial overview state of the topmost three windows.
|
| const float kInitialProgress[] = { 0.5f, 0.05f, 0.01f };
|
| - for (size_t i = 0; i < window_count; ++i) {
|
| + size_t index = 0;
|
| + for (aura::Window::Windows::const_reverse_iterator iter = windows.rbegin();
|
| + iter != windows.rend();
|
| + ++iter) {
|
| float progress = 0.f;
|
| - aura::Window* window = windows[window_count - 1 - i];
|
| - if (i < arraysize(kInitialProgress))
|
| - progress = kInitialProgress[i];
|
| + aura::Window* window = *iter;
|
| + if (split_.enabled && (window == split_.left || window == split_.right)) {
|
| + progress = 1;
|
| + } else {
|
| + if (index < arraysize(kInitialProgress))
|
| + progress = kInitialProgress[index];
|
| + ++index;
|
| + }
|
|
|
| scoped_refptr<ui::LayerAnimator> animator =
|
| window->layer()->GetAnimator();
|
| @@ -273,7 +299,10 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
|
|
| int GetScrollableHeight() const {
|
| const float kScrollableFraction = 0.65f;
|
| - return container_->bounds().height() * kScrollableFraction;
|
| + const float kScrollableFractionInSplit = 0.5f;
|
| + const float fraction =
|
| + split_.enabled ? kScrollableFractionInSplit : kScrollableFraction;
|
| + return container_->bounds().height() * fraction;
|
| }
|
|
|
| void CreateFlingerFor(const ui::GestureEvent& event) {
|
| @@ -441,13 +470,27 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| RestoreDragWindow();
|
| }
|
|
|
| + void SelectWindow(aura::Window* window) {
|
| + if (!split_.enabled) {
|
| + delegate_->OnSelectWindow(window);
|
| + } else {
|
| + // If the selected window is one of the left/right windows, then keep the
|
| + // current state.
|
| + if (window == split_.left || window == split_.right) {
|
| + delegate_->OnSplitViewMode(split_.left, split_.right);
|
| + } else {
|
| + delegate_->OnSelectWindow(window);
|
| + }
|
| + }
|
| + }
|
| +
|
| // ui::EventHandler:
|
| virtual void OnMouseEvent(ui::MouseEvent* mouse) OVERRIDE {
|
| if (mouse->type() == ui::ET_MOUSE_PRESSED) {
|
| aura::Window* select = SelectWindowAt(mouse);
|
| if (select) {
|
| mouse->SetHandled();
|
| - delegate_->OnSelectWindow(select);
|
| + SelectWindow(select);
|
| }
|
| } else if (mouse->type() == ui::ET_MOUSEWHEEL) {
|
| DoScroll(static_cast<ui::MouseWheelEvent*>(mouse)->y_offset());
|
| @@ -464,7 +507,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| aura::Window* select = SelectWindowAt(gesture);
|
| if (select) {
|
| gesture->SetHandled();
|
| - delegate_->OnSelectWindow(select);
|
| + SelectWindow(select);
|
| }
|
| } else if (gesture->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
|
| if (std::abs(gesture->details().scroll_x_hint()) >
|
| @@ -518,7 +561,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
|
|
| const int kMinDistanceForDismissal = 300;
|
| const float kMinScale = 0.6f;
|
| - const float kMaxScale = 0.95f;
|
| + const float kMaxScale = 0.75f;
|
| const float kMaxOpacity = 1.0f;
|
| const float kMinOpacity = 0.2f;
|
|
|
| @@ -533,6 +576,12 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| gfx::Point dragged_start_location_;
|
| scoped_ptr<OverviewToolbar> overview_toolbar_;
|
|
|
| + struct {
|
| + bool enabled;
|
| + aura::Window* left;
|
| + aura::Window* right;
|
| + } split_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(WindowOverviewModeImpl);
|
| };
|
|
|
| @@ -542,9 +591,11 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
|
| scoped_ptr<WindowOverviewMode> WindowOverviewMode::Create(
|
| aura::Window* container,
|
| const WindowListProvider* window_list_provider,
|
| + SplitViewController* split_view_controller,
|
| WindowOverviewModeDelegate* delegate) {
|
| return scoped_ptr<WindowOverviewMode>(
|
| - new WindowOverviewModeImpl(container, window_list_provider, delegate));
|
| + new WindowOverviewModeImpl(container, window_list_provider,
|
| + split_view_controller, delegate));
|
| }
|
|
|
| } // namespace athena
|
|
|