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 6ad52a5bb461ed7f6e7cf1d180dbc83702e98b62..c9f3b7ad3f2fd2da77d54b263eefe42caeb5aee6 100644 |
| --- a/ui/app_list/views/apps_grid_view.cc |
| +++ b/ui/app_list/views/apps_grid_view.cc |
| @@ -897,29 +897,34 @@ int AppsGridView::OnDragUpdated(const ui::DropTargetEvent& event) { |
| } |
| 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: |
| - // 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()); |
| + case ui::ET_GESTURE_SCROLL_UPDATE: { |
| + float scroll = GetScrollAxis() == SCROLL_AXIS_VERTICAL |
| + ? details.scroll_y() |
| + : details.scroll_x(); |
| + // scroll > 0 means moving contents right or down. That is, transitioning |
| + // to the previous page. |
| + pagination_model_.UpdateScroll(scroll / 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: { |
| + float velocity = GetScrollAxis() == SCROLL_AXIS_VERTICAL |
| + ? details.velocity_y() |
| + : details.velocity_x(); |
| pagination_model_.EndScroll(true); |
| - if (fabs(event->details().velocity_x()) > kMinHorizVelocityToSwitchPage) { |
| - pagination_model_.SelectPageRelative( |
| - event->details().velocity_x() < 0 ? 1 : -1, true); |
| - } |
| + if (fabs(velocity) > kMinHorizVelocityToSwitchPage) |
| + pagination_model_.SelectPageRelative(velocity < 0 ? 1 : -1, true); |
| event->SetHandled(); |
| return; |
| } |
| @@ -933,10 +938,17 @@ void AppsGridView::OnScrollEvent(ui::ScrollEvent* event) { |
| return; |
| float offset; |
| - if (std::abs(event->x_offset()) > std::abs(event->y_offset())) |
| - offset = event->x_offset(); |
| - else |
| + if (GetScrollAxis() == SCROLL_AXIS_HORIZONTAL) { |
|
Matt Giuca
2014/08/28 03:40:54
Obviously this can be simplified to y_offset is on
|
| + // 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()) { |
| @@ -1208,9 +1220,10 @@ void AppsGridView::CalculateIdealBounds() { |
| tile_size.height() * rows_per_page_)); |
| grid_rect.Intersect(rect); |
| - // Page width including padding pixels. A tile.x + page_width means the same |
| - // tile slot in the next page. |
| + // Page size including padding pixels. A tile.x + page_width means the same |
| + // tile slot in the next page; similarly for tile.y + page_height. |
| const int page_width = grid_rect.width() + kPagePadding; |
| + const int page_height = grid_rect.height() + kPagePadding; |
| // If there is a transition, calculates offset for current and target page. |
| const int current_page = pagination_model_.selected_page(); |
| @@ -1218,10 +1231,8 @@ void AppsGridView::CalculateIdealBounds() { |
| pagination_model_.transition(); |
| const bool is_valid = pagination_model_.is_valid_page(transition.target_page); |
| - // Transition to right means negative offset. |
| + // Transition to previous page means negative offset. |
| const int dir = transition.target_page > current_page ? -1 : 1; |
| - const int transition_offset = is_valid ? |
| - transition.progress * page_width * dir : 0; |
| const int total_views = |
| view_model_.view_size() + pulsing_blocks_model_.view_size(); |
| @@ -1245,17 +1256,33 @@ void AppsGridView::CalculateIdealBounds() { |
| } |
| } |
| - // Decides an x_offset for current item. |
| + // Decide the x or y offset for current item. |
| int x_offset = 0; |
| - if (view_index.page < current_page) |
| - x_offset = -page_width; |
| - else if (view_index.page > current_page) |
| - x_offset = page_width; |
| - |
| - if (is_valid) { |
| - if (view_index.page == current_page || |
| - view_index.page == transition.target_page) { |
| - x_offset += transition_offset; |
| + int y_offset = 0; |
| + |
| + if (GetScrollAxis() == SCROLL_AXIS_VERTICAL) { |
| + if (view_index.page < current_page) |
| + y_offset = -page_height; |
| + else if (view_index.page > current_page) |
| + y_offset = page_height; |
| + |
| + if (is_valid) { |
| + if (view_index.page == current_page || |
| + view_index.page == transition.target_page) { |
| + y_offset += transition.progress * page_height * dir; |
| + } |
| + } |
| + } else { |
| + if (view_index.page < current_page) |
| + x_offset = -page_width; |
| + else if (view_index.page > current_page) |
| + x_offset = page_width; |
| + |
| + if (is_valid) { |
| + if (view_index.page == current_page || |
| + view_index.page == transition.target_page) { |
| + x_offset += transition.progress * page_width * dir; |
| + } |
| } |
| } |
| @@ -1263,7 +1290,7 @@ void AppsGridView::CalculateIdealBounds() { |
| const int col = view_index.slot % cols_; |
| gfx::Rect tile_slot( |
| gfx::Point(grid_rect.x() + col * tile_size.width() + x_offset, |
| - grid_rect.y() + row * tile_size.height()), |
| + grid_rect.y() + row * tile_size.height() + y_offset), |
| tile_size); |
| if (i < view_model_.view_size()) { |
| view_model_.set_ideal_bounds(i, tile_slot); |
| @@ -2252,4 +2279,12 @@ 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 |