| Index: ui/app_list/pagination_controller.cc
|
| diff --git a/ui/app_list/pagination_controller.cc b/ui/app_list/pagination_controller.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d9aabc236aff0499d33ebf5ad1200cca6762ee60
|
| --- /dev/null
|
| +++ b/ui/app_list/pagination_controller.cc
|
| @@ -0,0 +1,88 @@
|
| +// Copyright 2014 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 "ui/app_list/pagination_controller.h"
|
| +
|
| +#include "ui/app_list/pagination_model.h"
|
| +#include "ui/events/event.h"
|
| +#include "ui/gfx/geometry/rect.h"
|
| +#include "ui/gfx/geometry/vector2d.h"
|
| +
|
| +namespace app_list {
|
| +
|
| +namespace {
|
| +
|
| +// Constants for dealing with scroll events.
|
| +const int kMinScrollToSwitchPage = 20;
|
| +const int kMinHorizVelocityToSwitchPage = 800;
|
| +
|
| +const double kFinishTransitionThreshold = 0.33;
|
| +
|
| +} // namespace
|
| +
|
| +PaginationController::PaginationController(PaginationModel* model,
|
| + ScrollAxis scroll_axis)
|
| + : pagination_model_(model), scroll_axis_(scroll_axis) {
|
| +}
|
| +
|
| +bool PaginationController::OnScroll(const gfx::Vector2d& offset) {
|
| + int offset_magnitude;
|
| + if (scroll_axis_ == SCROLL_AXIS_HORIZONTAL) {
|
| + // If the view scrolls horizontally, both horizontal and vertical scroll
|
| + // events are valid (since most mouse wheels only have vertical scrolling).
|
| + offset_magnitude =
|
| + abs(offset.x()) > abs(offset.y()) ? offset.x() : offset.y();
|
| + } else {
|
| + // If the view scrolls vertically, only vertical scroll events are valid.
|
| + offset_magnitude = offset.y();
|
| + }
|
| +
|
| + if (abs(offset_magnitude) > kMinScrollToSwitchPage) {
|
| + if (!pagination_model_->has_transition()) {
|
| + pagination_model_->SelectPageRelative(offset_magnitude > 0 ? -1 : 1,
|
| + true);
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +bool PaginationController::OnGestureEvent(const ui::GestureEvent& event,
|
| + const gfx::Rect& bounds) {
|
| + const ui::GestureEventDetails& details = event.details();
|
| + switch (event.type()) {
|
| + case ui::ET_GESTURE_SCROLL_BEGIN:
|
| + pagination_model_->StartScroll();
|
| + return true;
|
| + case ui::ET_GESTURE_SCROLL_UPDATE: {
|
| + float scroll = scroll_axis_ == SCROLL_AXIS_HORIZONTAL
|
| + ? details.scroll_x()
|
| + : details.scroll_y();
|
| + int width = scroll_axis_ == SCROLL_AXIS_HORIZONTAL ? bounds.width()
|
| + : bounds.height();
|
| + // scroll > 0 means moving contents right or down. That is, transitioning
|
| + // to the previous page.
|
| + pagination_model_->UpdateScroll(scroll / width);
|
| + return true;
|
| + }
|
| + case ui::ET_GESTURE_SCROLL_END:
|
| + pagination_model_->EndScroll(pagination_model_->transition().progress <
|
| + kFinishTransitionThreshold);
|
| + return true;
|
| + case ui::ET_SCROLL_FLING_START: {
|
| + float velocity = scroll_axis_ == SCROLL_AXIS_HORIZONTAL
|
| + ? details.velocity_x()
|
| + : details.velocity_y();
|
| + pagination_model_->EndScroll(true);
|
| + if (fabs(velocity) > kMinHorizVelocityToSwitchPage)
|
| + pagination_model_->SelectPageRelative(velocity < 0 ? 1 : -1, true);
|
| + return true;
|
| + }
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| +} // namespace app_list
|
|
|