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/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 11 matching lines...) Expand all Loading... |
22 #include "ui/app_list/views/apps_grid_view_delegate.h" | 22 #include "ui/app_list/views/apps_grid_view_delegate.h" |
23 #include "ui/app_list/views/page_switcher.h" | 23 #include "ui/app_list/views/page_switcher.h" |
24 #include "ui/app_list/views/pulsing_block_view.h" | 24 #include "ui/app_list/views/pulsing_block_view.h" |
25 #include "ui/app_list/views/top_icon_animation_view.h" | 25 #include "ui/app_list/views/top_icon_animation_view.h" |
26 #include "ui/compositor/scoped_layer_animation_settings.h" | 26 #include "ui/compositor/scoped_layer_animation_settings.h" |
27 #include "ui/events/event.h" | 27 #include "ui/events/event.h" |
28 #include "ui/gfx/animation/animation.h" | 28 #include "ui/gfx/animation/animation.h" |
29 #include "ui/gfx/geometry/vector2d.h" | 29 #include "ui/gfx/geometry/vector2d.h" |
30 #include "ui/gfx/geometry/vector2d_conversions.h" | 30 #include "ui/gfx/geometry/vector2d_conversions.h" |
31 #include "ui/views/border.h" | 31 #include "ui/views/border.h" |
| 32 #include "ui/views/controls/label.h" |
32 #include "ui/views/view_model_utils.h" | 33 #include "ui/views/view_model_utils.h" |
33 #include "ui/views/widget/widget.h" | 34 #include "ui/views/widget/widget.h" |
34 | 35 |
35 #if defined(USE_AURA) | 36 #if defined(USE_AURA) |
36 #include "ui/aura/window.h" | 37 #include "ui/aura/window.h" |
37 #include "ui/aura/window_event_dispatcher.h" | 38 #include "ui/aura/window_event_dispatcher.h" |
38 #if defined(OS_WIN) | |
39 #include "ui/views/win/hwnd_util.h" | |
40 #endif // defined(OS_WIN) | |
41 #endif // defined(USE_AURA) | 39 #endif // defined(USE_AURA) |
42 | 40 |
43 #if defined(OS_WIN) | |
44 #include "base/command_line.h" | |
45 #include "base/files/file_path.h" | |
46 #include "base/win/shortcut.h" | |
47 #include "ui/base/dragdrop/drag_utils.h" | |
48 #include "ui/base/dragdrop/drop_target_win.h" | |
49 #include "ui/base/dragdrop/os_exchange_data.h" | |
50 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" | |
51 #include "ui/display/win/screen_win.h" | |
52 #endif | |
53 | |
54 namespace app_list { | 41 namespace app_list { |
55 | 42 |
56 namespace { | 43 namespace { |
57 | 44 |
58 // Distance a drag needs to be from the app grid to be considered 'outside', at | 45 // Distance a drag needs to be from the app grid to be considered 'outside', at |
59 // which point we rearrange the apps to their pre-drag configuration, as a drop | 46 // which point we rearrange the apps to their pre-drag configuration, as a drop |
60 // then would be canceled. We have a buffer to make it easier to drag apps to | 47 // then would be canceled. We have a buffer to make it easier to drag apps to |
61 // other pages. | 48 // other pages. |
62 const int kDragBufferPx = 20; | 49 const int kDragBufferPx = 20; |
63 | 50 |
(...skipping 15 matching lines...) Expand all Loading... |
79 const int kExperimentalTileLeftRightPadding = 10; | 66 const int kExperimentalTileLeftRightPadding = 10; |
80 const int kExperimentalTileBottomPadding = 6; | 67 const int kExperimentalTileBottomPadding = 6; |
81 const int kExperimentalTileTopPadding = 6; | 68 const int kExperimentalTileTopPadding = 6; |
82 | 69 |
83 // Width in pixels of the area on the sides that triggers a page flip. | 70 // Width in pixels of the area on the sides that triggers a page flip. |
84 const int kPageFlipZoneSize = 40; | 71 const int kPageFlipZoneSize = 40; |
85 | 72 |
86 // Delay in milliseconds to do the page flip. | 73 // Delay in milliseconds to do the page flip. |
87 const int kPageFlipDelayInMs = 1000; | 74 const int kPageFlipDelayInMs = 1000; |
88 | 75 |
89 // How many pages on either side of the selected one we prerender. Currently 0 | |
90 // to test impact of prerendering on UI jank for http://crbug.com/440224. Was 1. | |
91 const int kPrerenderPages = 0; | |
92 | |
93 // The drag and drop proxy should get scaled by this factor. | 76 // The drag and drop proxy should get scaled by this factor. |
94 const float kDragAndDropProxyScale = 1.5f; | 77 const float kDragAndDropProxyScale = 1.5f; |
95 | 78 |
96 // Delays in milliseconds to show folder dropping preview circle. | 79 // Delays in milliseconds to show folder dropping preview circle. |
97 const int kFolderDroppingDelay = 150; | 80 const int kFolderDroppingDelay = 150; |
98 | 81 |
99 // Delays in milliseconds to show re-order preview. | 82 // Delays in milliseconds to show re-order preview. |
100 const int kReorderDelay = 120; | 83 const int kReorderDelay = 120; |
101 | 84 |
102 // Delays in milliseconds to show folder item reparent UI. | 85 // Delays in milliseconds to show folder item reparent UI. |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 (static_cast<AppListFolderItem*>(item))->folder_type() == | 209 (static_cast<AppListFolderItem*>(item))->folder_type() == |
227 AppListFolderItem::FOLDER_TYPE_OEM; | 210 AppListFolderItem::FOLDER_TYPE_OEM; |
228 } | 211 } |
229 | 212 |
230 int ClampToRange(int value, int min, int max) { | 213 int ClampToRange(int value, int min, int max) { |
231 return std::min(std::max(value, min), max); | 214 return std::min(std::max(value, min), max); |
232 } | 215 } |
233 | 216 |
234 } // namespace | 217 } // namespace |
235 | 218 |
236 #if defined(OS_WIN) | |
237 // Interprets drag events sent from Windows via the drag/drop API and forwards | |
238 // them to AppsGridView. | |
239 // On Windows, in order to have the OS perform the drag properly we need to | |
240 // provide it with a shortcut file which may or may not exist at the time the | |
241 // drag is started. Therefore while waiting for that shortcut to be located we | |
242 // just do a regular "internal" drag and transition into the synchronous drag | |
243 // when the shortcut is found/created. Hence a synchronous drag is an optional | |
244 // phase of a regular drag and non-Windows platforms drags are equivalent to a | |
245 // Windows drag that never enters the synchronous drag phase. | |
246 class SynchronousDrag : public ui::DragSourceWin { | |
247 public: | |
248 SynchronousDrag(AppsGridView* grid_view, | |
249 AppListItemView* drag_view, | |
250 const gfx::Point& drag_view_offset) | |
251 : grid_view_(grid_view), | |
252 drag_view_(drag_view), | |
253 drag_view_offset_(drag_view_offset), | |
254 has_shortcut_path_(false), | |
255 running_(false), | |
256 canceled_(false) {} | |
257 | |
258 void set_shortcut_path(const base::FilePath& shortcut_path) { | |
259 has_shortcut_path_ = true; | |
260 shortcut_path_ = shortcut_path; | |
261 } | |
262 | |
263 bool running() { return running_; } | |
264 | |
265 bool CanRun() { | |
266 return has_shortcut_path_ && !running_; | |
267 } | |
268 | |
269 void Run() { | |
270 DCHECK(CanRun()); | |
271 | |
272 // Prevent the synchronous dragger being destroyed while the drag is | |
273 // running. | |
274 Microsoft::WRL::ComPtr<SynchronousDrag> this_ref = this; | |
275 running_ = true; | |
276 | |
277 ui::OSExchangeData data; | |
278 SetupExchangeData(&data); | |
279 | |
280 // Hide the dragged view because the OS is going to create its own. | |
281 drag_view_->SetVisible(false); | |
282 | |
283 // Blocks until the drag is finished. Calls into the ui::DragSourceWin | |
284 // methods. | |
285 DWORD effects; | |
286 DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data), | |
287 this, DROPEFFECT_MOVE | DROPEFFECT_LINK, &effects); | |
288 | |
289 // If |drag_view_| is NULL the drag was ended by some reentrant code. | |
290 if (drag_view_) { | |
291 // Make the drag view visible again. | |
292 drag_view_->SetVisible(true); | |
293 drag_view_->OnSyncDragEnd(); | |
294 | |
295 grid_view_->EndDrag(canceled_ || !IsCursorWithinGridView()); | |
296 } | |
297 } | |
298 | |
299 void EndDragExternally() { | |
300 CancelDrag(); | |
301 DCHECK(drag_view_); | |
302 drag_view_->SetVisible(true); | |
303 drag_view_ = NULL; | |
304 } | |
305 | |
306 private: | |
307 // Overridden from ui::DragSourceWin. | |
308 void OnDragSourceCancel() override { canceled_ = true; } | |
309 | |
310 void OnDragSourceDrop() override {} | |
311 | |
312 void OnDragSourceMove() override { | |
313 grid_view_->UpdateDrag(AppsGridView::MOUSE, GetCursorInGridViewCoords()); | |
314 } | |
315 | |
316 void SetupExchangeData(ui::OSExchangeData* data) { | |
317 data->SetFilename(shortcut_path_); | |
318 drag_utils::SetDragImageOnDataObject( | |
319 drag_view_->GetDragImage(), | |
320 drag_view_offset_ - drag_view_->GetDragImageOffset(), data); | |
321 } | |
322 | |
323 HWND GetGridViewHWND() { | |
324 return views::HWNDForView(grid_view_); | |
325 } | |
326 | |
327 bool IsCursorWithinGridView() { | |
328 POINT p; | |
329 GetCursorPos(&p); | |
330 return GetGridViewHWND() == WindowFromPoint(p); | |
331 } | |
332 | |
333 gfx::Point GetCursorInGridViewCoords() { | |
334 POINT p; | |
335 GetCursorPos(&p); | |
336 ScreenToClient(GetGridViewHWND(), &p); | |
337 gfx::Point grid_view_pt(p.x, p.y); | |
338 grid_view_pt = | |
339 display::win::ScreenWin::ClientToDIPPoint(GetGridViewHWND(), | |
340 grid_view_pt); | |
341 views::View::ConvertPointFromWidget(grid_view_, &grid_view_pt); | |
342 return grid_view_pt; | |
343 } | |
344 | |
345 AppsGridView* grid_view_; | |
346 AppListItemView* drag_view_; | |
347 gfx::Point drag_view_offset_; | |
348 bool has_shortcut_path_; | |
349 base::FilePath shortcut_path_; | |
350 bool running_; | |
351 bool canceled_; | |
352 | |
353 DISALLOW_COPY_AND_ASSIGN(SynchronousDrag); | |
354 }; | |
355 #endif // defined(OS_WIN) | |
356 | |
357 AppsGridView::AppsGridView(AppsGridViewDelegate* delegate) | 219 AppsGridView::AppsGridView(AppsGridViewDelegate* delegate) |
358 : model_(NULL), | 220 : model_(NULL), |
359 item_list_(NULL), | 221 item_list_(NULL), |
360 delegate_(delegate), | 222 delegate_(delegate), |
361 folder_delegate_(NULL), | 223 folder_delegate_(NULL), |
362 page_switcher_view_(NULL), | 224 page_switcher_view_(NULL), |
363 cols_(0), | 225 cols_(0), |
364 rows_per_page_(0), | 226 rows_per_page_(0), |
365 selected_view_(NULL), | 227 selected_view_(NULL), |
366 drag_view_(NULL), | 228 drag_view_(NULL), |
367 drag_start_page_(-1), | 229 drag_start_page_(-1), |
368 #if defined(OS_WIN) | |
369 use_synchronous_drag_(true), | |
370 #endif | |
371 drag_pointer_(NONE), | 230 drag_pointer_(NONE), |
372 drop_attempt_(DROP_FOR_NONE), | 231 drop_attempt_(DROP_FOR_NONE), |
373 drag_and_drop_host_(NULL), | 232 drag_and_drop_host_(NULL), |
374 forward_events_to_drag_and_drop_host_(false), | 233 forward_events_to_drag_and_drop_host_(false), |
375 page_flip_target_(-1), | 234 page_flip_target_(-1), |
376 page_flip_delay_in_ms_(kPageFlipDelayInMs), | 235 page_flip_delay_in_ms_(kPageFlipDelayInMs), |
377 bounds_animator_(this), | 236 bounds_animator_(this), |
378 activated_folder_item_view_(NULL), | 237 activated_folder_item_view_(NULL), |
379 dragging_for_reparent_item_(false) { | 238 dragging_for_reparent_item_(false) { |
380 SetPaintToLayer(true); | 239 SetPaintToLayer(true); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 | 362 |
504 drag_view_ = view; | 363 drag_view_ = view; |
505 drag_view_init_index_ = GetIndexOfView(drag_view_); | 364 drag_view_init_index_ = GetIndexOfView(drag_view_); |
506 drag_view_offset_ = event.location(); | 365 drag_view_offset_ = event.location(); |
507 drag_start_page_ = pagination_model_.selected_page(); | 366 drag_start_page_ = pagination_model_.selected_page(); |
508 reorder_placeholder_ = drag_view_init_index_; | 367 reorder_placeholder_ = drag_view_init_index_; |
509 ExtractDragLocation(event, &drag_start_grid_view_); | 368 ExtractDragLocation(event, &drag_start_grid_view_); |
510 drag_view_start_ = gfx::Point(drag_view_->x(), drag_view_->y()); | 369 drag_view_start_ = gfx::Point(drag_view_->x(), drag_view_->y()); |
511 } | 370 } |
512 | 371 |
513 void AppsGridView::StartSettingUpSynchronousDrag() { | |
514 #if defined(OS_WIN) | |
515 if (!delegate_ || !use_synchronous_drag_) | |
516 return; | |
517 | |
518 // Folders and downloading items can't be integrated with the OS. | |
519 if (IsFolderItem(drag_view_->item()) || drag_view_->item()->is_installing()) | |
520 return; | |
521 | |
522 // Favor the drag and drop host over native win32 drag. For the Win8/ash | |
523 // launcher we want to have ashes drag and drop over win32's. | |
524 if (drag_and_drop_host_) | |
525 return; | |
526 | |
527 // Never create a second synchronous drag if the drag started in a folder. | |
528 if (IsDraggingForReparentInRootLevelGridView()) | |
529 return; | |
530 | |
531 synchronous_drag_ = Microsoft::WRL::Make<SynchronousDrag>(this, drag_view_, | |
532 drag_view_offset_); | |
533 delegate_->GetShortcutPathForApp(drag_view_->item()->id(), | |
534 base::Bind(&AppsGridView::OnGotShortcutPath, | |
535 base::Unretained(this), | |
536 synchronous_drag_)); | |
537 #endif | |
538 } | |
539 | |
540 bool AppsGridView::RunSynchronousDrag() { | |
541 #if defined(OS_WIN) | |
542 if (!synchronous_drag_.Get()) | |
543 return false; | |
544 | |
545 if (synchronous_drag_->CanRun()) { | |
546 if (IsDraggingForReparentInHiddenGridView()) | |
547 folder_delegate_->SetRootLevelDragViewVisible(false); | |
548 synchronous_drag_->Run(); | |
549 synchronous_drag_ = nullptr; | |
550 return true; | |
551 } else if (!synchronous_drag_->running()) { | |
552 // The OS drag is not ready yet. If the root grid has a drag view because | |
553 // a reparent has started, ensure it is visible. | |
554 if (IsDraggingForReparentInHiddenGridView()) | |
555 folder_delegate_->SetRootLevelDragViewVisible(true); | |
556 } | |
557 #endif | |
558 return false; | |
559 } | |
560 | |
561 void AppsGridView::CleanUpSynchronousDrag() { | |
562 #if defined(OS_WIN) | |
563 if (synchronous_drag_.Get()) | |
564 synchronous_drag_->EndDragExternally(); | |
565 | |
566 synchronous_drag_ = nullptr; | |
567 #endif | |
568 } | |
569 | |
570 #if defined(OS_WIN) | |
571 void AppsGridView::OnGotShortcutPath( | |
572 Microsoft::WRL::ComPtr<SynchronousDrag> synchronous_drag, | |
573 const base::FilePath& path) { | |
574 // Drag may have ended before we get the shortcut path or a new drag may have | |
575 // begun. | |
576 if (synchronous_drag_ != synchronous_drag) | |
577 return; | |
578 // Setting the shortcut path here means the next time we hit UpdateDrag() | |
579 // we'll enter the synchronous drag. | |
580 // NOTE we don't Run() the drag here because that causes animations not to | |
581 // update for some reason. | |
582 synchronous_drag_->set_shortcut_path(path); | |
583 DCHECK(synchronous_drag_->CanRun()); | |
584 } | |
585 #endif | |
586 | |
587 bool AppsGridView::UpdateDragFromItem(Pointer pointer, | 372 bool AppsGridView::UpdateDragFromItem(Pointer pointer, |
588 const ui::LocatedEvent& event) { | 373 const ui::LocatedEvent& event) { |
589 if (!drag_view_) | 374 if (!drag_view_) |
590 return false; // Drag canceled. | 375 return false; // Drag canceled. |
591 | 376 |
592 gfx::Point drag_point_in_grid_view; | 377 gfx::Point drag_point_in_grid_view; |
593 ExtractDragLocation(event, &drag_point_in_grid_view); | 378 ExtractDragLocation(event, &drag_point_in_grid_view); |
594 UpdateDrag(pointer, drag_point_in_grid_view); | 379 UpdateDrag(pointer, drag_point_in_grid_view); |
595 if (!dragging()) | 380 if (!dragging()) |
596 return false; | 381 return false; |
597 | 382 |
598 // If a drag and drop host is provided, see if the drag operation needs to be | 383 // If a drag and drop host is provided, see if the drag operation needs to be |
599 // forwarded. | 384 // forwarded. |
600 gfx::Point location_in_screen = drag_point_in_grid_view; | 385 gfx::Point location_in_screen = drag_point_in_grid_view; |
601 views::View::ConvertPointToScreen(this, &location_in_screen); | 386 views::View::ConvertPointToScreen(this, &location_in_screen); |
602 DispatchDragEventToDragAndDropHost(location_in_screen); | 387 DispatchDragEventToDragAndDropHost(location_in_screen); |
603 if (drag_and_drop_host_) | 388 if (drag_and_drop_host_) |
604 drag_and_drop_host_->UpdateDragIconProxy(location_in_screen); | 389 drag_and_drop_host_->UpdateDragIconProxy(location_in_screen); |
605 return true; | 390 return true; |
606 } | 391 } |
607 | 392 |
608 void AppsGridView::UpdateDrag(Pointer pointer, const gfx::Point& point) { | 393 void AppsGridView::UpdateDrag(Pointer pointer, const gfx::Point& point) { |
609 if (folder_delegate_) | 394 if (folder_delegate_) |
610 UpdateDragStateInsideFolder(pointer, point); | 395 UpdateDragStateInsideFolder(pointer, point); |
611 | 396 |
612 if (!drag_view_) | 397 if (!drag_view_) |
613 return; // Drag canceled. | 398 return; // Drag canceled. |
614 | 399 |
615 if (RunSynchronousDrag()) | |
616 return; | |
617 | |
618 gfx::Vector2d drag_vector(point - drag_start_grid_view_); | 400 gfx::Vector2d drag_vector(point - drag_start_grid_view_); |
619 if (!dragging() && ExceededDragThreshold(drag_vector)) { | 401 if (!dragging() && ExceededDragThreshold(drag_vector)) { |
620 drag_pointer_ = pointer; | 402 drag_pointer_ = pointer; |
621 // Move the view to the front so that it appears on top of other views. | 403 // Move the view to the front so that it appears on top of other views. |
622 ReorderChildView(drag_view_, -1); | 404 ReorderChildView(drag_view_, -1); |
623 bounds_animator_.StopAnimatingView(drag_view_); | 405 bounds_animator_.StopAnimatingView(drag_view_); |
624 // Stopping the animation may have invalidated our drag view due to the | 406 // Stopping the animation may have invalidated our drag view due to the |
625 // view hierarchy changing. | 407 // view hierarchy changing. |
626 if (!drag_view_) | 408 if (!drag_view_) |
627 return; | 409 return; |
628 | 410 |
629 StartSettingUpSynchronousDrag(); | |
630 if (!dragging_for_reparent_item_) | 411 if (!dragging_for_reparent_item_) |
631 StartDragAndDropHostDrag(point); | 412 StartDragAndDropHostDrag(point); |
632 } | 413 } |
633 | 414 |
634 if (drag_pointer_ != pointer) | 415 if (drag_pointer_ != pointer) |
635 return; | 416 return; |
636 | 417 |
637 drag_view_->SetPosition(drag_view_start_ + drag_vector); | 418 drag_view_->SetPosition(drag_view_start_ + drag_vector); |
638 | 419 |
639 last_drag_point_ = point; | 420 last_drag_point_ = point; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 int i = reorder_drop_target_.slot; | 508 int i = reorder_drop_target_.slot; |
728 gfx::Rect bounds = view_model_.ideal_bounds(i); | 509 gfx::Rect bounds = view_model_.ideal_bounds(i); |
729 drag_view_->SetBoundsRect(bounds); | 510 drag_view_->SetBoundsRect(bounds); |
730 } | 511 } |
731 // Fade in slowly if it landed in the shelf. | 512 // Fade in slowly if it landed in the shelf. |
732 SetViewHidden(drag_view_, false /* show */, | 513 SetViewHidden(drag_view_, false /* show */, |
733 !landed_in_drag_and_drop_host /* animate */); | 514 !landed_in_drag_and_drop_host /* animate */); |
734 } | 515 } |
735 } | 516 } |
736 | 517 |
737 // The drag can be ended after the synchronous drag is created but before it | |
738 // is Run(). | |
739 CleanUpSynchronousDrag(); | |
740 | |
741 SetAsFolderDroppingTarget(folder_drop_target_, false); | 518 SetAsFolderDroppingTarget(folder_drop_target_, false); |
742 ClearDragState(); | 519 ClearDragState(); |
743 AnimateToIdealBounds(); | 520 AnimateToIdealBounds(); |
744 | 521 |
745 StopPageFlipTimer(); | 522 StopPageFlipTimer(); |
746 | 523 |
747 // If user releases mouse inside a folder's grid view, burst the folder | 524 // If user releases mouse inside a folder's grid view, burst the folder |
748 // container ink bubble. | 525 // container ink bubble. |
749 if (folder_delegate_ && !IsDraggingForReparentInHiddenGridView()) | 526 if (folder_delegate_ && !IsDraggingForReparentInHiddenGridView()) |
750 folder_delegate_->UpdateFolderViewBackground(false); | 527 folder_delegate_->UpdateFolderViewBackground(false); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 void AppsGridView::SetDragViewVisible(bool visible) { | 640 void AppsGridView::SetDragViewVisible(bool visible) { |
864 DCHECK(drag_view_); | 641 DCHECK(drag_view_); |
865 SetViewHidden(drag_view_, !visible, true); | 642 SetViewHidden(drag_view_, !visible, true); |
866 } | 643 } |
867 | 644 |
868 void AppsGridView::SetDragAndDropHostOfCurrentAppList( | 645 void AppsGridView::SetDragAndDropHostOfCurrentAppList( |
869 ApplicationDragAndDropHost* drag_and_drop_host) { | 646 ApplicationDragAndDropHost* drag_and_drop_host) { |
870 drag_and_drop_host_ = drag_and_drop_host; | 647 drag_and_drop_host_ = drag_and_drop_host; |
871 } | 648 } |
872 | 649 |
873 void AppsGridView::Prerender() { | |
874 Layout(); | |
875 int selected_page = std::max(0, pagination_model_.selected_page()); | |
876 int start = std::max(0, (selected_page - kPrerenderPages) * tiles_per_page()); | |
877 int end = std::min(view_model_.view_size(), | |
878 (selected_page + 1 + kPrerenderPages) * tiles_per_page()); | |
879 for (int i = start; i < end; i++) | |
880 GetItemViewAt(i)->Prerender(); | |
881 } | |
882 | |
883 bool AppsGridView::IsAnimatingView(AppListItemView* view) { | 650 bool AppsGridView::IsAnimatingView(AppListItemView* view) { |
884 return bounds_animator_.IsAnimating(view); | 651 return bounds_animator_.IsAnimating(view); |
885 } | 652 } |
886 | 653 |
887 gfx::Size AppsGridView::GetPreferredSize() const { | 654 gfx::Size AppsGridView::GetPreferredSize() const { |
888 const gfx::Insets insets(GetInsets()); | 655 const gfx::Insets insets(GetInsets()); |
889 // If we are in a folder, ignore the page switcher for height calculations. | 656 // If we are in a folder, ignore the page switcher for height calculations. |
890 int page_switcher_height = | 657 int page_switcher_height = |
891 folder_delegate_ ? 0 : page_switcher_view_->GetPreferredSize().height(); | 658 folder_delegate_ ? 0 : page_switcher_view_->GetPreferredSize().height(); |
892 gfx::Size size = GetTileGridSize(); | 659 gfx::Size size = GetTileGridSize(); |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1468 if (drop_attempt_ == DROP_FOR_REORDER) { | 1235 if (drop_attempt_ == DROP_FOR_REORDER) { |
1469 reorder_placeholder_ = reorder_drop_target_; | 1236 reorder_placeholder_ = reorder_drop_target_; |
1470 AnimateToIdealBounds(); | 1237 AnimateToIdealBounds(); |
1471 } | 1238 } |
1472 } | 1239 } |
1473 | 1240 |
1474 void AppsGridView::OnFolderItemReparentTimer() { | 1241 void AppsGridView::OnFolderItemReparentTimer() { |
1475 DCHECK(folder_delegate_); | 1242 DCHECK(folder_delegate_); |
1476 if (drag_out_of_folder_container_ && drag_view_) { | 1243 if (drag_out_of_folder_container_ && drag_view_) { |
1477 bool has_native_drag = drag_and_drop_host_ != nullptr; | 1244 bool has_native_drag = drag_and_drop_host_ != nullptr; |
1478 #if defined(OS_WIN) | |
1479 has_native_drag = has_native_drag || synchronous_drag_.Get(); | |
1480 #endif | |
1481 folder_delegate_->ReparentItem( | 1245 folder_delegate_->ReparentItem( |
1482 drag_view_, last_drag_point_, has_native_drag); | 1246 drag_view_, last_drag_point_, has_native_drag); |
1483 | 1247 |
1484 // Set the flag in the folder's grid view. | 1248 // Set the flag in the folder's grid view. |
1485 dragging_for_reparent_item_ = true; | 1249 dragging_for_reparent_item_ = true; |
1486 | 1250 |
1487 // Do not observe any data change since it is going to be hidden. | 1251 // Do not observe any data change since it is going to be hidden. |
1488 item_list_->RemoveObserver(this); | 1252 item_list_->RemoveObserver(this); |
1489 item_list_ = NULL; | 1253 item_list_ = NULL; |
1490 } | 1254 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 } else if (drop_attempt_ == DROP_FOR_FOLDER && | 1345 } else if (drop_attempt_ == DROP_FOR_FOLDER && |
1582 IsValidIndex(folder_drop_target_)) { | 1346 IsValidIndex(folder_drop_target_)) { |
1583 cancel_reparent = | 1347 cancel_reparent = |
1584 !ReparentItemToAnotherFolder(drag_view_, folder_drop_target_); | 1348 !ReparentItemToAnotherFolder(drag_view_, folder_drop_target_); |
1585 } else { | 1349 } else { |
1586 NOTREACHED(); | 1350 NOTREACHED(); |
1587 } | 1351 } |
1588 SetViewHidden(drag_view_, false /* show */, true /* no animate */); | 1352 SetViewHidden(drag_view_, false /* show */, true /* no animate */); |
1589 } | 1353 } |
1590 | 1354 |
1591 // The drag can be ended after the synchronous drag is created but before it | |
1592 // is Run(). | |
1593 CleanUpSynchronousDrag(); | |
1594 | |
1595 SetAsFolderDroppingTarget(folder_drop_target_, false); | 1355 SetAsFolderDroppingTarget(folder_drop_target_, false); |
1596 if (cancel_reparent) { | 1356 if (cancel_reparent) { |
1597 CancelFolderItemReparent(drag_view_); | 1357 CancelFolderItemReparent(drag_view_); |
1598 } else { | 1358 } else { |
1599 // By setting |drag_view_| to NULL here, we prevent ClearDragState() from | 1359 // By setting |drag_view_| to NULL here, we prevent ClearDragState() from |
1600 // cleaning up the newly created AppListItemView, effectively claiming | 1360 // cleaning up the newly created AppListItemView, effectively claiming |
1601 // ownership of the newly created drag view. | 1361 // ownership of the newly created drag view. |
1602 drag_view_->OnDragEnded(); | 1362 drag_view_->OnDragEnded(); |
1603 drag_view_ = NULL; | 1363 drag_view_ = NULL; |
1604 } | 1364 } |
1605 ClearDragState(); | 1365 ClearDragState(); |
1606 AnimateToIdealBounds(); | 1366 AnimateToIdealBounds(); |
1607 | 1367 |
1608 StopPageFlipTimer(); | 1368 StopPageFlipTimer(); |
1609 } | 1369 } |
1610 | 1370 |
1611 void AppsGridView::EndDragForReparentInHiddenFolderGridView() { | 1371 void AppsGridView::EndDragForReparentInHiddenFolderGridView() { |
1612 if (drag_and_drop_host_) { | 1372 if (drag_and_drop_host_) { |
1613 // If we had a drag and drop proxy icon, we delete it and make the real | 1373 // If we had a drag and drop proxy icon, we delete it and make the real |
1614 // item visible again. | 1374 // item visible again. |
1615 drag_and_drop_host_->DestroyDragIconProxy(); | 1375 drag_and_drop_host_->DestroyDragIconProxy(); |
1616 } | 1376 } |
1617 | 1377 |
1618 // The drag can be ended after the synchronous drag is created but before it | |
1619 // is Run(). | |
1620 CleanUpSynchronousDrag(); | |
1621 | |
1622 SetAsFolderDroppingTarget(folder_drop_target_, false); | 1378 SetAsFolderDroppingTarget(folder_drop_target_, false); |
1623 ClearDragState(); | 1379 ClearDragState(); |
1624 } | 1380 } |
1625 | 1381 |
1626 void AppsGridView::OnFolderItemRemoved() { | 1382 void AppsGridView::OnFolderItemRemoved() { |
1627 DCHECK(folder_delegate_); | 1383 DCHECK(folder_delegate_); |
1628 if (item_list_) | 1384 if (item_list_) |
1629 item_list_->RemoveObserver(this); | 1385 item_list_->RemoveObserver(this); |
1630 item_list_ = nullptr; | 1386 item_list_ = nullptr; |
1631 } | 1387 } |
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2179 | 1935 |
2180 void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index, | 1936 void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index, |
2181 bool is_target_folder) { | 1937 bool is_target_folder) { |
2182 AppListItemView* target_view = | 1938 AppListItemView* target_view = |
2183 GetViewDisplayedAtSlotOnCurrentPage(target_index.slot); | 1939 GetViewDisplayedAtSlotOnCurrentPage(target_index.slot); |
2184 if (target_view) | 1940 if (target_view) |
2185 target_view->SetAsAttemptedFolderTarget(is_target_folder); | 1941 target_view->SetAsAttemptedFolderTarget(is_target_folder); |
2186 } | 1942 } |
2187 | 1943 |
2188 } // namespace app_list | 1944 } // namespace app_list |
OLD | NEW |