Commit 8de1135a authored by pkotwicz's avatar pkotwicz Committed by Commit bot

Hide windows which were visible in SplitView when new left/right windows are

specified.

BUG=409724
TEST=SplitViewcontrollerTest.SplitModeActivation

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

Cr-Commit-Position: refs/heads/master@{#295158}
parent f267096b
...@@ -65,14 +65,9 @@ void SplitViewController::ActivateSplitMode(aura::Window* left, ...@@ -65,14 +65,9 @@ void SplitViewController::ActivateSplitMode(aura::Window* left,
aura::Window::Windows windows = window_list_provider_->GetWindowList(); aura::Window::Windows windows = window_list_provider_->GetWindowList();
aura::Window::Windows::reverse_iterator iter = windows.rbegin(); aura::Window::Windows::reverse_iterator iter = windows.rbegin();
if (state_ == ACTIVE) { if (state_ == ACTIVE) {
if (left_window_ == right) if (!left && left_window_ != right)
left_window_ = left;
if (right_window_ == left)
right_window_ = right;
if (!left)
left = left_window_; left = left_window_;
if (!right) if (!right && right_window_ != left)
right = right_window_; right = right_window_;
} }
...@@ -94,6 +89,12 @@ void SplitViewController::ActivateSplitMode(aura::Window* left, ...@@ -94,6 +89,12 @@ void SplitViewController::ActivateSplitMode(aura::Window* left,
} }
} }
to_hide_.clear();
if (left_window_ && left_window_ != left && left_window_ != right)
to_hide_.push_back(left_window_);
if (right_window_ && right_window_ != left && right_window_ != right)
to_hide_.push_back(right_window_);
SetState(ACTIVE); SetState(ACTIVE);
right_window_ = right; right_window_ = right;
left_window_ = left; left_window_ = left;
...@@ -229,6 +230,10 @@ void SplitViewController::OnAnimationCompleted() { ...@@ -229,6 +230,10 @@ void SplitViewController::OnAnimationCompleted() {
return; return;
UpdateLayout(false); UpdateLayout(false);
for (size_t i = 0; i < to_hide_.size(); ++i)
to_hide_[i]->Hide();
to_hide_.clear();
if (state_ == INACTIVE) { if (state_ == INACTIVE) {
left_window_ = NULL; left_window_ = NULL;
right_window_ = NULL; right_window_ = NULL;
......
...@@ -105,6 +105,10 @@ class ATHENA_EXPORT SplitViewController ...@@ -105,6 +105,10 @@ class ATHENA_EXPORT SplitViewController
// container_ coordinates (along the x axis). // container_ coordinates (along the x axis).
int separator_position_; int separator_position_;
// Windows which should be hidden when the animation initiated by
// UpdateLayout() completes.
std::vector<aura::Window*> to_hide_;
base::WeakPtrFactory<SplitViewController> weak_factory_; base::WeakPtrFactory<SplitViewController> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SplitViewController); DISALLOW_COPY_AND_ASSIGN(SplitViewController);
......
...@@ -46,6 +46,22 @@ class SplitViewControllerTest : public test::AthenaTestBase { ...@@ -46,6 +46,22 @@ class SplitViewControllerTest : public test::AthenaTestBase {
second_topmost == controller->right_window()); second_topmost == controller->right_window());
} }
// Returns whether only the split view windows are visible.
bool OnlySplitViewWindowsVisible() const {
SplitViewController* controller = api_->GetSplitViewController();
DCHECK(controller->IsSplitViewModeActive());
aura::Window::Windows list =
api_->GetWindowListProvider()->GetWindowList();
for (aura::Window::Windows::const_iterator it = list.begin();
it != list.end(); ++it) {
bool in_split_view = (*it == controller->left_window() ||
*it == controller->right_window());
if (in_split_view != (*it)->IsVisible())
return false;
}
return true;
}
bool IsSplitViewAllowed() const { bool IsSplitViewAllowed() const {
return api_->GetSplitViewController()->CanScroll(); return api_->GetSplitViewController()->CanScroll();
} }
...@@ -69,8 +85,11 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) { ...@@ -69,8 +85,11 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) {
for (size_t i = 0; i < kNumWindows; ++i) { for (size_t i = 0; i < kNumWindows; ++i) {
scoped_ptr<aura::Window> window = CreateTestWindow(NULL, gfx::Rect()); scoped_ptr<aura::Window> window = CreateTestWindow(NULL, gfx::Rect());
windows.push_back(window.release()); windows.push_back(window.release());
windows[i]->Hide();
} }
windows[kNumWindows - 1]->Show();
SplitViewController* controller = api()->GetSplitViewController(); SplitViewController* controller = api()->GetSplitViewController();
ASSERT_FALSE(controller->IsSplitViewModeActive()); ASSERT_FALSE(controller->IsSplitViewModeActive());
...@@ -80,6 +99,7 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) { ...@@ -80,6 +99,7 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) {
EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); EXPECT_EQ(windows[kNumWindows - 2], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
// Select the window that is currently on the left for the right panel. The // Select the window that is currently on the left for the right panel. The
// windows should switch. // windows should switch.
...@@ -87,11 +107,13 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) { ...@@ -87,11 +107,13 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) {
EXPECT_EQ(windows[kNumWindows - 2], controller->left_window()); EXPECT_EQ(windows[kNumWindows - 2], controller->left_window());
EXPECT_EQ(windows[kNumWindows - 1], controller->right_window()); EXPECT_EQ(windows[kNumWindows - 1], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
controller->ActivateSplitMode(windows[kNumWindows - 1], NULL); controller->ActivateSplitMode(windows[kNumWindows - 1], NULL);
EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); EXPECT_EQ(windows[kNumWindows - 2], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
// Select one of the windows behind the stacks for the right panel. The window // Select one of the windows behind the stacks for the right panel. The window
// on the left should remain unchanged. // on the left should remain unchanged.
...@@ -99,21 +121,25 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) { ...@@ -99,21 +121,25 @@ TEST_F(SplitViewControllerTest, SplitModeActivation) {
EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
EXPECT_EQ(windows[0], controller->right_window()); EXPECT_EQ(windows[0], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
controller->ActivateSplitMode(windows[1], NULL); controller->ActivateSplitMode(windows[1], NULL);
EXPECT_EQ(windows[1], controller->left_window()); EXPECT_EQ(windows[1], controller->left_window());
EXPECT_EQ(windows[0], controller->right_window()); EXPECT_EQ(windows[0], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
controller->ActivateSplitMode(windows[4], windows[5]); controller->ActivateSplitMode(windows[4], windows[5]);
EXPECT_EQ(windows[4], controller->left_window()); EXPECT_EQ(windows[4], controller->left_window());
EXPECT_EQ(windows[5], controller->right_window()); EXPECT_EQ(windows[5], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
controller->ActivateSplitMode(windows[0], NULL); controller->ActivateSplitMode(windows[0], NULL);
EXPECT_EQ(windows[0], controller->left_window()); EXPECT_EQ(windows[0], controller->left_window());
EXPECT_EQ(windows[5], controller->right_window()); EXPECT_EQ(windows[5], controller->right_window());
EXPECT_TRUE(SplitViewWindowsTopmost()); EXPECT_TRUE(SplitViewWindowsTopmost());
EXPECT_TRUE(OnlySplitViewWindowsVisible());
} }
TEST_F(SplitViewControllerTest, LandscapeOnly) { TEST_F(SplitViewControllerTest, LandscapeOnly) {
......
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