| Index: ui/app_list/views/apps_grid_view.cc
|
| diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
|
| index f150eb6b6802d80162520ddfe390c0bbcac19581..1605c885d833107002c8defcab91452918212c3c 100644
|
| --- a/ui/app_list/views/apps_grid_view.cc
|
| +++ b/ui/app_list/views/apps_grid_view.cc
|
| @@ -92,6 +92,12 @@ const int kFolderItemReparentDelay = 50;
|
| // UI.
|
| const int kFolderDroppingCircleRadius = 15;
|
|
|
| +// Constants for dealing with scroll events.
|
| +const int kMinMouseWheelToSwitchPage = 20;
|
| +const int kMinScrollToSwitchPage = 20;
|
| +const int kMinHorizVelocityToSwitchPage = 800;
|
| +
|
| +const double kFinishTransitionThreshold = 0.33;
|
|
|
| // RowMoveAnimationDelegate is used when moving an item into a different row.
|
| // Before running the animation, the item's layer is re-created and kept in
|
| @@ -846,11 +852,12 @@ void AppsGridView::SetDragAndDropHostOfCurrentAppList(
|
| drag_and_drop_host_ = drag_and_drop_host;
|
| }
|
|
|
| -void AppsGridView::Prerender(int page_index) {
|
| +void AppsGridView::Prerender() {
|
| Layout();
|
| - int start = std::max(0, (page_index - kPrerenderPages) * tiles_per_page());
|
| + int selected_page = std::max(0, pagination_model_.selected_page());
|
| + int start = std::max(0, (selected_page - kPrerenderPages) * tiles_per_page());
|
| int end = std::min(view_model_.view_size(),
|
| - (page_index + 1 + kPrerenderPages) * tiles_per_page());
|
| + (selected_page + 1 + kPrerenderPages) * tiles_per_page());
|
| for (int i = start; i < end; i++) {
|
| AppListItemView* v = static_cast<AppListItemView*>(view_model_.view_at(i));
|
| v->Prerender();
|
| @@ -953,6 +960,23 @@ bool AppsGridView::OnKeyReleased(const ui::KeyEvent& event) {
|
| return handled;
|
| }
|
|
|
| +bool AppsGridView::OnMouseWheel(const ui::MouseWheelEvent& event) {
|
| + int offset;
|
| + if (abs(event.x_offset()) > abs(event.y_offset()))
|
| + offset = event.x_offset();
|
| + else
|
| + offset = event.y_offset();
|
| +
|
| + if (abs(offset) > kMinMouseWheelToSwitchPage) {
|
| + if (!pagination_model_.has_transition()) {
|
| + pagination_model_.SelectPageRelative(offset > 0 ? -1 : 1, true);
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| void AppsGridView::ViewHierarchyChanged(
|
| const ViewHierarchyChangedDetails& details) {
|
| if (!details.is_add && details.parent == this) {
|
| @@ -971,6 +995,57 @@ void AppsGridView::ViewHierarchyChanged(
|
| }
|
| }
|
|
|
| +void AppsGridView::OnGestureEvent(ui::GestureEvent* event) {
|
| + switch (event->type()) {
|
| + case ui::ET_GESTURE_SCROLL_BEGIN:
|
| + pagination_model_.StartScroll();
|
| + event->SetHandled();
|
| + return;
|
| + case ui::ET_GESTURE_SCROLL_UPDATE:
|
| + // event->details.scroll_x() > 0 means moving contents to right. That is,
|
| + // transitioning to previous page.
|
| + pagination_model_.UpdateScroll(event->details().scroll_x() /
|
| + GetContentsBounds().width());
|
| + event->SetHandled();
|
| + return;
|
| + case ui::ET_GESTURE_SCROLL_END:
|
| + pagination_model_.EndScroll(pagination_model_.transition().progress <
|
| + kFinishTransitionThreshold);
|
| + event->SetHandled();
|
| + return;
|
| + case ui::ET_SCROLL_FLING_START: {
|
| + pagination_model_.EndScroll(true);
|
| + if (fabs(event->details().velocity_x()) > kMinHorizVelocityToSwitchPage) {
|
| + pagination_model_.SelectPageRelative(
|
| + event->details().velocity_x() < 0 ? 1 : -1, true);
|
| + }
|
| + event->SetHandled();
|
| + return;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void AppsGridView::OnScrollEvent(ui::ScrollEvent* event) {
|
| + if (event->type() == ui::ET_SCROLL_FLING_CANCEL)
|
| + return;
|
| +
|
| + float offset;
|
| + if (std::abs(event->x_offset()) > std::abs(event->y_offset()))
|
| + offset = event->x_offset();
|
| + else
|
| + offset = event->y_offset();
|
| +
|
| + if (std::abs(offset) > kMinScrollToSwitchPage) {
|
| + if (!pagination_model_.has_transition()) {
|
| + pagination_model_.SelectPageRelative(offset > 0 ? -1 : 1, true);
|
| + }
|
| + event->SetHandled();
|
| + event->StopPropagation();
|
| + }
|
| +}
|
| +
|
| void AppsGridView::Update() {
|
| DCHECK(!selected_view_ && !drag_view_);
|
| view_model_.Clear();
|
|
|