blob: 633aea7e227ee6ef1dbf835d3936bd64582f0b9f [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/elements/paged_grid_layout.h"
namespace vr {
PagedGridLayout::PagedGridLayout(size_t rows,
size_t columns,
const gfx::SizeF& tile_size)
: rows_(rows), columns_(columns), tile_size_(tile_size) {
DCHECK_NE(0lu, rows);
DCHECK_NE(0lu, columns);
}
PagedGridLayout::~PagedGridLayout() {}
void PagedGridLayout::LayOutNonContributingChildren() {
current_page_ = NumPages() > 0 ? std::min(NumPages() - 1, current_page_) : 0;
gfx::SizeF page_size(columns_ * tile_size_.width() + (columns_ - 1) * margin_,
rows_ * tile_size_.height() + (rows_ - 1) * margin_);
gfx::Vector2dF initial_offset(
-0.5 * (page_size.width() * NumPages() + margin_ * (NumPages() - 1) -
tile_size_.width()),
-0.5 * (page_size.height() - tile_size_.height()));
for (size_t i = 0; i < children().size(); i++) {
if (!children()[i]->IsVisible()) {
continue;
}
size_t child_page = i / (rows_ * columns_);
gfx::Vector2dF page_offset(
child_page * columns_ * (tile_size_.width() + margin_), 0.0f);
size_t in_page_index = i % (rows_ * columns_);
gfx::Vector2dF in_page_offset(
(in_page_index % columns_) * (tile_size_.width() + margin_),
(in_page_index / columns_) * (tile_size_.height() + margin_));
gfx::Vector2dF child_offset = initial_offset + page_offset + in_page_offset;
children()[i]->SetLayoutOffset(child_offset.x(), -child_offset.y());
}
SetSize(page_size.width() * NumPages() + margin_ * (NumPages() - 1),
page_size.height());
}
void PagedGridLayout::SetCurrentPage(size_t current_page) {
DCHECK(current_page == 0 || (NumPages() > 0 && current_page < NumPages()));
current_page_ = current_page;
}
size_t PagedGridLayout::NumPages() const {
size_t page_size = rows_ * columns_;
return (children().size() + (page_size - 1)) / page_size;
}
PagedGridLayout::PageState PagedGridLayout::GetPageState(UiElement* child) {
auto child_iter =
std::find_if(children().begin(), children().end(),
[child](const std::unique_ptr<UiElement>& current_child) {
return current_child.get() == child;
});
if (child_iter == children().end()) {
return kNone;
}
size_t child_index = std::distance(children().begin(), child_iter);
size_t child_page = child_index / (rows_ * columns_);
if (child_page == current_page()) {
return kActive;
}
if (child_page + 1 == current_page() || child_page == current_page() + 1) {
return kInactive;
}
return kHidden;
}
} // namespace vr