Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: ui/app_list/views/start_page_view.cc

Issue 896063002: App list start page is no longer a SearchResultContainerView. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@doodle_static
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/app_list/views/start_page_view.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/app_list/views/start_page_view.h" 5 #include "ui/app_list/views/start_page_view.h"
6 6
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "ui/app_list/app_list_constants.h" 8 #include "ui/app_list/app_list_constants.h"
9 #include "ui/app_list/app_list_item.h" 9 #include "ui/app_list/app_list_item.h"
10 #include "ui/app_list/app_list_model.h" 10 #include "ui/app_list/app_list_model.h"
11 #include "ui/app_list/app_list_view_delegate.h" 11 #include "ui/app_list/app_list_view_delegate.h"
12 #include "ui/app_list/search_result.h" 12 #include "ui/app_list/search_result.h"
13 #include "ui/app_list/views/all_apps_tile_item_view.h" 13 #include "ui/app_list/views/all_apps_tile_item_view.h"
14 #include "ui/app_list/views/app_list_main_view.h" 14 #include "ui/app_list/views/app_list_main_view.h"
15 #include "ui/app_list/views/contents_view.h" 15 #include "ui/app_list/views/contents_view.h"
16 #include "ui/app_list/views/search_box_view.h" 16 #include "ui/app_list/views/search_box_view.h"
17 #include "ui/app_list/views/search_result_list_view.h" 17 #include "ui/app_list/views/search_result_container_view.h"
18 #include "ui/app_list/views/search_result_tile_item_view.h" 18 #include "ui/app_list/views/search_result_tile_item_view.h"
19 #include "ui/app_list/views/tile_item_view.h" 19 #include "ui/app_list/views/tile_item_view.h"
20 #include "ui/gfx/canvas.h" 20 #include "ui/gfx/canvas.h"
21 #include "ui/views/background.h" 21 #include "ui/views/background.h"
22 #include "ui/views/controls/image_view.h" 22 #include "ui/views/controls/image_view.h"
23 #include "ui/views/controls/label.h" 23 #include "ui/views/controls/label.h"
24 #include "ui/views/controls/textfield/textfield.h" 24 #include "ui/views/controls/textfield/textfield.h"
25 #include "ui/views/layout/box_layout.h" 25 #include "ui/views/layout/box_layout.h"
26 #include "ui/views/widget/widget.h" 26 #include "ui/views/widget/widget.h"
27 27
(...skipping 28 matching lines...) Expand all
56 gfx::Size GetPreferredSize() const override { return size_; } 56 gfx::Size GetPreferredSize() const override { return size_; }
57 57
58 private: 58 private:
59 gfx::Size size_; 59 gfx::Size size_;
60 60
61 DISALLOW_COPY_AND_ASSIGN(SearchBoxSpacerView); 61 DISALLOW_COPY_AND_ASSIGN(SearchBoxSpacerView);
62 }; 62 };
63 63
64 } // namespace 64 } // namespace
65 65
66 class StartPageTilesContainer : public SearchResultContainerView {
Matt Giuca 2015/02/04 06:07:45 I think this can go inside the namespace.
calamity 2015/02/04 06:46:55 Nope. Moved it into SPV's private instead.
67 public:
68 explicit StartPageTilesContainer(AllAppsTileItemView* all_apps_button)
69 : all_apps_button_(all_apps_button) {
Matt Giuca 2015/02/04 06:07:45 I'm not a fan of inline methods (inside the class
calamity 2015/02/04 06:46:54 Done.
70 views::BoxLayout* tiles_layout_manager =
71 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, kTileSpacing);
72 tiles_layout_manager->set_main_axis_alignment(
73 views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
74 SetLayoutManager(tiles_layout_manager);
75 set_background(
76 views::Background::CreateSolidBackground(kLabelBackgroundColor));
77
78 // Add SearchResultTileItemViews to the container.
79 for (size_t i = 0; i < kNumStartPageTiles; ++i) {
80 SearchResultTileItemView* tile_item = new SearchResultTileItemView();
81 AddChildView(tile_item);
82 tile_item->SetParentBackgroundColor(kLabelBackgroundColor);
83 search_result_tile_views_.push_back(tile_item);
84 }
85
86 // Also add a special "all apps" button to the end of the container.
87 all_apps_button_->UpdateIcon();
88 all_apps_button_->SetParentBackgroundColor(kLabelBackgroundColor);
89 AddChildView(all_apps_button_);
90 }
91 ~StartPageTilesContainer() override {}
92
93 TileItemView* GetTileItemView(size_t index) {
94 DCHECK_GT(kNumStartPageTiles + 1, index);
95 if (index == kNumStartPageTiles)
96 return all_apps_button_;
97
98 return search_result_tile_views_[index];
99 }
100
101 const std::vector<SearchResultTileItemView*>& tile_views() const {
102 return search_result_tile_views_;
103 }
104
105 AllAppsTileItemView* all_apps_button() { return all_apps_button_; }
106
107 // Overridden from SearchResultContainerView:
108 int Update() override {
109 std::vector<SearchResult*> display_results =
110 AppListModel::FilterSearchResultsByDisplayType(
111 results(), SearchResult::DISPLAY_RECOMMENDATION,
112 kNumStartPageTiles);
113
114 // Update the tile item results.
115 for (size_t i = 0; i < search_result_tile_views_.size(); ++i) {
116 SearchResult* item = NULL;
Matt Giuca 2015/02/04 06:07:45 nullptr
calamity 2015/02/04 06:46:55 Done.
117 if (i < display_results.size())
118 item = display_results[i];
119 search_result_tile_views_[i]->SetSearchResult(item);
120 }
121
122 Layout();
123 parent()->Layout();
124 // Add 1 to the results size to account for the all apps button.
125 return display_results.size() + 1;
126 }
127
128 void UpdateSelectedIndex(int old_selected, int new_selected) override {
129 if (old_selected >= 0)
130 GetTileItemView(old_selected)->SetSelected(false);
131
132 if (new_selected >= 0)
133 GetTileItemView(new_selected)->SetSelected(true);
134 }
135
136 void OnContainerSelected(bool from_bottom) override {}
137
138 private:
139 std::vector<SearchResultTileItemView*> search_result_tile_views_;
140 AllAppsTileItemView* all_apps_button_;
141
142 DISALLOW_COPY_AND_ASSIGN(StartPageTilesContainer);
143 };
144
66 StartPageView::StartPageView(AppListMainView* app_list_main_view, 145 StartPageView::StartPageView(AppListMainView* app_list_main_view,
67 AppListViewDelegate* view_delegate) 146 AppListViewDelegate* view_delegate)
68 : app_list_main_view_(app_list_main_view), 147 : app_list_main_view_(app_list_main_view),
69 view_delegate_(view_delegate), 148 view_delegate_(view_delegate),
70 search_box_spacer_view_(new SearchBoxSpacerView( 149 search_box_spacer_view_(new SearchBoxSpacerView(
71 app_list_main_view->search_box_view()->GetPreferredSize())), 150 app_list_main_view->search_box_view()->GetPreferredSize())),
72 instant_container_(new views::View), 151 instant_container_(new views::View),
73 tiles_container_(new views::View) { 152 tiles_container_(nullptr) {
Matt Giuca 2015/02/04 06:07:45 Any reason you can't do new StartPageTilesContaine
calamity 2015/02/04 06:46:54 It's BIG. Done.
74 // The view containing the start page WebContents and SearchBoxSpacerView. 153 // The view containing the start page WebContents and SearchBoxSpacerView.
75 InitInstantContainer(); 154 InitInstantContainer();
76 AddChildView(instant_container_); 155 AddChildView(instant_container_);
77 156
78 // The view containing the start page tiles. 157 // The view containing the start page tiles.
79 InitTilesContainer(); 158 tiles_container_ = new StartPageTilesContainer(new AllAppsTileItemView(
159 app_list_main_view_->contents_view(),
160 view_delegate_->GetModel()->top_level_item_list()));
80 AddChildView(tiles_container_); 161 AddChildView(tiles_container_);
81 162
82 SetResults(view_delegate_->GetModel()->results()); 163 tiles_container_->SetResults(view_delegate_->GetModel()->results());
83 Reset(); 164 Reset();
84 } 165 }
85 166
86 StartPageView::~StartPageView() { 167 StartPageView::~StartPageView() {
87 } 168 }
88 169
89 void StartPageView::InitInstantContainer() { 170 void StartPageView::InitInstantContainer() {
90 views::BoxLayout* instant_layout_manager = new views::BoxLayout( 171 views::BoxLayout* instant_layout_manager = new views::BoxLayout(
91 views::BoxLayout::kVertical, 0, 0, kInstantContainerSpacing); 172 views::BoxLayout::kVertical, 0, 0, kInstantContainerSpacing);
92 instant_layout_manager->set_inside_border_insets( 173 instant_layout_manager->set_inside_border_insets(
93 gfx::Insets(0, 0, kSearchBoxAndTilesSpacing, 0)); 174 gfx::Insets(0, 0, kSearchBoxAndTilesSpacing, 0));
94 instant_layout_manager->set_main_axis_alignment( 175 instant_layout_manager->set_main_axis_alignment(
95 views::BoxLayout::MAIN_AXIS_ALIGNMENT_END); 176 views::BoxLayout::MAIN_AXIS_ALIGNMENT_END);
96 instant_layout_manager->set_cross_axis_alignment( 177 instant_layout_manager->set_cross_axis_alignment(
97 views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); 178 views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
98 instant_container_->SetLayoutManager(instant_layout_manager); 179 instant_container_->SetLayoutManager(instant_layout_manager);
99 180
100 views::View* web_view = view_delegate_->CreateStartPageWebView( 181 views::View* web_view = view_delegate_->CreateStartPageWebView(
101 gfx::Size(kWebViewWidth, kWebViewHeight)); 182 gfx::Size(kWebViewWidth, kWebViewHeight));
102 if (web_view) { 183 if (web_view) {
103 web_view->SetFocusable(false); 184 web_view->SetFocusable(false);
104 instant_container_->AddChildView(web_view); 185 instant_container_->AddChildView(web_view);
105 } 186 }
106 187
107 instant_container_->AddChildView(search_box_spacer_view_); 188 instant_container_->AddChildView(search_box_spacer_view_);
108 } 189 }
109 190
110 void StartPageView::InitTilesContainer() {
111 views::BoxLayout* tiles_layout_manager =
112 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, kTileSpacing);
113 tiles_layout_manager->set_main_axis_alignment(
114 views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
115 tiles_container_->SetLayoutManager(tiles_layout_manager);
116 tiles_container_->set_background(
117 views::Background::CreateSolidBackground(kLabelBackgroundColor));
118
119 // Add SearchResultTileItemViews to the container.
120 for (size_t i = 0; i < kNumStartPageTiles; ++i) {
121 SearchResultTileItemView* tile_item = new SearchResultTileItemView();
122 tiles_container_->AddChildView(tile_item);
123 tile_item->SetParentBackgroundColor(kLabelBackgroundColor);
124 search_result_tile_views_.push_back(tile_item);
125 }
126
127 // Also add a special "all apps" button to the end of the container.
128 all_apps_button_ = new AllAppsTileItemView(
129 app_list_main_view_->contents_view(),
130 view_delegate_->GetModel()->top_level_item_list());
131 all_apps_button_->UpdateIcon();
132 all_apps_button_->SetParentBackgroundColor(kLabelBackgroundColor);
133 tiles_container_->AddChildView(all_apps_button_);
134 }
135
136 void StartPageView::Reset() { 191 void StartPageView::Reset() {
137 Update(); 192 tiles_container_->Update();
138 } 193 }
139 194
140 void StartPageView::UpdateForTesting() { 195 void StartPageView::UpdateForTesting() {
141 Update(); 196 tiles_container_->Update();
197 }
198
199 const std::vector<SearchResultTileItemView*>& StartPageView::tile_views()
200 const {
201 return tiles_container_->tile_views();
142 } 202 }
143 203
144 TileItemView* StartPageView::all_apps_button() const { 204 TileItemView* StartPageView::all_apps_button() const {
145 return all_apps_button_; 205 return tiles_container_->all_apps_button();
146 } 206 }
147 207
148 void StartPageView::OnShow() { 208 void StartPageView::OnShow() {
149 DCHECK(app_list_main_view_->contents_view()->ShouldShowCustomPageClickzone()); 209 DCHECK(app_list_main_view_->contents_view()->ShouldShowCustomPageClickzone());
150 UpdateCustomPageClickzoneVisibility(); 210 UpdateCustomPageClickzoneVisibility();
151 ClearSelectedIndex(); 211 tiles_container_->ClearSelectedIndex();
152 } 212 }
153 213
154 void StartPageView::OnHide() { 214 void StartPageView::OnHide() {
155 DCHECK( 215 DCHECK(
156 !app_list_main_view_->contents_view()->ShouldShowCustomPageClickzone()); 216 !app_list_main_view_->contents_view()->ShouldShowCustomPageClickzone());
157 UpdateCustomPageClickzoneVisibility(); 217 UpdateCustomPageClickzoneVisibility();
158 } 218 }
159 219
160 void StartPageView::Layout() { 220 void StartPageView::Layout() {
161 gfx::Rect bounds(GetContentsBounds()); 221 gfx::Rect bounds(GetContentsBounds());
162 bounds.set_height(instant_container_->GetHeightForWidth(bounds.width())); 222 bounds.set_height(instant_container_->GetHeightForWidth(bounds.width()));
163 instant_container_->SetBoundsRect(bounds); 223 instant_container_->SetBoundsRect(bounds);
164 224
165 // Tiles begin where the instant container ends. 225 // Tiles begin where the instant container ends.
166 bounds.set_y(bounds.bottom()); 226 bounds.set_y(bounds.bottom());
167 bounds.set_height(tiles_container_->GetHeightForWidth(bounds.width())); 227 bounds.set_height(tiles_container_->GetHeightForWidth(bounds.width()));
168 tiles_container_->SetBoundsRect(bounds); 228 tiles_container_->SetBoundsRect(bounds);
169 } 229 }
170 230
171 bool StartPageView::OnKeyPressed(const ui::KeyEvent& event) { 231 bool StartPageView::OnKeyPressed(const ui::KeyEvent& event) {
172 if (selected_index() >= 0 && 232 int selected_index = tiles_container_->selected_index();
173 tiles_container_->child_at(selected_index())->OnKeyPressed(event)) 233 if (selected_index >= 0 &&
234 tiles_container_->child_at(selected_index)->OnKeyPressed(event))
174 return true; 235 return true;
175 236
176 int dir = 0; 237 int dir = 0;
177 switch (event.key_code()) { 238 switch (event.key_code()) {
178 case ui::VKEY_LEFT: 239 case ui::VKEY_LEFT:
179 dir = -1; 240 dir = -1;
180 break; 241 break;
181 case ui::VKEY_RIGHT: 242 case ui::VKEY_RIGHT:
182 dir = 1; 243 dir = 1;
183 break; 244 break;
184 case ui::VKEY_DOWN: 245 case ui::VKEY_DOWN:
185 // Down selects the first tile if nothing is selected. 246 // Down selects the first tile if nothing is selected.
186 if (!IsValidSelectionIndex(selected_index())) 247 if (!tiles_container_->IsValidSelectionIndex(selected_index))
187 dir = 1; 248 dir = 1;
188 break; 249 break;
189 case ui::VKEY_TAB: 250 case ui::VKEY_TAB:
190 dir = event.IsShiftDown() ? -1 : 1; 251 dir = event.IsShiftDown() ? -1 : 1;
191 break; 252 break;
192 default: 253 default:
193 break; 254 break;
194 } 255 }
195 256
196 if (dir == 0) 257 if (dir == 0)
197 return false; 258 return false;
198 259
199 if (!IsValidSelectionIndex(selected_index())) { 260 if (!tiles_container_->IsValidSelectionIndex(selected_index)) {
200 SetSelectedIndex(dir == -1 ? num_results() - 1 : 0); 261 tiles_container_->SetSelectedIndex(
262 dir == -1 ? tiles_container_->num_results() - 1 : 0);
201 return true; 263 return true;
202 } 264 }
203 265
204 int selection_index = selected_index() + dir; 266 int selection_index = selected_index + dir;
205 if (IsValidSelectionIndex(selection_index)) { 267 if (tiles_container_->IsValidSelectionIndex(selection_index)) {
206 SetSelectedIndex(selection_index); 268 tiles_container_->SetSelectedIndex(selection_index);
207 return true; 269 return true;
208 } 270 }
209 271
210 return false; 272 return false;
211 } 273 }
212 274
213 void StartPageView::OnContainerSelected(bool from_bottom) {
214 }
215
216 gfx::Rect StartPageView::GetSearchBoxBounds() const { 275 gfx::Rect StartPageView::GetSearchBoxBounds() const {
217 return search_box_spacer_view_->bounds(); 276 return search_box_spacer_view_->bounds();
218 } 277 }
219 278
220 void StartPageView::UpdateCustomPageClickzoneVisibility() { 279 void StartPageView::UpdateCustomPageClickzoneVisibility() {
221 // This can get called before InitWidgets(), so we cannot guarantee that 280 // This can get called before InitWidgets(), so we cannot guarantee that
222 // custom_page_clickzone_ will not be null. 281 // custom_page_clickzone_ will not be null.
223 views::Widget* custom_page_clickzone = 282 views::Widget* custom_page_clickzone =
224 app_list_main_view_->GetCustomPageClickzone(); 283 app_list_main_view_->GetCustomPageClickzone();
225 if (!custom_page_clickzone) 284 if (!custom_page_clickzone)
226 return; 285 return;
227 286
228 if (app_list_main_view_->contents_view()->ShouldShowCustomPageClickzone()) { 287 if (app_list_main_view_->contents_view()->ShouldShowCustomPageClickzone()) {
229 custom_page_clickzone->ShowInactive(); 288 custom_page_clickzone->ShowInactive();
230 return; 289 return;
231 } 290 }
232 291
233 custom_page_clickzone->Hide(); 292 custom_page_clickzone->Hide();
234 } 293 }
235 294
236 int StartPageView::Update() {
237 std::vector<SearchResult*> display_results =
238 AppListModel::FilterSearchResultsByDisplayType(
239 results(), SearchResult::DISPLAY_RECOMMENDATION, kNumStartPageTiles);
240
241 // Update the tile item results.
242 for (size_t i = 0; i < search_result_tile_views_.size(); ++i) {
243 SearchResult* item = NULL;
244 if (i < display_results.size())
245 item = display_results[i];
246 search_result_tile_views_[i]->SetSearchResult(item);
247 }
248
249 tiles_container_->Layout();
250 Layout();
251 // Add 1 to the results size to account for the all apps button.
252 return display_results.size() + 1;
253 }
254
255 void StartPageView::UpdateSelectedIndex(int old_selected, int new_selected) {
256 if (old_selected >= 0)
257 GetTileItemView(old_selected)->SetSelected(false);
258
259 if (new_selected >= 0)
260 GetTileItemView(new_selected)->SetSelected(true);
261 }
262
263 TileItemView* StartPageView::GetTileItemView(size_t index) { 295 TileItemView* StartPageView::GetTileItemView(size_t index) {
264 DCHECK_GT(kNumStartPageTiles + 1, index); 296 return tiles_container_->GetTileItemView(index);
265 if (index == kNumStartPageTiles)
266 return all_apps_button_;
267
268 return search_result_tile_views_[index];
269 } 297 }
270 298
271 } // namespace app_list 299 } // namespace app_list
OLDNEW
« no previous file with comments | « ui/app_list/views/start_page_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698