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 | 8 |
| 9 #include "ui/app_list/app_list_item_model.h" |
9 #include "ui/app_list/apps_grid_view_delegate.h" | 10 #include "ui/app_list/apps_grid_view_delegate.h" |
10 #include "ui/app_list/pagination_model.h" | 11 #include "ui/app_list/pagination_model.h" |
| 12 #include "ui/app_list/views/app_list_dnd_host.h" |
11 #include "ui/app_list/views/app_list_item_view.h" | 13 #include "ui/app_list/views/app_list_item_view.h" |
12 #include "ui/app_list/views/page_switcher.h" | 14 #include "ui/app_list/views/page_switcher.h" |
13 #include "ui/app_list/views/pulsing_block_view.h" | 15 #include "ui/app_list/views/pulsing_block_view.h" |
14 #include "ui/base/animation/animation.h" | 16 #include "ui/base/animation/animation.h" |
15 #include "ui/base/events/event.h" | 17 #include "ui/base/events/event.h" |
16 #include "ui/views/border.h" | 18 #include "ui/views/border.h" |
17 #include "ui/views/view_model_utils.h" | 19 #include "ui/views/view_model_utils.h" |
18 #include "ui/views/widget/widget.h" | 20 #include "ui/views/widget/widget.h" |
19 | 21 |
20 #if defined(USE_AURA) | 22 #if defined(USE_AURA) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 PaginationModel* pagination_model) | 103 PaginationModel* pagination_model) |
102 : model_(NULL), | 104 : model_(NULL), |
103 delegate_(delegate), | 105 delegate_(delegate), |
104 pagination_model_(pagination_model), | 106 pagination_model_(pagination_model), |
105 page_switcher_view_(new PageSwitcher(pagination_model)), | 107 page_switcher_view_(new PageSwitcher(pagination_model)), |
106 cols_(0), | 108 cols_(0), |
107 rows_per_page_(0), | 109 rows_per_page_(0), |
108 selected_view_(NULL), | 110 selected_view_(NULL), |
109 drag_view_(NULL), | 111 drag_view_(NULL), |
110 drag_pointer_(NONE), | 112 drag_pointer_(NONE), |
| 113 dnd_host_(NULL), |
| 114 dnd_host_dispatched_drag_(false), |
111 page_flip_target_(-1), | 115 page_flip_target_(-1), |
112 page_flip_delay_in_ms_(kPageFlipDelayInMs), | 116 page_flip_delay_in_ms_(kPageFlipDelayInMs), |
113 ALLOW_THIS_IN_INITIALIZER_LIST(bounds_animator_(this)) { | 117 ALLOW_THIS_IN_INITIALIZER_LIST(bounds_animator_(this)) { |
114 pagination_model_->AddObserver(this); | 118 pagination_model_->AddObserver(this); |
115 AddChildView(page_switcher_view_); | 119 AddChildView(page_switcher_view_); |
116 } | 120 } |
117 | 121 |
118 AppsGridView::~AppsGridView() { | 122 AppsGridView::~AppsGridView() { |
119 if (model_) { | 123 if (model_) { |
120 model_->RemoveObserver(this); | 124 model_->RemoveObserver(this); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 | 174 |
171 void AppsGridView::EnsureViewVisible(const views::View* view) { | 175 void AppsGridView::EnsureViewVisible(const views::View* view) { |
172 if (pagination_model_->has_transition()) | 176 if (pagination_model_->has_transition()) |
173 return; | 177 return; |
174 | 178 |
175 Index index = GetIndexOfView(view); | 179 Index index = GetIndexOfView(view); |
176 if (IsValidIndex(index)) | 180 if (IsValidIndex(index)) |
177 pagination_model_->SelectPage(index.page, false); | 181 pagination_model_->SelectPage(index.page, false); |
178 } | 182 } |
179 | 183 |
180 void AppsGridView::InitiateDrag(views::View* view, | 184 void AppsGridView::InitiateDrag(AppListItemView* view, |
181 Pointer pointer, | 185 Pointer pointer, |
182 const ui::LocatedEvent& event) { | 186 const ui::LocatedEvent& event) { |
183 if (drag_view_ || pulsing_blocks_model_.view_size()) | 187 if (drag_view_ || pulsing_blocks_model_.view_size()) |
184 return; | 188 return; |
185 | 189 |
186 drag_view_ = view; | 190 drag_view_ = view; |
187 drag_start_ = event.location(); | 191 drag_start_ = event.location(); |
188 } | 192 } |
189 | 193 |
190 void AppsGridView::UpdateDrag(views::View* view, | 194 void AppsGridView::UpdateDrag(AppListItemView* view, |
191 Pointer pointer, | 195 Pointer pointer, |
192 const ui::LocatedEvent& event) { | 196 const ui::LocatedEvent& event) { |
193 if (!dragging() && drag_view_ && | 197 if (!dragging() && drag_view_ && |
194 ExceededDragThreshold(event.location() - drag_start_)) { | 198 ExceededDragThreshold(event.location() - drag_start_)) { |
195 drag_pointer_ = pointer; | 199 drag_pointer_ = pointer; |
196 // Move the view to the front so that it appears on top of other views. | 200 // Move the view to the front so that it appears on top of other views. |
197 ReorderChildView(drag_view_, -1); | 201 ReorderChildView(drag_view_, -1); |
198 bounds_animator_.StopAnimatingView(drag_view_); | 202 bounds_animator_.StopAnimatingView(drag_view_); |
199 } | 203 } |
200 if (drag_pointer_ != pointer) | 204 if (drag_pointer_ != pointer) |
201 return; | 205 return; |
202 | 206 |
| 207 // If a dnd host is provided, see if the drag operation needs to be forwarded. |
| 208 DispatchDragEventToDnDHost(event); |
203 ExtractDragLocation(event, &last_drag_point_); | 209 ExtractDragLocation(event, &last_drag_point_); |
204 | 210 |
205 const Index last_drop_target = drop_target_; | 211 const Index last_drop_target = drop_target_; |
206 CalculateDropTarget(last_drag_point_, false); | 212 CalculateDropTarget(last_drag_point_, false); |
207 MaybeStartPageFlipTimer(last_drag_point_); | 213 MaybeStartPageFlipTimer(last_drag_point_); |
208 | 214 |
209 gfx::Point page_switcher_point(last_drag_point_); | 215 gfx::Point page_switcher_point(last_drag_point_); |
210 views::View::ConvertPointToTarget(this, page_switcher_view_, | 216 views::View::ConvertPointToTarget(this, page_switcher_view_, |
211 &page_switcher_point); | 217 &page_switcher_point); |
212 page_switcher_view_->UpdateUIForDragPoint(page_switcher_point); | 218 page_switcher_view_->UpdateUIForDragPoint(page_switcher_point); |
213 | 219 |
214 if (last_drop_target != drop_target_) | 220 if (last_drop_target != drop_target_) |
215 AnimateToIdealBounds(); | 221 AnimateToIdealBounds(); |
216 drag_view_->SetPosition( | 222 drag_view_->SetPosition( |
217 gfx::PointAtOffsetFromOrigin(last_drag_point_ - drag_start_)); | 223 gfx::PointAtOffsetFromOrigin(last_drag_point_ - drag_start_)); |
218 } | 224 } |
219 | 225 |
220 void AppsGridView::EndDrag(bool cancel) { | 226 void AppsGridView::EndDrag(bool cancel) { |
221 if (!cancel && dragging() && drag_view_) { | 227 if (dnd_host_dispatched_drag_) { |
| 228 dnd_host_dispatched_drag_ = false; |
| 229 dnd_host_->EndDrag(cancel); |
| 230 } else if (!cancel && dragging() && drag_view_) { |
222 CalculateDropTarget(last_drag_point_, true); | 231 CalculateDropTarget(last_drag_point_, true); |
223 if (IsValidIndex(drop_target_)) | 232 if (IsValidIndex(drop_target_)) |
224 MoveItemInModel(drag_view_, drop_target_); | 233 MoveItemInModel(drag_view_, drop_target_); |
225 } | 234 } |
226 | 235 |
227 drag_pointer_ = NONE; | 236 drag_pointer_ = NONE; |
228 drop_target_ = Index(); | 237 drop_target_ = Index(); |
229 if (drag_view_) { | 238 if (drag_view_) { |
230 drag_view_ = NULL; | 239 drag_view_ = NULL; |
231 AnimateToIdealBounds(); | 240 AnimateToIdealBounds(); |
232 } | 241 } |
233 | 242 |
234 page_flip_timer_.Stop(); | 243 page_flip_timer_.Stop(); |
235 page_flip_target_ = -1; | 244 page_flip_target_ = -1; |
236 } | 245 } |
237 | 246 |
238 bool AppsGridView::IsDraggedView(const views::View* view) const { | 247 bool AppsGridView::IsDraggedView(const views::View* view) const { |
239 return drag_view_ == view; | 248 return drag_view_ == view; |
240 } | 249 } |
241 | 250 |
| 251 void AppsGridView::SetAppListDnDHost(ApplicationDnDHost* dnd_host) { |
| 252 dnd_host_ = dnd_host; |
| 253 } |
| 254 |
242 void AppsGridView::Prerender(int page_index) { | 255 void AppsGridView::Prerender(int page_index) { |
243 Layout(); | 256 Layout(); |
244 int start = std::max(0, (page_index - kPrerenderPages) * tiles_per_page()); | 257 int start = std::max(0, (page_index - kPrerenderPages) * tiles_per_page()); |
245 int end = std::min(view_model_.view_size(), | 258 int end = std::min(view_model_.view_size(), |
246 (page_index + 1 + kPrerenderPages) * tiles_per_page()); | 259 (page_index + 1 + kPrerenderPages) * tiles_per_page()); |
247 for (int i = start; i < end; i++) { | 260 for (int i = start; i < end; i++) { |
248 AppListItemView* v = static_cast<AppListItemView*>(view_model_.view_at(i)); | 261 AppListItemView* v = static_cast<AppListItemView*>(view_model_.view_at(i)); |
249 v->Prerender(); | 262 v->Prerender(); |
250 } | 263 } |
251 } | 264 } |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 } | 665 } |
653 | 666 |
654 // Limits to the last possible slot on last page. | 667 // Limits to the last possible slot on last page. |
655 if (drop_target_.page == pagination_model_->total_pages() - 1) { | 668 if (drop_target_.page == pagination_model_->total_pages() - 1) { |
656 drop_target_.slot = std::min( | 669 drop_target_.slot = std::min( |
657 (view_model_.view_size() - 1) % tiles_per_page(), | 670 (view_model_.view_size() - 1) % tiles_per_page(), |
658 drop_target_.slot); | 671 drop_target_.slot); |
659 } | 672 } |
660 } | 673 } |
661 | 674 |
| 675 void AppsGridView::DispatchDragEventToDnDHost(const ui::LocatedEvent& event) { |
| 676 if (!drag_view_ || !dnd_host_) |
| 677 return; |
| 678 if (bounds().Contains(last_drag_point_)) { |
| 679 // The event was issued inside the app menu and we should get all events. |
| 680 if (dnd_host_dispatched_drag_) { |
| 681 // The DnD host was previously called and needs to be informed that the |
| 682 // session returns to the owner. |
| 683 dnd_host_dispatched_drag_ = false; |
| 684 dnd_host_->EndDrag(true); |
| 685 } |
| 686 } else { |
| 687 // The event happened outside our app menu and we might need to dispatch. |
| 688 if (dnd_host_dispatched_drag_) { |
| 689 // Dispatch since we have already started. |
| 690 if (!dnd_host_->Drag(event.root_location())) { |
| 691 // The host is not active any longer and we cancel the operation. |
| 692 dnd_host_dispatched_drag_ = false; |
| 693 dnd_host_->EndDrag(true); |
| 694 } |
| 695 } else { |
| 696 if (dnd_host_->StartDrag(drag_view_->model()->app_id(), |
| 697 event.root_location())) { |
| 698 // From now on we forward the drag events. |
| 699 dnd_host_dispatched_drag_ = true; |
| 700 // Any flip operations are stopped. |
| 701 page_flip_timer_.Stop(); |
| 702 page_flip_target_ = -1; |
| 703 } |
| 704 } |
| 705 } |
| 706 } |
| 707 |
662 void AppsGridView::MaybeStartPageFlipTimer(const gfx::Point& drag_point) { | 708 void AppsGridView::MaybeStartPageFlipTimer(const gfx::Point& drag_point) { |
663 int new_page_flip_target = -1; | 709 int new_page_flip_target = -1; |
664 | 710 |
665 if (page_switcher_view_->bounds().Contains(drag_point)) { | 711 if (page_switcher_view_->bounds().Contains(drag_point)) { |
666 gfx::Point page_switcher_point(drag_point); | 712 gfx::Point page_switcher_point(drag_point); |
667 views::View::ConvertPointToTarget(this, page_switcher_view_, | 713 views::View::ConvertPointToTarget(this, page_switcher_view_, |
668 &page_switcher_point); | 714 &page_switcher_point); |
669 new_page_flip_target = | 715 new_page_flip_target = |
670 page_switcher_view_->GetPageForPoint(page_switcher_point); | 716 page_switcher_view_->GetPageForPoint(page_switcher_point); |
671 } | 717 } |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 Layout(); | 845 Layout(); |
800 } | 846 } |
801 | 847 |
802 void AppsGridView::OnAppListModelStatusChanged() { | 848 void AppsGridView::OnAppListModelStatusChanged() { |
803 UpdatePulsingBlockViews(); | 849 UpdatePulsingBlockViews(); |
804 Layout(); | 850 Layout(); |
805 SchedulePaint(); | 851 SchedulePaint(); |
806 } | 852 } |
807 | 853 |
808 } // namespace app_list | 854 } // namespace app_list |
OLD | NEW |