Commit cca1bdc1 authored by varkha@chromium.org's avatar varkha@chromium.org

Eliminates gap at the top and bottom of docked area

BUG=331872
TEST=Visual
 Dock one browser window - should take all vertical space.
 Dock two browser windows - should reach to top / bottom of the docked area.
TEST=ash_unittests --gtest_filter=*Dock*

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243236 0039d316-1c4b-4281-b951-d872f2087c98
parent 54124ed0
......@@ -550,10 +550,8 @@ bool DockedWindowLayoutManager::CanDockWindow(aura::Window* window,
// then it cannot be docked.
const gfx::Rect work_area =
Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area();
if (GetWindowHeightCloseTo(window, work_area.height() - 2 * kMinDockGap) >
work_area.height() - 2 * kMinDockGap) {
if (GetWindowHeightCloseTo(window, work_area.height()) > work_area.height())
return false;
}
// Cannot dock on the other size from an existing dock.
const DockedAlignment alignment = CalculateAlignment();
if ((edge == SNAP_LEFT && alignment == DOCKED_ALIGNMENT_RIGHT) ||
......@@ -818,9 +816,10 @@ void DockedWindowLayoutManager::MaybeMinimizeChildrenExcept(
// Minimize any windows that don't fit without overlap.
const gfx::Rect work_area =
Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area();
int available_room = work_area.height() - kMinDockGap;
int available_room = work_area.height();
bool gap_needed = !!child;
if (child)
available_room -= (GetWindowHeightCloseTo(child, 0) + kMinDockGap);
available_room -= GetWindowHeightCloseTo(child, 0);
// Use a copy of children array because a call to Minimize can change order.
aura::Window::Windows children(dock_container_->children());
aura::Window::Windows::const_reverse_iterator iter = children.rbegin();
......@@ -828,7 +827,9 @@ void DockedWindowLayoutManager::MaybeMinimizeChildrenExcept(
aura::Window* window(*iter++);
if (window == child || !IsUsedByLayout(window))
continue;
int room_needed = GetWindowHeightCloseTo(window, 0) + kMinDockGap;
int room_needed = GetWindowHeightCloseTo(window, 0) +
(gap_needed ? kMinDockGap : 0);
gap_needed = true;
if (available_room > room_needed) {
available_room -= room_needed;
} else {
......@@ -1008,8 +1009,9 @@ void DockedWindowLayoutManager::Relayout() {
int DockedWindowLayoutManager::CalculateWindowHeightsAndRemainingRoom(
const gfx::Rect work_area,
std::vector<WindowWithHeight>* visible_windows) {
int available_room = work_area.height() - kMinDockGap;
int available_room = work_area.height();
int remaining_windows = visible_windows->size();
int gap_height = remaining_windows > 1 ? kMinDockGap : 0;
// Sort windows by their minimum heights and calculate target heights.
std::sort(visible_windows->begin(), visible_windows->end(),
......@@ -1023,11 +1025,12 @@ int DockedWindowLayoutManager::CalculateWindowHeightsAndRemainingRoom(
visible_windows->rbegin();
iter != visible_windows->rend(); ++iter) {
iter->height_ = GetWindowHeightCloseTo(
iter->window(), available_room / remaining_windows - kMinDockGap);
available_room -= (iter->height_ + kMinDockGap);
iter->window(),
(available_room + gap_height) / remaining_windows - gap_height);
available_room -= (iter->height_ + gap_height);
remaining_windows--;
}
return available_room;
return available_room + gap_height;
}
int DockedWindowLayoutManager::CalculateIdealWidth(
......@@ -1067,10 +1070,10 @@ void DockedWindowLayoutManager::FanOutChildren(
// Calculate initial vertical offset and the gap or overlap between windows.
const int num_windows = visible_windows->size();
const float delta = kMinDockGap + (float)available_room /
const float delta = static_cast<float>(available_room) /
((available_room > 0 || num_windows <= 1) ?
num_windows + 1 : num_windows - 1);
float y_pos = work_area.y() + ((delta > 0) ? delta : kMinDockGap);
float y_pos = work_area.y() + ((delta > 0) ? delta : 0);
// Docked area is shown only if there is at least one non-dragged visible
// docked window.
......@@ -1113,7 +1116,7 @@ void DockedWindowLayoutManager::FanOutChildren(
bounds.set_y(std::max(work_area.y(),
std::min(work_area.bottom() - bounds.height(),
static_cast<int>(y_pos + 0.5))));
y_pos += bounds.height() + delta;
y_pos += bounds.height() + delta + kMinDockGap;
// All docked windows other than the one currently dragged remain stuck
// to the screen edge (flush with the edge or centered in the dock area).
......
......@@ -417,9 +417,9 @@ TEST_P(DockedWindowLayoutManagerTest, AddTwoWindows) {
int gap1 = w1->GetBoundsInScreen().y();
int gap2 = w2->GetBoundsInScreen().y() - w1->GetBoundsInScreen().bottom();
int gap3 = work_area.bottom() - w2->GetBoundsInScreen().bottom();
EXPECT_NEAR(gap1, min_dock_gap(), 1);
EXPECT_EQ(0, gap1);
EXPECT_NEAR(gap2, min_dock_gap(), 1);
EXPECT_NEAR(gap3, min_dock_gap(), 1);
EXPECT_EQ(0, gap3);
}
// Adds two non-overlapping windows and tests layout after a drag.
......@@ -451,9 +451,9 @@ TEST_P(DockedWindowLayoutManagerTest, TwoWindowsDragging) {
int gap1 = w2->GetBoundsInScreen().y() - work_area.y();
int gap2 = w1->GetBoundsInScreen().y() - w2->GetBoundsInScreen().bottom();
int gap3 = work_area.bottom() - w1->GetBoundsInScreen().bottom();
EXPECT_NEAR(gap1, min_dock_gap(), 1);
EXPECT_EQ(0, gap1);
EXPECT_NEAR(gap2, min_dock_gap(), 1);
EXPECT_NEAR(gap3, min_dock_gap(), 1);
EXPECT_EQ(0, gap3);
}
// Adds three overlapping windows and tests layout after a drag.
......@@ -488,10 +488,10 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDragging) {
int gap2 = w2->GetBoundsInScreen().y() - w1->GetBoundsInScreen().bottom();
int gap3 = w3->GetBoundsInScreen().y() - w2->GetBoundsInScreen().bottom();
int gap4 = work_area.bottom() - w3->GetBoundsInScreen().bottom();
EXPECT_NEAR(gap1, min_dock_gap(), 1);
EXPECT_EQ(0, gap1);
EXPECT_NEAR(gap2, min_dock_gap(), 1);
EXPECT_NEAR(gap3, min_dock_gap(), 1);
EXPECT_NEAR(gap4, min_dock_gap(), 1);
EXPECT_EQ(0, gap4);
// Drag w1 below the point where w1 and w2 would swap places. This point is
// half way between the tops of those two windows.
......@@ -501,11 +501,10 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDragging) {
DragMove(0, min_dock_gap() + w2->bounds().height() / 2 + 10);
// During the drag the windows get rearranged and the top and the bottom
// should be limited by the work area + |kMinDockGap|.
EXPECT_EQ(min_dock_gap(), w2->GetBoundsInScreen().y());
// should be limited by the work area.
EXPECT_EQ(work_area.y(), w2->GetBoundsInScreen().y());
EXPECT_GT(w1->GetBoundsInScreen().y(), w2->GetBoundsInScreen().y());
EXPECT_EQ(min_dock_gap(),
work_area.bottom() - w3->GetBoundsInScreen().bottom());
EXPECT_EQ(work_area.bottom(), w3->GetBoundsInScreen().bottom());
DragEnd();
// Test the new windows order and that the gaps differ at most by a pixel.
......@@ -513,10 +512,10 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDragging) {
gap2 = w1->GetBoundsInScreen().y() - w2->GetBoundsInScreen().bottom();
gap3 = w3->GetBoundsInScreen().y() - w1->GetBoundsInScreen().bottom();
gap4 = work_area.bottom() - w3->GetBoundsInScreen().bottom();
EXPECT_NEAR(gap1, min_dock_gap(), 1);
EXPECT_EQ(0, gap1);
EXPECT_NEAR(gap2, min_dock_gap(), 1);
EXPECT_NEAR(gap3, min_dock_gap(), 1);
EXPECT_NEAR(gap4, min_dock_gap(), 1);
EXPECT_EQ(0, gap4);
}
// Adds three windows in bottom display and tests layout after a drag.
......@@ -558,10 +557,10 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDraggingSecondScreen) {
int gap2 = w2->GetBoundsInScreen().y() - w1->GetBoundsInScreen().bottom();
int gap3 = w3->GetBoundsInScreen().y() - w2->GetBoundsInScreen().bottom();
int gap4 = work_area.bottom() - w3->GetBoundsInScreen().bottom();
EXPECT_NEAR(gap1, min_dock_gap(), 1);
EXPECT_EQ(0, gap1);
EXPECT_NEAR(gap2, min_dock_gap(), 1);
EXPECT_NEAR(gap3, min_dock_gap(), 1);
EXPECT_NEAR(gap4, min_dock_gap(), 1);
EXPECT_EQ(0, gap4);
// Drag w1 below the point where w1 and w2 would swap places. This point is
// half way between the tops of those two windows.
......@@ -571,11 +570,10 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDraggingSecondScreen) {
DragMove(0, min_dock_gap() + w2->bounds().height() / 2 + 10);
// During the drag the windows get rearranged and the top and the bottom
// should be limited by the work area + |kMinDockGap|.
EXPECT_EQ(work_area.y() + min_dock_gap(), w2->GetBoundsInScreen().y());
// should be limited by the work area.
EXPECT_EQ(work_area.y(), w2->GetBoundsInScreen().y());
EXPECT_GT(w1->GetBoundsInScreen().y(), w2->GetBoundsInScreen().y());
EXPECT_EQ(min_dock_gap(),
work_area.bottom() - w3->GetBoundsInScreen().bottom());
EXPECT_EQ(work_area.bottom(), w3->GetBoundsInScreen().bottom());
DragEnd();
// Test the new windows order and that the overlaps differ at most by a pixel.
......@@ -583,10 +581,10 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDraggingSecondScreen) {
gap2 = w1->GetBoundsInScreen().y() - w2->GetBoundsInScreen().bottom();
gap3 = w3->GetBoundsInScreen().y() - w1->GetBoundsInScreen().bottom();
gap4 = work_area.bottom() - w3->GetBoundsInScreen().bottom();
EXPECT_NEAR(gap1, min_dock_gap(), 1);
EXPECT_EQ(0, gap1);
EXPECT_NEAR(gap2, min_dock_gap(), 1);
EXPECT_NEAR(gap3, min_dock_gap(), 1);
EXPECT_NEAR(gap4, min_dock_gap(), 1);
EXPECT_EQ(0, gap4);
}
// Tests that a second window added to the dock is resized to match.
......
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