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

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

Issue 210583004: Make cancelling of app list correctly clean up folder UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 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
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 "ui/app_list/views/apps_grid_view.h" 5 #include "ui/app_list/views/apps_grid_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 10
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 DISALLOW_COPY_AND_ASSIGN(SynchronousDrag); 309 DISALLOW_COPY_AND_ASSIGN(SynchronousDrag);
310 }; 310 };
311 #endif // defined(OS_WIN) 311 #endif // defined(OS_WIN)
312 312
313 AppsGridView::AppsGridView(AppsGridViewDelegate* delegate, 313 AppsGridView::AppsGridView(AppsGridViewDelegate* delegate,
314 PaginationModel* pagination_model, 314 PaginationModel* pagination_model,
315 content::WebContents* start_page_contents) 315 content::WebContents* start_page_contents)
316 : model_(NULL), 316 : model_(NULL),
317 item_list_(NULL), 317 item_list_(NULL),
318 delegate_(delegate), 318 delegate_(delegate),
319 folder_delegate_(NULL),
319 pagination_model_(pagination_model), 320 pagination_model_(pagination_model),
320 page_switcher_view_(new PageSwitcher(pagination_model)), 321 page_switcher_view_(new PageSwitcher(pagination_model)),
321 start_page_view_(NULL), 322 start_page_view_(NULL),
322 cols_(0), 323 cols_(0),
323 rows_per_page_(0), 324 rows_per_page_(0),
324 selected_view_(NULL), 325 selected_view_(NULL),
325 drag_view_(NULL), 326 drag_view_(NULL),
326 drag_start_page_(-1), 327 drag_start_page_(-1),
327 drag_pointer_(NONE), 328 drag_pointer_(NONE),
328 drop_attempt_(DROP_FOR_NONE), 329 drop_attempt_(DROP_FOR_NONE),
329 drag_and_drop_host_(NULL), 330 drag_and_drop_host_(NULL),
330 forward_events_to_drag_and_drop_host_(false), 331 forward_events_to_drag_and_drop_host_(false),
331 page_flip_target_(-1), 332 page_flip_target_(-1),
332 page_flip_delay_in_ms_(kPageFlipDelayInMs), 333 page_flip_delay_in_ms_(kPageFlipDelayInMs),
333 bounds_animator_(this), 334 bounds_animator_(this),
334 is_root_level_(true),
335 activated_item_view_(NULL), 335 activated_item_view_(NULL),
336 dragging_for_reparent_item_(false) { 336 dragging_for_reparent_item_(false) {
337 SetPaintToLayer(true); 337 SetPaintToLayer(true);
338 SetFillsBoundsOpaquely(false); 338 SetFillsBoundsOpaquely(false);
339 339
340 pagination_model_->AddObserver(this); 340 pagination_model_->AddObserver(this);
341 AddChildView(page_switcher_view_); 341 AddChildView(page_switcher_view_);
342 342
343 if (start_page_contents) { 343 if (start_page_contents) {
344 start_page_view_ = 344 start_page_view_ =
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 synchronous_drag_->EndDragExternally(); 492 synchronous_drag_->EndDragExternally();
493 493
494 synchronous_drag_ = NULL; 494 synchronous_drag_ = NULL;
495 #endif 495 #endif
496 } 496 }
497 497
498 bool AppsGridView::UpdateDragFromItem(Pointer pointer, 498 bool AppsGridView::UpdateDragFromItem(Pointer pointer,
499 const ui::LocatedEvent& event) { 499 const ui::LocatedEvent& event) {
500 DCHECK(drag_view_); 500 DCHECK(drag_view_);
501 501
502 if (!is_root_level_) 502 if (folder_delegate_)
503 UpdateDragStateInsideFolder(pointer, event); 503 UpdateDragStateInsideFolder(pointer, event);
504 504
505 gfx::Point drag_point_in_grid_view; 505 gfx::Point drag_point_in_grid_view;
506 ExtractDragLocation(event, &drag_point_in_grid_view); 506 ExtractDragLocation(event, &drag_point_in_grid_view);
507 UpdateDrag(pointer, drag_point_in_grid_view); 507 UpdateDrag(pointer, drag_point_in_grid_view);
508 if (!dragging()) 508 if (!dragging())
509 return false; 509 return false;
510 510
511 // If a drag and drop host is provided, see if the drag operation needs to be 511 // If a drag and drop host is provided, see if the drag operation needs to be
512 // forwarded. 512 // forwarded.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 // EndDrag was called before if |drag_view_| is NULL. 588 // EndDrag was called before if |drag_view_| is NULL.
589 if (!drag_view_) 589 if (!drag_view_)
590 return; 590 return;
591 591
592 // Coming here a drag and drop was in progress. 592 // Coming here a drag and drop was in progress.
593 bool landed_in_drag_and_drop_host = forward_events_to_drag_and_drop_host_; 593 bool landed_in_drag_and_drop_host = forward_events_to_drag_and_drop_host_;
594 if (forward_events_to_drag_and_drop_host_) { 594 if (forward_events_to_drag_and_drop_host_) {
595 DCHECK(!IsDraggingForReparentInRootLevelGridView()); 595 DCHECK(!IsDraggingForReparentInRootLevelGridView());
596 forward_events_to_drag_and_drop_host_ = false; 596 forward_events_to_drag_and_drop_host_ = false;
597 drag_and_drop_host_->EndDrag(cancel); 597 drag_and_drop_host_->EndDrag(cancel);
598 if (IsDraggingForReprentInHiddenGridView()) { 598 if (IsDraggingForReprentInHiddenGridView()) {
tapted 2014/03/26 02:53:54 nit: doesn't need curlies
calamity 2014/03/27 05:14:44 Done.
599 static_cast<AppListFolderView*>(parent())-> 599 folder_delegate_->DispatchEndDragEventForReparent(true);
600 DispatchEndDragEventForReparent(true);
601 } 600 }
602 } else if (!cancel && dragging()) { 601 } else if (!cancel && dragging()) {
603 if (IsDraggingForReprentInHiddenGridView()) { 602 if (IsDraggingForReprentInHiddenGridView()) {
604 // Forward the EndDrag event to the root level grid view. 603 // Forward the EndDrag event to the root level grid view.
605 static_cast<AppListFolderView*>(parent())-> 604 folder_delegate_->DispatchEndDragEventForReparent(false);
606 DispatchEndDragEventForReparent(false);
607 EndDragForReparentInHiddenFolderGridView(); 605 EndDragForReparentInHiddenFolderGridView();
608 return; 606 return;
609 } else { 607 } else {
610 // Regular drag ending path, ie, not for reparenting. 608 // Regular drag ending path, ie, not for reparenting.
611 CalculateDropTarget(last_drag_point_, true); 609 CalculateDropTarget(last_drag_point_, true);
612 if (IsValidIndex(drop_target_)) { 610 if (IsValidIndex(drop_target_)) {
613 if (!EnableFolderDragDropUI()) { 611 if (!EnableFolderDragDropUI()) {
614 MoveItemInModel(drag_view_, drop_target_); 612 MoveItemInModel(drag_view_, drop_target_);
615 } else { 613 } else {
616 if (drop_attempt_ == DROP_FOR_REORDER) 614 if (drop_attempt_ == DROP_FOR_REORDER)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 drag_view_ = NULL; 649 drag_view_ = NULL;
652 drag_start_grid_view_ = gfx::Point(); 650 drag_start_grid_view_ = gfx::Point();
653 drag_start_page_ = -1; 651 drag_start_page_ = -1;
654 drag_view_offset_ = gfx::Point(); 652 drag_view_offset_ = gfx::Point();
655 AnimateToIdealBounds(); 653 AnimateToIdealBounds();
656 654
657 StopPageFlipTimer(); 655 StopPageFlipTimer();
658 656
659 // If user releases mouse inside a folder's grid view, burst the folder 657 // If user releases mouse inside a folder's grid view, burst the folder
660 // container ink bubble. 658 // container ink bubble.
661 if (!cancel && !is_root_level_ && !IsDraggingForReprentInHiddenGridView()) { 659 if (folder_delegate_ && !IsDraggingForReprentInHiddenGridView())
tapted 2014/03/26 02:53:54 there's a typo in this function name: Reprent -> R
jennyz 2014/03/26 22:09:38 This change will crash chrome on chromeos, since t
calamity 2014/03/27 05:14:44 Done.
calamity 2014/03/27 05:14:44 Cool, thanks for fixing that.
662 static_cast<AppListFolderView*>(parent())-> 660 folder_delegate_->UpdateFolderViewBackground(false);
663 UpdateFolderViewBackground(false);
664 }
665 661
666 if (IsDraggingForReprentInHiddenGridView()) 662 if (IsDraggingForReprentInHiddenGridView())
667 dragging_for_reparent_item_ = false; 663 dragging_for_reparent_item_ = false;
668 } 664 }
669 665
670 void AppsGridView::StopPageFlipTimer() { 666 void AppsGridView::StopPageFlipTimer() {
671 page_flip_timer_.Stop(); 667 page_flip_timer_.Stop();
672 page_flip_target_ = -1; 668 page_flip_target_ = -1;
673 } 669 }
674 670
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 drop_target_ = GetNearestTileForDragView(); 1285 drop_target_ = GetNearestTileForDragView();
1290 } 1286 }
1291 } 1287 }
1292 1288
1293 void AppsGridView::OnReorderTimer() { 1289 void AppsGridView::OnReorderTimer() {
1294 if (drop_attempt_ == DROP_FOR_REORDER) 1290 if (drop_attempt_ == DROP_FOR_REORDER)
1295 AnimateToIdealBounds(); 1291 AnimateToIdealBounds();
1296 } 1292 }
1297 1293
1298 void AppsGridView::OnFolderItemReparentTimer() { 1294 void AppsGridView::OnFolderItemReparentTimer() {
1299 DCHECK(!is_root_level_); 1295 DCHECK(folder_delegate_);
1300 if (drag_out_of_folder_container_) { 1296 if (drag_out_of_folder_container_) {
1301 static_cast<AppListFolderView*>(parent())->ReparentItem( 1297 folder_delegate_->ReparentItem(drag_view_, last_drag_point_);
1302 drag_view_, last_drag_point_);
1303 1298
1304 // Set the flag in the folder's grid view. 1299 // Set the flag in the folder's grid view.
1305 dragging_for_reparent_item_ = true; 1300 dragging_for_reparent_item_ = true;
1306 1301
1307 // Do not observe any data change since it is going to be hidden. 1302 // Do not observe any data change since it is going to be hidden.
1308 item_list_->RemoveObserver(this); 1303 item_list_->RemoveObserver(this);
1309 item_list_ = NULL; 1304 item_list_ = NULL;
1310 } 1305 }
1311 } 1306 }
1312 1307
1313 void AppsGridView::OnFolderDroppingTimer() { 1308 void AppsGridView::OnFolderDroppingTimer() {
1314 if (drop_attempt_ == DROP_FOR_FOLDER) 1309 if (drop_attempt_ == DROP_FOR_FOLDER)
1315 SetAsFolderDroppingTarget(drop_target_, true); 1310 SetAsFolderDroppingTarget(drop_target_, true);
1316 } 1311 }
1317 1312
1318 void AppsGridView::UpdateDragStateInsideFolder( 1313 void AppsGridView::UpdateDragStateInsideFolder(
1319 Pointer pointer, 1314 Pointer pointer,
1320 const ui::LocatedEvent& event) { 1315 const ui::LocatedEvent& event) {
1321 if (IsDraggingForReprentInHiddenGridView()) { 1316 if (IsDraggingForReprentInHiddenGridView()) {
1322 // Dispatch drag event to root level grid view for re-parenting folder 1317 // Dispatch drag event to root level grid view for re-parenting folder
1323 // folder item purpose. 1318 // folder item purpose.
1324 DispatchDragEventForReparent(pointer, event); 1319 DispatchDragEventForReparent(pointer, event);
1325 return; 1320 return;
1326 } 1321 }
1327 1322
1328 // Regular drag and drop in a folder's grid view. 1323 // Regular drag and drop in a folder's grid view.
1329 AppListFolderView* folder_view = static_cast<AppListFolderView*>(parent()); 1324 folder_delegate_->UpdateFolderViewBackground(true);
1330 folder_view->UpdateFolderViewBackground(true);
1331 1325
1332 // Calculate if the drag_view_ is dragged out of the folder's container 1326 // Calculate if the drag_view_ is dragged out of the folder's container
1333 // ink bubble. 1327 // ink bubble.
1334 gfx::Rect bounds_to_folder_view = ConvertRectToParent(drag_view_->bounds()); 1328 gfx::Rect bounds_to_folder_view = ConvertRectToParent(drag_view_->bounds());
1335 gfx::Point pt = bounds_to_folder_view.CenterPoint(); 1329 gfx::Point pt = bounds_to_folder_view.CenterPoint();
1336 bool is_item_dragged_out_of_folder = 1330 bool is_item_dragged_out_of_folder =
1337 folder_view->IsPointOutsideOfFolderBoundray(pt); 1331 folder_delegate_->IsPointOutsideOfFolderBoundary(pt);
1338 if (is_item_dragged_out_of_folder) { 1332 if (is_item_dragged_out_of_folder) {
1339 if (!drag_out_of_folder_container_) { 1333 if (!drag_out_of_folder_container_) {
1340 folder_item_reparent_timer_.Start(FROM_HERE, 1334 folder_item_reparent_timer_.Start(FROM_HERE,
1341 base::TimeDelta::FromMilliseconds(kFolderItemReparentDealy), 1335 base::TimeDelta::FromMilliseconds(kFolderItemReparentDealy),
1342 this, &AppsGridView::OnFolderItemReparentTimer); 1336 this, &AppsGridView::OnFolderItemReparentTimer);
1343 drag_out_of_folder_container_ = true; 1337 drag_out_of_folder_container_ = true;
1344 } 1338 }
1345 } else { 1339 } else {
1346 folder_item_reparent_timer_.Stop(); 1340 folder_item_reparent_timer_.Stop();
1347 drag_out_of_folder_container_ = false; 1341 drag_out_of_folder_container_ = false;
1348 } 1342 }
1349 } 1343 }
1350 1344
1351 bool AppsGridView::IsDraggingForReparentInRootLevelGridView() const { 1345 bool AppsGridView::IsDraggingForReparentInRootLevelGridView() const {
1352 return (is_root_level_ && dragging_for_reparent_item_); 1346 return (!folder_delegate_ && dragging_for_reparent_item_);
1353 } 1347 }
1354 1348
1355 bool AppsGridView::IsDraggingForReprentInHiddenGridView() const { 1349 bool AppsGridView::IsDraggingForReprentInHiddenGridView() const {
1356 return (!is_root_level_ && dragging_for_reparent_item_); 1350 return (folder_delegate_ && dragging_for_reparent_item_);
1357 } 1351 }
1358 1352
1359 gfx::Rect AppsGridView::GetTargetIconRectInFolder( 1353 gfx::Rect AppsGridView::GetTargetIconRectInFolder(
1360 AppListItemView* drag_item_view, 1354 AppListItemView* drag_item_view,
1361 AppListItemView* folder_item_view) { 1355 AppListItemView* folder_item_view) {
1362 gfx::Rect view_ideal_bounds = view_model_.ideal_bounds( 1356 gfx::Rect view_ideal_bounds = view_model_.ideal_bounds(
1363 view_model_.GetIndexOfView(folder_item_view)); 1357 view_model_.GetIndexOfView(folder_item_view));
1364 gfx::Rect icon_ideal_bounds = 1358 gfx::Rect icon_ideal_bounds =
1365 folder_item_view->GetIconBoundsForTargetViewBounds(view_ideal_bounds); 1359 folder_item_view->GetIconBoundsForTargetViewBounds(view_ideal_bounds);
1366 AppListFolderItem* folder_item = 1360 AppListFolderItem* folder_item =
1367 static_cast<AppListFolderItem*>(folder_item_view->item()); 1361 static_cast<AppListFolderItem*>(folder_item_view->item());
1368 return folder_item->GetTargetIconRectInFolderForItem( 1362 return folder_item->GetTargetIconRectInFolderForItem(
1369 drag_item_view->item(), icon_ideal_bounds); 1363 drag_item_view->item(), icon_ideal_bounds);
1370 } 1364 }
1371 1365
1372 void AppsGridView::DispatchDragEventForReparent( 1366 void AppsGridView::DispatchDragEventForReparent(
1373 Pointer pointer, 1367 Pointer pointer,
1374 const ui::LocatedEvent& event) { 1368 const ui::LocatedEvent& event) {
1375 static_cast<AppListFolderView*>(parent())-> 1369 folder_delegate_->DispatchDragEventForReparent(pointer, event);
1376 DispatchDragEventForReparent(pointer, event);
1377 } 1370 }
1378 1371
1379 void AppsGridView::EndDragFromReparentItemInRootLevel( 1372 void AppsGridView::EndDragFromReparentItemInRootLevel(
1380 bool events_forwarded_to_drag_drop_host) { 1373 bool events_forwarded_to_drag_drop_host) {
1381 // EndDrag was called before if |drag_view_| is NULL. 1374 // EndDrag was called before if |drag_view_| is NULL.
1382 if (!drag_view_) 1375 if (!drag_view_)
1383 return; 1376 return;
1384 1377
1385 DCHECK(IsDraggingForReparentInRootLevelGridView()); 1378 DCHECK(IsDraggingForReparentInRootLevelGridView());
1386 bool cancel_reparent = false; 1379 bool cancel_reparent = false;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 drop_target_ = Index(); 1442 drop_target_ = Index();
1450 drag_view_->OnDragEnded(); 1443 drag_view_->OnDragEnded();
1451 drag_view_ = NULL; 1444 drag_view_ = NULL;
1452 drag_start_grid_view_ = gfx::Point(); 1445 drag_start_grid_view_ = gfx::Point();
1453 drag_start_page_ = -1; 1446 drag_start_page_ = -1;
1454 drag_view_offset_ = gfx::Point(); 1447 drag_view_offset_ = gfx::Point();
1455 dragging_for_reparent_item_ = false; 1448 dragging_for_reparent_item_ = false;
1456 } 1449 }
1457 1450
1458 void AppsGridView::OnFolderItemRemoved() { 1451 void AppsGridView::OnFolderItemRemoved() {
1459 DCHECK(!is_root_level_); 1452 DCHECK(folder_delegate_);
1460 item_list_ = NULL; 1453 item_list_ = NULL;
1461 } 1454 }
1462 1455
1463 void AppsGridView::StartDragAndDropHostDrag(const gfx::Point& grid_location) { 1456 void AppsGridView::StartDragAndDropHostDrag(const gfx::Point& grid_location) {
1464 // When a drag and drop host is given, the item can be dragged out of the app 1457 // When a drag and drop host is given, the item can be dragged out of the app
1465 // list window. In that case a proxy widget needs to be used. 1458 // list window. In that case a proxy widget needs to be used.
1466 // Note: This code has very likely to be changed for Windows (non metro mode) 1459 // Note: This code has very likely to be changed for Windows (non metro mode)
1467 // when a |drag_and_drop_host_| gets implemented. 1460 // when a |drag_and_drop_host_| gets implemented.
1468 if (!drag_view_ || !drag_and_drop_host_) 1461 if (!drag_view_ || !drag_and_drop_host_)
1469 return; 1462 return;
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 } 1886 }
1894 1887
1895 void AppsGridView::OnImplicitAnimationsCompleted() { 1888 void AppsGridView::OnImplicitAnimationsCompleted() {
1896 if (layer()->opacity() == 0.0f) 1889 if (layer()->opacity() == 0.0f)
1897 SetVisible(false); 1890 SetVisible(false);
1898 } 1891 }
1899 1892
1900 bool AppsGridView::EnableFolderDragDropUI() { 1893 bool AppsGridView::EnableFolderDragDropUI() {
1901 // Enable drag and drop folder UI only if it is at the app list root level 1894 // Enable drag and drop folder UI only if it is at the app list root level
1902 // and the switch is on and the target folder can still accept new items. 1895 // and the switch is on and the target folder can still accept new items.
1903 return switches::IsFolderUIEnabled() && is_root_level_ && 1896 return switches::IsFolderUIEnabled() && !folder_delegate_ &&
1904 CanDropIntoTarget(drop_target_); 1897 CanDropIntoTarget(drop_target_);
1905 } 1898 }
1906 1899
1907 bool AppsGridView::CanDropIntoTarget(const Index& drop_target) { 1900 bool AppsGridView::CanDropIntoTarget(const Index& drop_target) {
1908 views::View* target_view = GetViewAtSlotOnCurrentPage(drop_target.slot); 1901 views::View* target_view = GetViewAtSlotOnCurrentPage(drop_target.slot);
1909 if (!target_view) 1902 if (!target_view)
1910 return true; 1903 return true;
1911 1904
1912 AppListItem* target_item = 1905 AppListItem* target_item =
1913 static_cast<AppListItemView*>(target_view)->item(); 1906 static_cast<AppListItemView*>(target_view)->item();
1914 // Items can be dropped into non-folders (which have no children) or folders 1907 // Items can be dropped into non-folders (which have no children) or folders
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index, 2074 void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index,
2082 bool is_target_folder) { 2075 bool is_target_folder) {
2083 AppListItemView* target_view = 2076 AppListItemView* target_view =
2084 static_cast<AppListItemView*>( 2077 static_cast<AppListItemView*>(
2085 GetViewAtSlotOnCurrentPage(target_index.slot)); 2078 GetViewAtSlotOnCurrentPage(target_index.slot));
2086 if (target_view) 2079 if (target_view)
2087 target_view->SetAsAttemptedFolderTarget(is_target_folder); 2080 target_view->SetAsAttemptedFolderTarget(is_target_folder);
2088 } 2081 }
2089 2082
2090 } // namespace app_list 2083 } // namespace app_list
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698