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

Side by Side Diff: ash/wm/app_list_controller.cc

Issue 302803002: Refactor app list so AppsGridView owns the PaginationModel. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compile error (conflict). Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « ash/wm/app_list_controller.h ('k') | chrome/browser/ui/app_list/app_list_shower_views.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "ash/wm/app_list_controller.h" 5 #include "ash/wm/app_list_controller.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/root_window_controller.h" 8 #include "ash/root_window_controller.h"
9 #include "ash/screen_util.h" 9 #include "ash/screen_util.h"
10 #include "ash/shelf/shelf.h" 10 #include "ash/shelf/shelf.h"
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 int GetMinimumBoundsHeightForAppList(const app_list::AppListView* app_list) { 146 int GetMinimumBoundsHeightForAppList(const app_list::AppListView* app_list) {
147 return app_list->bounds().height() + 2 * kMinimalCenteredAppListMargin; 147 return app_list->bounds().height() + 2 * kMinimalCenteredAppListMargin;
148 } 148 }
149 149
150 } // namespace 150 } // namespace
151 151
152 //////////////////////////////////////////////////////////////////////////////// 152 ////////////////////////////////////////////////////////////////////////////////
153 // AppListController, public: 153 // AppListController, public:
154 154
155 AppListController::AppListController() 155 AppListController::AppListController()
156 : pagination_model_(new app_list::PaginationModel), 156 : is_visible_(false),
157 is_visible_(false),
158 is_centered_(false), 157 is_centered_(false),
159 view_(NULL), 158 view_(NULL),
159 current_apps_page_(-1),
160 should_snap_back_(false) { 160 should_snap_back_(false) {
161 Shell::GetInstance()->AddShellObserver(this); 161 Shell::GetInstance()->AddShellObserver(this);
162 pagination_model_->AddObserver(this);
163 } 162 }
164 163
165 AppListController::~AppListController() { 164 AppListController::~AppListController() {
166 // Ensures app list view goes before the controller since pagination model 165 // Ensures app list view goes before the controller since pagination model
167 // lives in the controller and app list view would access it on destruction. 166 // lives in the controller and app list view would access it on destruction.
168 if (view_ && view_->GetWidget()) 167 if (view_) {
169 view_->GetWidget()->CloseNow(); 168 view_->GetAppsPaginationModel()->RemoveObserver(this);
169 if (view_->GetWidget())
170 view_->GetWidget()->CloseNow();
171 }
170 172
171 Shell::GetInstance()->RemoveShellObserver(this); 173 Shell::GetInstance()->RemoveShellObserver(this);
172 pagination_model_->RemoveObserver(this);
173 } 174 }
174 175
175 void AppListController::SetVisible(bool visible, aura::Window* window) { 176 void AppListController::SetVisible(bool visible, aura::Window* window) {
176 if (visible == is_visible_) 177 if (visible == is_visible_)
177 return; 178 return;
178 179
179 is_visible_ = visible; 180 is_visible_ = visible;
180 181
181 // App list needs to know the new shelf layout in order to calculate its 182 // App list needs to know the new shelf layout in order to calculate its
182 // UI layout when AppListView visibility changes. 183 // UI layout when AppListView visibility changes.
(...skipping 16 matching lines...) Expand all
199 Shell::GetInstance()->delegate()->CreateAppListViewDelegate()); 200 Shell::GetInstance()->delegate()->CreateAppListViewDelegate());
200 aura::Window* root_window = window->GetRootWindow(); 201 aura::Window* root_window = window->GetRootWindow();
201 aura::Window* container = GetRootWindowController(root_window)-> 202 aura::Window* container = GetRootWindowController(root_window)->
202 GetContainer(kShellWindowId_AppListContainer); 203 GetContainer(kShellWindowId_AppListContainer);
203 views::View* applist_button = 204 views::View* applist_button =
204 Shelf::ForWindow(container)->GetAppListButtonView(); 205 Shelf::ForWindow(container)->GetAppListButtonView();
205 is_centered_ = view->ShouldCenterWindow(); 206 is_centered_ = view->ShouldCenterWindow();
206 if (is_centered_) { 207 if (is_centered_) {
207 // Note: We can't center the app list until we have its dimensions, so we 208 // Note: We can't center the app list until we have its dimensions, so we
208 // init at (0, 0) and then reset its anchor point. 209 // init at (0, 0) and then reset its anchor point.
209 view->InitAsBubbleAtFixedLocation( 210 view->InitAsBubbleAtFixedLocation(container,
210 container, 211 current_apps_page_,
211 pagination_model_.get(), 212 gfx::Point(),
212 gfx::Point(), 213 views::BubbleBorder::FLOAT,
213 views::BubbleBorder::FLOAT, 214 true /* border_accepts_events */);
214 true /* border_accepts_events */);
215 // The experimental app list is centered over the display of the app list 215 // The experimental app list is centered over the display of the app list
216 // button that was pressed (if triggered via keyboard, this is the display 216 // button that was pressed (if triggered via keyboard, this is the display
217 // with the currently focused window). 217 // with the currently focused window).
218 view->SetAnchorPoint(GetCenterOfDisplayForView( 218 view->SetAnchorPoint(GetCenterOfDisplayForView(
219 applist_button, GetMinimumBoundsHeightForAppList(view))); 219 applist_button, GetMinimumBoundsHeightForAppList(view)));
220 } else { 220 } else {
221 gfx::Rect applist_button_bounds = applist_button->GetBoundsInScreen(); 221 gfx::Rect applist_button_bounds = applist_button->GetBoundsInScreen();
222 // We need the location of the button within the local screen. 222 // We need the location of the button within the local screen.
223 applist_button_bounds = ScreenUtil::ConvertRectFromScreen( 223 applist_button_bounds = ScreenUtil::ConvertRectFromScreen(
224 root_window, 224 root_window,
225 applist_button_bounds); 225 applist_button_bounds);
226 view->InitAsBubbleAttachedToAnchor( 226 view->InitAsBubbleAttachedToAnchor(
227 container, 227 container,
228 pagination_model_.get(), 228 current_apps_page_,
229 Shelf::ForWindow(container)->GetAppListButtonView(), 229 Shelf::ForWindow(container)->GetAppListButtonView(),
230 GetAnchorPositionOffsetToShelf(applist_button_bounds, 230 GetAnchorPositionOffsetToShelf(
231 Shelf::ForWindow(container)->GetAppListButtonView()-> 231 applist_button_bounds,
232 GetWidget()), 232 Shelf::ForWindow(container)->GetAppListButtonView()->GetWidget()),
233 GetBubbleArrow(container), 233 GetBubbleArrow(container),
234 true /* border_accepts_events */); 234 true /* border_accepts_events */);
235 view->SetArrowPaintType(views::BubbleBorder::PAINT_NONE); 235 view->SetArrowPaintType(views::BubbleBorder::PAINT_NONE);
236 } 236 }
237 SetView(view); 237 SetView(view);
238 // By setting us as DnD recipient, the app list knows that we can 238 // By setting us as DnD recipient, the app list knows that we can
239 // handle items. 239 // handle items.
240 SetDragAndDropHostOfCurrentAppList( 240 SetDragAndDropHostOfCurrentAppList(
241 Shelf::ForWindow(window)->GetDragAndDropHostForAppList()); 241 Shelf::ForWindow(window)->GetDragAndDropHostForAppList());
242 } 242 }
(...skipping 27 matching lines...) Expand all
270 widget->AddObserver(this); 270 widget->AddObserver(this);
271 keyboard::KeyboardController* keyboard_controller = 271 keyboard::KeyboardController* keyboard_controller =
272 keyboard::KeyboardController::GetInstance(); 272 keyboard::KeyboardController::GetInstance();
273 if (keyboard_controller) 273 if (keyboard_controller)
274 keyboard_controller->AddObserver(this); 274 keyboard_controller->AddObserver(this);
275 Shell::GetInstance()->AddPreTargetHandler(this); 275 Shell::GetInstance()->AddPreTargetHandler(this);
276 Shelf::ForWindow(widget->GetNativeWindow())->AddIconObserver(this); 276 Shelf::ForWindow(widget->GetNativeWindow())->AddIconObserver(this);
277 widget->GetNativeView()->GetRootWindow()->AddObserver(this); 277 widget->GetNativeView()->GetRootWindow()->AddObserver(this);
278 aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this); 278 aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this);
279 279
280 view_->GetAppsPaginationModel()->AddObserver(this);
281
280 view_->ShowWhenReady(); 282 view_->ShowWhenReady();
281 } 283 }
282 284
283 void AppListController::ResetView() { 285 void AppListController::ResetView() {
284 if (!view_) 286 if (!view_)
285 return; 287 return;
286 288
287 views::Widget* widget = view_->GetWidget(); 289 views::Widget* widget = view_->GetWidget();
288 widget->RemoveObserver(this); 290 widget->RemoveObserver(this);
289 GetLayer(widget)->GetAnimator()->RemoveObserver(this); 291 GetLayer(widget)->GetAnimator()->RemoveObserver(this);
290 keyboard::KeyboardController* keyboard_controller = 292 keyboard::KeyboardController* keyboard_controller =
291 keyboard::KeyboardController::GetInstance(); 293 keyboard::KeyboardController::GetInstance();
292 if (keyboard_controller) 294 if (keyboard_controller)
293 keyboard_controller->RemoveObserver(this); 295 keyboard_controller->RemoveObserver(this);
294 Shell::GetInstance()->RemovePreTargetHandler(this); 296 Shell::GetInstance()->RemovePreTargetHandler(this);
295 Shelf::ForWindow(widget->GetNativeWindow())->RemoveIconObserver(this); 297 Shelf::ForWindow(widget->GetNativeWindow())->RemoveIconObserver(this);
296 widget->GetNativeView()->GetRootWindow()->RemoveObserver(this); 298 widget->GetNativeView()->GetRootWindow()->RemoveObserver(this);
297 aura::client::GetFocusClient(widget->GetNativeView())->RemoveObserver(this); 299 aura::client::GetFocusClient(widget->GetNativeView())->RemoveObserver(this);
300
301 view_->GetAppsPaginationModel()->RemoveObserver(this);
302
298 view_ = NULL; 303 view_ = NULL;
299 } 304 }
300 305
301 void AppListController::ScheduleAnimation() { 306 void AppListController::ScheduleAnimation() {
302 // Stop observing previous animation. 307 // Stop observing previous animation.
303 StopObservingImplicitAnimations(); 308 StopObservingImplicitAnimations();
304 309
305 views::Widget* widget = view_->GetWidget(); 310 views::Widget* widget = view_->GetWidget();
306 ui::Layer* layer = GetLayer(widget); 311 ui::Layer* layer = GetLayer(widget);
307 layer->GetAnimator()->StopAnimating(); 312 layer->GetAnimator()->StopAnimating();
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 } 447 }
443 448
444 //////////////////////////////////////////////////////////////////////////////// 449 ////////////////////////////////////////////////////////////////////////////////
445 // AppListController, PaginationModelObserver implementation: 450 // AppListController, PaginationModelObserver implementation:
446 451
447 void AppListController::TotalPagesChanged() { 452 void AppListController::TotalPagesChanged() {
448 } 453 }
449 454
450 void AppListController::SelectedPageChanged(int old_selected, 455 void AppListController::SelectedPageChanged(int old_selected,
451 int new_selected) { 456 int new_selected) {
457 current_apps_page_ = new_selected;
452 } 458 }
453 459
454 void AppListController::TransitionStarted() { 460 void AppListController::TransitionStarted() {
455 } 461 }
456 462
457 void AppListController::TransitionChanged() { 463 void AppListController::TransitionChanged() {
458 // |view_| could be NULL when app list is closed with a running transition. 464 // |view_| could be NULL when app list is closed with a running transition.
459 if (!view_) 465 if (!view_)
460 return; 466 return;
461 467
468 app_list::PaginationModel* pagination_model = view_->GetAppsPaginationModel();
469
462 const app_list::PaginationModel::Transition& transition = 470 const app_list::PaginationModel::Transition& transition =
463 pagination_model_->transition(); 471 pagination_model->transition();
464 if (pagination_model_->is_valid_page(transition.target_page)) 472 if (pagination_model->is_valid_page(transition.target_page))
465 return; 473 return;
466 474
467 views::Widget* widget = view_->GetWidget(); 475 views::Widget* widget = view_->GetWidget();
468 ui::LayerAnimator* widget_animator = GetLayer(widget)->GetAnimator(); 476 ui::LayerAnimator* widget_animator = GetLayer(widget)->GetAnimator();
469 if (!pagination_model_->IsRevertingCurrentTransition()) { 477 if (!pagination_model->IsRevertingCurrentTransition()) {
470 // Update cached |view_bounds_| if it is the first over-scroll move and 478 // Update cached |view_bounds_| if it is the first over-scroll move and
471 // widget does not have running animations. 479 // widget does not have running animations.
472 if (!should_snap_back_ && !widget_animator->is_animating()) 480 if (!should_snap_back_ && !widget_animator->is_animating())
473 view_bounds_ = widget->GetWindowBoundsInScreen(); 481 view_bounds_ = widget->GetWindowBoundsInScreen();
474 482
475 const int current_page = pagination_model_->selected_page(); 483 const int current_page = pagination_model->selected_page();
476 const int dir = transition.target_page > current_page ? -1 : 1; 484 const int dir = transition.target_page > current_page ? -1 : 1;
477 485
478 const double progress = 1.0 - pow(1.0 - transition.progress, 4); 486 const double progress = 1.0 - pow(1.0 - transition.progress, 4);
479 const int shift = kMaxOverScrollShift * progress * dir; 487 const int shift = kMaxOverScrollShift * progress * dir;
480 488
481 gfx::Rect shifted(view_bounds_); 489 gfx::Rect shifted(view_bounds_);
482 shifted.set_x(shifted.x() + shift); 490 shifted.set_x(shifted.x() + shift);
483 widget->SetBounds(shifted); 491 widget->SetBounds(shifted);
484 should_snap_back_ = true; 492 should_snap_back_ = true;
485 } else if (should_snap_back_) { 493 } else if (should_snap_back_) {
486 should_snap_back_ = false; 494 should_snap_back_ = false;
487 ui::ScopedLayerAnimationSettings animation(widget_animator); 495 ui::ScopedLayerAnimationSettings animation(widget_animator);
488 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 496 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
489 app_list::kOverscrollPageTransitionDurationMs)); 497 app_list::kOverscrollPageTransitionDurationMs));
490 widget->SetBounds(view_bounds_); 498 widget->SetBounds(view_bounds_);
491 } 499 }
492 } 500 }
493 501
494 } // namespace ash 502 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/app_list_controller.h ('k') | chrome/browser/ui/app_list/app_list_shower_views.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698