Chromium Code Reviews| 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 3266fa409f4cfbc5234aa0fd22452060cb4140e2..ba178cfb7b1201dddefefbc9e6bd91571ff01378 100644 |
| --- a/ui/app_list/views/apps_grid_view.cc |
| +++ b/ui/app_list/views/apps_grid_view.cc |
| @@ -13,6 +13,7 @@ |
| #include "ui/app_list/app_list_folder_item.h" |
| #include "ui/app_list/app_list_item.h" |
| #include "ui/app_list/app_list_switches.h" |
| +#include "ui/app_list/pagination_controller.h" |
| #include "ui/app_list/views/app_list_drag_and_drop_host.h" |
| #include "ui/app_list/views/app_list_folder_view.h" |
| #include "ui/app_list/views/app_list_item_view.h" |
| @@ -23,6 +24,7 @@ |
| #include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/events/event.h" |
| #include "ui/gfx/animation/animation.h" |
| +#include "ui/gfx/geometry/point.h" |
| #include "ui/views/border.h" |
| #include "ui/views/view_model_utils.h" |
| #include "ui/views/widget/widget.h" |
| @@ -92,13 +94,6 @@ 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 |
| // the original position, then the item is moved to just before its target |
| @@ -369,6 +364,13 @@ AppsGridView::AppsGridView(AppsGridViewDelegate* delegate) |
| kOverscrollPageTransitionDurationMs); |
| pagination_model_.AddObserver(this); |
| + // The experimental app list transitions vertically. |
| + PaginationController::ScrollAxis scroll_axis = |
| + app_list::switches::IsExperimentalAppListEnabled() |
| + ? PaginationController::SCROLL_AXIS_VERTICAL |
| + : PaginationController::SCROLL_AXIS_HORIZONTAL; |
| + pagination_controller_.reset( |
| + new PaginationController(&pagination_model_, scroll_axis)); |
| page_switcher_view_ = new PageSwitcher(&pagination_model_); |
| AddChildView(page_switcher_view_); |
| } |
| @@ -961,27 +963,8 @@ bool AppsGridView::OnKeyReleased(const ui::KeyEvent& event) { |
| } |
| bool AppsGridView::OnMouseWheel(const ui::MouseWheelEvent& event) { |
| - int offset; |
| - if (GetScrollAxis() == SCROLL_AXIS_HORIZONTAL) { |
| - // If the view scrolls horizontally, both horizontal and vertical scroll |
| - // events are valid (since most mouse wheels only have vertical scrolling). |
| - if (abs(event.x_offset()) > abs(event.y_offset())) |
| - offset = event.x_offset(); |
| - else |
| - offset = event.y_offset(); |
| - } else { |
| - // If the view scrolls vertically, only vertical scroll events are valid. |
| - 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; |
| + return pagination_controller_->OnScroll( |
| + gfx::Point(event.x_offset(), event.y_offset())); |
| } |
| void AppsGridView::ViewHierarchyChanged( |
| @@ -1003,66 +986,16 @@ void AppsGridView::ViewHierarchyChanged( |
| } |
| void AppsGridView::OnGestureEvent(ui::GestureEvent* event) { |
| - const ui::GestureEventDetails& details = event->details(); |
| - switch (event->type()) { |
| - case ui::ET_GESTURE_SCROLL_BEGIN: |
| - pagination_model_.StartScroll(); |
| - event->SetHandled(); |
| - return; |
| - case ui::ET_GESTURE_SCROLL_UPDATE: { |
| - float scroll = GetScrollAxis() == SCROLL_AXIS_HORIZONTAL |
| - ? details.scroll_x() |
| - : details.scroll_y(); |
| - gfx::Rect bounds(GetContentsBounds()); |
| - int size = GetScrollAxis() == 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 / size); |
| - 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: { |
| - float velocity = GetScrollAxis() == 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); |
| - event->SetHandled(); |
| - return; |
| - } |
| - default: |
| - break; |
| - } |
| + pagination_controller_->OnGestureEvent(event, GetContentsBounds()); |
| } |
| void AppsGridView::OnScrollEvent(ui::ScrollEvent* event) { |
| if (event->type() == ui::ET_SCROLL_FLING_CANCEL) |
| return; |
| - float offset; |
| - if (GetScrollAxis() == SCROLL_AXIS_HORIZONTAL) { |
| - // If the view scrolls horizontally, both horizontal and vertical scroll |
| - // events are valid (vertical scroll events simulate mouse wheel). |
| - if (std::abs(event->x_offset()) > std::abs(event->y_offset())) |
| - offset = event->x_offset(); |
| - else |
| - offset = event->y_offset(); |
| - } else { |
| - // If the view scrolls vertically, only vertical scroll events are valid. |
| - offset = event->y_offset(); |
| - } |
| - |
| - if (std::abs(offset) > kMinScrollToSwitchPage) { |
| - if (!pagination_model_.has_transition()) { |
| - pagination_model_.SelectPageRelative(offset > 0 ? -1 : 1, true); |
| - } |
| + if (pagination_controller_->OnScroll( |
| + gfx::Point(static_cast<int>(event->x_offset()), |
| + static_cast<int>(event->y_offset())))) { |
|
calamity
2014/09/01 01:49:30
Maybe gfx::ToFlooredPoint(gfx::PointF(event->x_off
Matt Giuca
2014/09/01 03:02:26
Done.
|
| event->SetHandled(); |
| event->StopPropagation(); |
| } |
| @@ -1270,7 +1203,8 @@ void AppsGridView::CalculateIdealBounds() { |
| int x_offset = 0; |
| int y_offset = 0; |
| - if (GetScrollAxis() == SCROLL_AXIS_HORIZONTAL) { |
| + if (pagination_controller_->scroll_axis() == |
| + PaginationController::SCROLL_AXIS_HORIZONTAL) { |
| if (view_index.page < current_page) |
| x_offset = -page_width; |
| else if (view_index.page > current_page) |
| @@ -2289,12 +2223,4 @@ void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index, |
| target_view->SetAsAttemptedFolderTarget(is_target_folder); |
| } |
| -// static |
| -AppsGridView::ScrollAxis AppsGridView::GetScrollAxis() { |
| - // The experimental app list transitions vertically. |
| - return app_list::switches::IsExperimentalAppListEnabled() |
| - ? SCROLL_AXIS_VERTICAL |
| - : SCROLL_AXIS_HORIZONTAL; |
| -} |
| - |
| } // namespace app_list |