| // 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. |
| |
| #ifndef ASH_APP_LIST_PAGED_VIEW_STRUCTURE_H_ |
| #define ASH_APP_LIST_PAGED_VIEW_STRUCTURE_H_ |
| |
| #include <vector> |
| |
| #include "ash/app_list/app_list_export.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| |
| namespace app_list { |
| |
| class AppsGridView; |
| class AppListItemView; |
| struct GridIndex; |
| |
| // The structure of app list item views in root apps grid view. |
| class APP_LIST_EXPORT PagedViewStructure { |
| public: |
| using Page = std::vector<AppListItemView*>; |
| using Pages = std::vector<Page>; |
| |
| explicit PagedViewStructure(AppsGridView* apps_grid_view); |
| PagedViewStructure(const PagedViewStructure& other); |
| ~PagedViewStructure(); |
| |
| // Loads the view structure based on the position and page position in the |
| // metadata of item views in the view model. |
| void LoadFromMetadata(); |
| |
| // Saves page position change of each item view to metadata of item views |
| // in the view model. |
| void SaveToMetadata(); |
| |
| // Operations allowed to modify the view structure. Populates overflowing item |
| // views to next page if |clear_overflow| is true. Clears empty pages if |
| // |clear_empty_pages| is true. Both are true by default. |
| void Move(AppListItemView* view, |
| const GridIndex& target_index, |
| bool clear_overflow = true, |
| bool clear_empty_pages = true); |
| void Remove(AppListItemView* view, |
| bool clear_overflow = true, |
| bool clear_empty_pages = true); |
| void Add(AppListItemView* view, |
| const GridIndex& target_index, |
| bool clear_overflow = true, |
| bool clear_empty_pages = true); |
| |
| // Convert between the model index and the visual index. The model index |
| // is the index of the item in AppListModel (Also the same index in |
| // AppListItemList). The visual index is the GridIndex struct above with |
| // page/slot info of where to display the item. |
| GridIndex GetIndexFromModelIndex(int model_index) const; |
| int GetModelIndexFromIndex(const GridIndex& index) const; |
| |
| // Returns the last possible visual index to add an item view. |
| GridIndex GetLastTargetIndex() const; |
| |
| // Returns the last possible visual index to add an item view in the specified |
| // page, used only for drag reordering. |
| GridIndex GetLastTargetIndexOfPage(int page_index) const; |
| |
| // Returns the target model index if moving the item view to specified target |
| // visual index. |
| int GetTargetModelIndexForMove(AppListItemView* moved_view, |
| const GridIndex& index) const; |
| |
| // Returns the target item index if moving the item view to specified target |
| // visual index. |
| int GetTargetItemIndexForMove(AppListItemView* moved_view, |
| const GridIndex& index) const; |
| |
| // Returns true if the visual index is valid position to which an item view |
| // can be moved. |
| bool IsValidReorderTargetIndex(const GridIndex& index) const; |
| |
| // Adds a page break at the end of |pages_|. |
| void AppendPage(); |
| |
| // Returns true if the page has no empty slot. |
| bool IsFullPage(int page_index) const; |
| |
| // Returns total number of pages in the view structure. |
| int total_pages() const { return pages_.size(); } |
| |
| // Returns total number of item views in the specified page. |
| int items_on_page(int page_index) const { |
| DCHECK_LT(page_index, total_pages()); |
| return pages_[page_index].size(); |
| } |
| |
| const Pages& pages() const { return pages_; } |
| |
| private: |
| // Skips the item view being dragged if it exists in the specified |
| // |page|. |
| int CalculateTargetSlot(const Page& page) const; |
| |
| // Clear overflowing item views by moving them to the next page. Returns true |
| // if view structure is changed. |
| bool ClearOverflow(); |
| |
| // Removes empty page. Returns true if view structure is changed. |
| bool ClearEmptyPages(); |
| |
| // Represents the item views' locations in each page. |
| Pages pages_; |
| |
| AppsGridView* const apps_grid_view_; // Not owned. |
| }; |
| |
| } // namespace app_list |
| |
| #endif // ASH_APP_LIST_PAGED_VIEW_STRUCTURE_H_ |