Chromium Code Reviews| Index: ui/app_list/views/search_result_tile_item_list_view.cc |
| diff --git a/ui/app_list/views/search_result_tile_item_list_view.cc b/ui/app_list/views/search_result_tile_item_list_view.cc |
| index 446d70041c6298ad5d511d61838ac3ecd9143691..71b6d83912cb146ebea1ff9b38093eacb8e55235 100644 |
| --- a/ui/app_list/views/search_result_tile_item_list_view.cc |
| +++ b/ui/app_list/views/search_result_tile_item_list_view.cc |
| @@ -11,6 +11,7 @@ |
| #include "ui/app_list/app_list_features.h" |
| #include "ui/app_list/app_list_view_delegate.h" |
| #include "ui/app_list/search_result.h" |
| +#include "ui/app_list/views/search_result_separator.h" |
| #include "ui/app_list/views/search_result_tile_item_view.h" |
| #include "ui/gfx/geometry/insets.h" |
| #include "ui/views/background.h" |
| @@ -27,6 +28,7 @@ constexpr int kBetweenTileSpacing = 2; |
| constexpr int kTopBottomPadding = 8; |
| // Layout constants used when fullscreen app list feature is enabled. |
| +constexpr size_t kMaxNumSearchResultTiles = 6; |
| constexpr int kItemListVerticalSpacing = 16; |
| constexpr int kItemListHorizontalSpacing = 12; |
| constexpr int kBetweenItemSpacing = 8; |
| @@ -39,7 +41,8 @@ SearchResultTileItemListView::SearchResultTileItemListView( |
| views::Textfield* search_box, |
| AppListViewDelegate* view_delegate) |
| : search_box_(search_box), |
| - is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()) { |
| + is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()), |
| + view_delegate_(view_delegate) { |
| if (is_fullscreen_app_list_enabled_) { |
| SetLayoutManager(new views::BoxLayout( |
| views::BoxLayout::kHorizontal, |
| @@ -51,16 +54,16 @@ SearchResultTileItemListView::SearchResultTileItemListView( |
| kBetweenTileSpacing)); |
| } |
| - for (size_t i = 0; i < kNumSearchResultTiles; ++i) { |
| - SearchResultTileItemView* tile_item = |
| - new SearchResultTileItemView(this, view_delegate); |
| - tile_item->SetParentBackgroundColor(kCardBackgroundColor); |
| - if (!is_fullscreen_app_list_enabled_) { |
| + if (!is_fullscreen_app_list_enabled_) { |
| + for (size_t i = 0; i < kNumSearchResultTiles; ++i) { |
| + SearchResultTileItemView* tile_item = |
| + new SearchResultTileItemView(this, view_delegate); |
| + tile_item->SetParentBackgroundColor(kCardBackgroundColor); |
| tile_item->SetBorder( |
| views::CreateEmptyBorder(kTopBottomPadding, 0, kTopBottomPadding, 0)); |
| + tile_views_.push_back(tile_item); |
| + AddChildView(tile_item); |
| } |
| - tile_views_.push_back(tile_item); |
| - AddChildView(tile_item); |
| } |
| } |
| @@ -92,11 +95,47 @@ int SearchResultTileItemListView::GetYSize() { |
| int SearchResultTileItemListView::DoUpdate() { |
| std::vector<SearchResult*> display_results = |
| AppListModel::FilterSearchResultsByDisplayType( |
| - results(), SearchResult::DISPLAY_TILE, kNumSearchResultTiles); |
| - for (size_t i = 0; i < kNumSearchResultTiles; ++i) { |
| - SearchResult* item = |
| - i < display_results.size() ? display_results[i] : nullptr; |
| - tile_views_[i]->SetSearchResult(item); |
| + results(), SearchResult::DISPLAY_TILE, |
| + is_fullscreen_app_list_enabled_ ? kMaxNumSearchResultTiles |
| + : kNumSearchResultTiles); |
| + |
| + if (is_fullscreen_app_list_enabled_) { |
| + tile_views_.clear(); |
| + RemoveAllChildViews(true); |
|
xiyuan
2017/06/23 15:43:09
Removing then adding views is heavy and could resu
weidongg
2017/06/23 18:32:20
That's a better idea. Thanks. Done.
|
| + SearchResult::ResultType previous_type = SearchResult::RESULT_UNKNOWN; |
| + |
| + for (size_t i = 0; i < display_results.size() && |
| + tile_views_.size() < kMaxNumSearchResultTiles; |
| + ++i) { |
| + SearchResult* item = display_results[i]; |
| + |
| + if (item->result_type() != SearchResult::RESULT_UNKNOWN) { |
| + SearchResultTileItemView* tile_item = |
| + new SearchResultTileItemView(this, view_delegate_); |
| + tile_item->SetParentBackgroundColor(kCardBackgroundColor); |
| + tile_item->SetSearchResult(item); |
| + |
| + if (item->result_type() != previous_type && |
| + previous_type != SearchResult::RESULT_UNKNOWN) { |
| + // Add a separator to separate search results of different types. |
| + // The strategy here is to only add a separator only if current search |
| + // result type is different from the previous one. The strategy is |
| + // based on the assumption that the search results are already |
| + // separated in groups based on their result types. |
| + AddChildView(new SearchResultSeparator); |
| + } |
| + |
| + tile_views_.push_back(tile_item); |
| + AddChildView(tile_item); |
| + previous_type = item->result_type(); |
| + } |
| + } |
| + } else { |
| + for (size_t i = 0; i < kNumSearchResultTiles; ++i) { |
| + SearchResult* item = |
| + i < display_results.size() ? display_results[i] : nullptr; |
| + tile_views_[i]->SetSearchResult(item); |
| + } |
| } |
| set_container_score( |