| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/app_list_model_view.h" | 5 #include "ui/app_list/apps_grid_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "ui/app_list/app_list_item_view.h" | 9 #include "ui/app_list/app_list_item_view.h" |
| 10 #include "ui/app_list/app_list_model.h" | |
| 11 #include "ui/app_list/pagination_model.h" | 10 #include "ui/app_list/pagination_model.h" |
| 11 #include "ui/app_list/view_ids.h" |
| 12 #include "ui/views/border.h" | 12 #include "ui/views/border.h" |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 // Padding space in pixels for fixed layout. | 16 // Padding space in pixels for fixed layout. |
| 17 const int kTopLeftRightPadding = 15; | 17 const int kTopLeftRightPadding = 15; |
| 18 const int kBottomPadding = 30; | 18 const int kBottomPadding = 30; |
| 19 | 19 |
| 20 // Preferred tile size when showing in fixed layout. | 20 // Preferred tile size when showing in fixed layout. |
| 21 const int kPreferredTileWidth = 80; | 21 const int kPreferredTileWidth = 80; |
| 22 const int kPreferredTileHeight = 88; | 22 const int kPreferredTileHeight = 88; |
| 23 | 23 |
| 24 } // namespace | 24 } // namespace |
| 25 | 25 |
| 26 namespace app_list { | 26 namespace app_list { |
| 27 | 27 |
| 28 AppListModelView::AppListModelView(views::ButtonListener* listener, | 28 AppsGridView::AppsGridView(views::ButtonListener* listener, |
| 29 PaginationModel* pagination_model) | 29 PaginationModel* pagination_model) |
| 30 : model_(NULL), | 30 : model_(NULL), |
| 31 listener_(listener), | 31 listener_(listener), |
| 32 pagination_model_(pagination_model), | 32 pagination_model_(pagination_model), |
| 33 fixed_layout_(false), | 33 fixed_layout_(false), |
| 34 cols_(0), | 34 cols_(0), |
| 35 rows_per_page_(0), | 35 rows_per_page_(0), |
| 36 selected_item_index_(-1) { | 36 selected_item_index_(-1) { |
| 37 set_id(VIEW_ID_APPS_GRID); |
| 37 set_focusable(true); | 38 set_focusable(true); |
| 38 pagination_model_->AddObserver(this); | 39 pagination_model_->AddObserver(this); |
| 39 } | 40 } |
| 40 | 41 |
| 41 AppListModelView::~AppListModelView() { | 42 AppsGridView::~AppsGridView() { |
| 42 if (model_) | 43 if (model_) |
| 43 model_->RemoveObserver(this); | 44 model_->RemoveObserver(this); |
| 44 pagination_model_->RemoveObserver(this); | 45 pagination_model_->RemoveObserver(this); |
| 45 } | 46 } |
| 46 | 47 |
| 47 void AppListModelView::CalculateLayout(const gfx::Size& content_size, | 48 void AppsGridView::CalculateLayout(const gfx::Size& content_size, |
| 48 int num_of_tiles, | 49 int num_of_tiles, |
| 49 gfx::Size* icon_size, | 50 gfx::Size* icon_size, |
| 50 int* rows, | 51 int* rows, |
| 51 int* cols) { | 52 int* cols) { |
| 52 DCHECK(!content_size.IsEmpty() && num_of_tiles); | 53 DCHECK(!content_size.IsEmpty() && num_of_tiles); |
| 53 | 54 |
| 54 // Icon sizes to try. | 55 // Icon sizes to try. |
| 55 const int kIconSizes[] = { 128, 96, 64, 48, 32 }; | 56 const int kIconSizes[] = { 128, 96, 64, 48, 32 }; |
| 56 | 57 |
| 57 double aspect = static_cast<double>(content_size.width()) / | 58 double aspect = static_cast<double>(content_size.width()) / |
| (...skipping 30 matching lines...) Expand all Loading... |
| 88 | 89 |
| 89 DCHECK((*rows) * (*cols) >= num_of_tiles); | 90 DCHECK((*rows) * (*cols) >= num_of_tiles); |
| 90 return; | 91 return; |
| 91 } | 92 } |
| 92 | 93 |
| 93 // No icon size that could fit all tiles. | 94 // No icon size that could fit all tiles. |
| 94 *cols = std::max(content_size.width() / tile_size.width(), 1); | 95 *cols = std::max(content_size.width() / tile_size.width(), 1); |
| 95 *rows = (num_of_tiles - 1) / (*cols) + 1; | 96 *rows = (num_of_tiles - 1) / (*cols) + 1; |
| 96 } | 97 } |
| 97 | 98 |
| 98 void AppListModelView::SetLayout(int icon_size, int cols, int rows_per_page) { | 99 void AppsGridView::SetLayout(int icon_size, int cols, int rows_per_page) { |
| 99 fixed_layout_ = true; | 100 fixed_layout_ = true; |
| 100 | 101 |
| 101 icon_size_.SetSize(icon_size, icon_size); | 102 icon_size_.SetSize(icon_size, icon_size); |
| 102 cols_ = cols; | 103 cols_ = cols; |
| 103 rows_per_page_ = rows_per_page; | 104 rows_per_page_ = rows_per_page; |
| 104 | 105 |
| 105 set_border(views::Border::CreateEmptyBorder(kTopLeftRightPadding, | 106 set_border(views::Border::CreateEmptyBorder(kTopLeftRightPadding, |
| 106 kTopLeftRightPadding, | 107 kTopLeftRightPadding, |
| 107 kBottomPadding, | 108 kBottomPadding, |
| 108 kTopLeftRightPadding)); | 109 kTopLeftRightPadding)); |
| 109 } | 110 } |
| 110 | 111 |
| 111 void AppListModelView::SetModel(AppListModel* model) { | 112 void AppsGridView::SetModel(AppListModel::Apps* model) { |
| 112 if (model_) | 113 if (model_) |
| 113 model_->RemoveObserver(this); | 114 model_->RemoveObserver(this); |
| 114 | 115 |
| 115 model_ = model; | 116 model_ = model; |
| 116 if (model_) | 117 if (model_) |
| 117 model_->AddObserver(this); | 118 model_->AddObserver(this); |
| 118 Update(); | 119 Update(); |
| 119 } | 120 } |
| 120 | 121 |
| 121 void AppListModelView::SetSelectedItem(AppListItemView* item) { | 122 void AppsGridView::SetSelectedItem(AppListItemView* item) { |
| 122 int index = GetIndexOf(item); | 123 int index = GetIndexOf(item); |
| 123 if (index >= 0) | 124 if (index >= 0) |
| 124 SetSelectedItemByIndex(index); | 125 SetSelectedItemByIndex(index); |
| 125 } | 126 } |
| 126 | 127 |
| 127 void AppListModelView::ClearSelectedItem(AppListItemView* item) { | 128 void AppsGridView::ClearSelectedItem(AppListItemView* item) { |
| 128 int index = GetIndexOf(item); | 129 int index = GetIndexOf(item); |
| 129 if (index == selected_item_index_) | 130 if (index == selected_item_index_) |
| 130 SetSelectedItemByIndex(-1); | 131 SetSelectedItemByIndex(-1); |
| 131 } | 132 } |
| 132 | 133 |
| 133 void AppListModelView::Update() { | 134 void AppsGridView::Update() { |
| 134 selected_item_index_ = -1; | 135 selected_item_index_ = -1; |
| 135 RemoveAllChildViews(true); | 136 RemoveAllChildViews(true); |
| 136 if (!model_ || model_->item_count() == 0) | 137 if (!model_ || model_->item_count() == 0) |
| 137 return; | 138 return; |
| 138 | 139 |
| 139 for (size_t i = 0; i < model_->item_count(); ++i) | 140 for (size_t i = 0; i < model_->item_count(); ++i) |
| 140 AddChildView(new AppListItemView(this, model_->GetItemAt(i), listener_)); | 141 AddChildView(new AppListItemView(this, model_->GetItemAt(i), listener_)); |
| 141 | 142 |
| 142 Layout(); | 143 Layout(); |
| 143 SchedulePaint(); | 144 SchedulePaint(); |
| 144 } | 145 } |
| 145 | 146 |
| 146 AppListItemView* AppListModelView::GetItemViewAtIndex(int index) { | 147 AppListItemView* AppsGridView::GetItemViewAtIndex(int index) { |
| 147 return static_cast<AppListItemView*>(child_at(index)); | 148 return static_cast<AppListItemView*>(child_at(index)); |
| 148 } | 149 } |
| 149 | 150 |
| 150 void AppListModelView::SetSelectedItemByIndex(int index) { | 151 void AppsGridView::SetSelectedItemByIndex(int index) { |
| 151 if (selected_item_index_ == index) | 152 if (selected_item_index_ == index) |
| 152 return; | 153 return; |
| 153 | 154 |
| 154 if (selected_item_index_ >= 0) | 155 if (selected_item_index_ >= 0) |
| 155 GetItemViewAtIndex(selected_item_index_)->SetSelected(false); | 156 GetItemViewAtIndex(selected_item_index_)->SetSelected(false); |
| 156 | 157 |
| 157 if (index < 0 || index >= child_count()) { | 158 if (index < 0 || index >= child_count()) { |
| 158 selected_item_index_ = -1; | 159 selected_item_index_ = -1; |
| 159 } else { | 160 } else { |
| 160 selected_item_index_ = index; | 161 selected_item_index_ = index; |
| 161 GetItemViewAtIndex(selected_item_index_)->SetSelected(true); | 162 GetItemViewAtIndex(selected_item_index_)->SetSelected(true); |
| 162 | 163 |
| 163 if (tiles_per_page()) | 164 if (tiles_per_page()) |
| 164 pagination_model_->SelectPage(selected_item_index_ / tiles_per_page()); | 165 pagination_model_->SelectPage(selected_item_index_ / tiles_per_page()); |
| 165 } | 166 } |
| 166 } | 167 } |
| 167 | 168 |
| 168 gfx::Size AppListModelView::GetPreferredSize() { | 169 gfx::Size AppsGridView::GetPreferredSize() { |
| 169 if (!fixed_layout_) | 170 if (!fixed_layout_) |
| 170 return gfx::Size(); | 171 return gfx::Size(); |
| 171 | 172 |
| 172 gfx::Insets insets(GetInsets()); | 173 gfx::Insets insets(GetInsets()); |
| 173 gfx::Size tile_size = gfx::Size(kPreferredTileWidth, kPreferredTileHeight); | 174 gfx::Size tile_size = gfx::Size(kPreferredTileWidth, kPreferredTileHeight); |
| 174 return gfx::Size(tile_size.width() * cols_ + insets.width(), | 175 return gfx::Size(tile_size.width() * cols_ + insets.width(), |
| 175 tile_size.height() * rows_per_page_ + insets.height()); | 176 tile_size.height() * rows_per_page_ + insets.height()); |
| 176 } | 177 } |
| 177 | 178 |
| 178 void AppListModelView::Layout() { | 179 void AppsGridView::Layout() { |
| 179 gfx::Rect rect(GetContentsBounds()); | 180 gfx::Rect rect(GetContentsBounds()); |
| 180 if (rect.IsEmpty() || child_count() == 0) | 181 if (rect.IsEmpty() || child_count() == 0) |
| 181 return; | 182 return; |
| 182 | 183 |
| 183 gfx::Size tile_size; | 184 gfx::Size tile_size; |
| 184 if (fixed_layout_) { | 185 if (fixed_layout_) { |
| 185 tile_size = gfx::Size(kPreferredTileWidth, kPreferredTileHeight); | 186 tile_size = gfx::Size(kPreferredTileWidth, kPreferredTileHeight); |
| 186 } else { | 187 } else { |
| 187 int rows = 0; | 188 int rows = 0; |
| 188 CalculateLayout(rect.size(), child_count(), &icon_size_, &rows, &cols_); | 189 CalculateLayout(rect.size(), child_count(), &icon_size_, &rows, &cols_); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 view->SetVisible(rect.Contains(current_tile)); | 229 view->SetVisible(rect.Contains(current_tile)); |
| 229 | 230 |
| 230 current_tile.Offset(tile_size.width(), 0); | 231 current_tile.Offset(tile_size.width(), 0); |
| 231 if ((i + 1) % cols_ == 0) { | 232 if ((i + 1) % cols_ == 0) { |
| 232 current_tile.set_x(grid_rect.x()); | 233 current_tile.set_x(grid_rect.x()); |
| 233 current_tile.set_y(current_tile.y() + tile_size.height()); | 234 current_tile.set_y(current_tile.y() + tile_size.height()); |
| 234 } | 235 } |
| 235 } | 236 } |
| 236 } | 237 } |
| 237 | 238 |
| 238 bool AppListModelView::OnKeyPressed(const views::KeyEvent& event) { | 239 bool AppsGridView::OnKeyPressed(const views::KeyEvent& event) { |
| 239 bool handled = false; | 240 bool handled = false; |
| 240 if (selected_item_index_ >= 0) | 241 if (selected_item_index_ >= 0) |
| 241 handled = GetItemViewAtIndex(selected_item_index_)->OnKeyPressed(event); | 242 handled = GetItemViewAtIndex(selected_item_index_)->OnKeyPressed(event); |
| 242 | 243 |
| 243 if (!handled) { | 244 if (!handled) { |
| 244 switch (event.key_code()) { | 245 switch (event.key_code()) { |
| 245 case ui::VKEY_LEFT: | 246 case ui::VKEY_LEFT: |
| 246 SetSelectedItemByIndex(std::max(selected_item_index_ - 1, 0)); | 247 SetSelectedItemByIndex(std::max(selected_item_index_ - 1, 0)); |
| 247 return true; | 248 return true; |
| 248 case ui::VKEY_RIGHT: | 249 case ui::VKEY_RIGHT: |
| (...skipping 28 matching lines...) Expand all Loading... |
| 277 } | 278 } |
| 278 } | 279 } |
| 279 default: | 280 default: |
| 280 break; | 281 break; |
| 281 } | 282 } |
| 282 } | 283 } |
| 283 | 284 |
| 284 return handled; | 285 return handled; |
| 285 } | 286 } |
| 286 | 287 |
| 287 bool AppListModelView::OnKeyReleased(const views::KeyEvent& event) { | 288 bool AppsGridView::OnKeyReleased(const views::KeyEvent& event) { |
| 288 bool handled = false; | 289 bool handled = false; |
| 289 if (selected_item_index_ >= 0) | 290 if (selected_item_index_ >= 0) |
| 290 handled = GetItemViewAtIndex(selected_item_index_)->OnKeyReleased(event); | 291 handled = GetItemViewAtIndex(selected_item_index_)->OnKeyReleased(event); |
| 291 | 292 |
| 292 return handled; | 293 return handled; |
| 293 } | 294 } |
| 294 | 295 |
| 295 void AppListModelView::OnPaintFocusBorder(gfx::Canvas* canvas) { | 296 void AppsGridView::OnPaintFocusBorder(gfx::Canvas* canvas) { |
| 296 // Override to not paint focus frame. | 297 // Override to not paint focus frame. |
| 297 } | 298 } |
| 298 | 299 |
| 299 void AppListModelView::ListItemsAdded(size_t start, size_t count) { | 300 void AppsGridView::ListItemsAdded(size_t start, size_t count) { |
| 300 for (size_t i = start; i < start + count; ++i) { | 301 for (size_t i = start; i < start + count; ++i) { |
| 301 AddChildViewAt(new AppListItemView(this, model_->GetItemAt(i), listener_), | 302 AddChildViewAt(new AppListItemView(this, model_->GetItemAt(i), listener_), |
| 302 i); | 303 i); |
| 303 } | 304 } |
| 304 Layout(); | 305 Layout(); |
| 305 SchedulePaint(); | 306 SchedulePaint(); |
| 306 } | 307 } |
| 307 | 308 |
| 308 void AppListModelView::ListItemsRemoved(size_t start, size_t count) { | 309 void AppsGridView::ListItemsRemoved(size_t start, size_t count) { |
| 309 for (size_t i = 0; i < count; ++i) | 310 for (size_t i = 0; i < count; ++i) |
| 310 delete child_at(start); | 311 delete child_at(start); |
| 311 | 312 |
| 312 Layout(); | 313 Layout(); |
| 313 SchedulePaint(); | 314 SchedulePaint(); |
| 314 } | 315 } |
| 315 | 316 |
| 316 void AppListModelView::ListItemsChanged(size_t start, size_t count) { | 317 void AppsGridView::ListItemsChanged(size_t start, size_t count) { |
| 317 NOTREACHED(); | 318 NOTREACHED(); |
| 318 } | 319 } |
| 319 | 320 |
| 320 void AppListModelView::TotalPagesChanged() { | 321 void AppsGridView::TotalPagesChanged() { |
| 321 } | 322 } |
| 322 | 323 |
| 323 void AppListModelView::SelectedPageChanged(int old_selected, int new_selected) { | 324 void AppsGridView::SelectedPageChanged(int old_selected, int new_selected) { |
| 324 Layout(); | 325 Layout(); |
| 325 } | 326 } |
| 326 | 327 |
| 327 } // namespace app_list | 328 } // namespace app_list |
| OLD | NEW |