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

Unified Diff: ui/app_list/views/apps_grid_view.cc

Issue 14533006: Drag and drop between app list and launcher - First patch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: ui/app_list/views/apps_grid_view.cc
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
index 60b3a0c16a747d817dfe3906e68aa838b89d4395..063077dc69dce572b294e16527d65a88a9a7aa47 100644
--- a/ui/app_list/views/apps_grid_view.cc
+++ b/ui/app_list/views/apps_grid_view.cc
@@ -6,8 +6,10 @@
#include <algorithm>
+#include "ui/app_list/app_list_item_model.h"
#include "ui/app_list/apps_grid_view_delegate.h"
#include "ui/app_list/pagination_model.h"
+#include "ui/app_list/views/app_list_dnd_host.h"
#include "ui/app_list/views/app_list_item_view.h"
#include "ui/app_list/views/page_switcher.h"
#include "ui/app_list/views/pulsing_block_view.h"
@@ -108,6 +110,8 @@ AppsGridView::AppsGridView(AppsGridViewDelegate* delegate,
selected_view_(NULL),
drag_view_(NULL),
drag_pointer_(NONE),
+ dnd_host_(NULL),
+ dnd_host_dispatched_drag_(false),
page_flip_target_(-1),
page_flip_delay_in_ms_(kPageFlipDelayInMs),
ALLOW_THIS_IN_INITIALIZER_LIST(bounds_animator_(this)) {
@@ -177,7 +181,7 @@ void AppsGridView::EnsureViewVisible(const views::View* view) {
pagination_model_->SelectPage(index.page, false);
}
-void AppsGridView::InitiateDrag(views::View* view,
+void AppsGridView::InitiateDrag(AppListItemView* view,
Pointer pointer,
const ui::LocatedEvent& event) {
if (drag_view_ || pulsing_blocks_model_.view_size())
@@ -187,7 +191,7 @@ void AppsGridView::InitiateDrag(views::View* view,
drag_start_ = event.location();
}
-void AppsGridView::UpdateDrag(views::View* view,
+void AppsGridView::UpdateDrag(AppListItemView* view,
Pointer pointer,
const ui::LocatedEvent& event) {
if (!dragging() && drag_view_ &&
@@ -200,6 +204,8 @@ void AppsGridView::UpdateDrag(views::View* view,
if (drag_pointer_ != pointer)
return;
+ // If a dnd host is provided, see if the drag operation needs to be forwarded.
+ DispatchDragEventToDnDHost(event);
ExtractDragLocation(event, &last_drag_point_);
const Index last_drop_target = drop_target_;
@@ -218,7 +224,10 @@ void AppsGridView::UpdateDrag(views::View* view,
}
void AppsGridView::EndDrag(bool cancel) {
- if (!cancel && dragging() && drag_view_) {
+ if (dnd_host_dispatched_drag_) {
+ dnd_host_dispatched_drag_ = false;
+ dnd_host_->EndDrag(cancel);
+ } else if (!cancel && dragging() && drag_view_) {
CalculateDropTarget(last_drag_point_, true);
if (IsValidIndex(drop_target_))
MoveItemInModel(drag_view_, drop_target_);
@@ -239,6 +248,10 @@ bool AppsGridView::IsDraggedView(const views::View* view) const {
return drag_view_ == view;
}
+void AppsGridView::SetAppListDnDHost(ApplicationDnDHost* dnd_host) {
+ dnd_host_ = dnd_host;
+}
+
void AppsGridView::Prerender(int page_index) {
Layout();
int start = std::max(0, (page_index - kPrerenderPages) * tiles_per_page());
@@ -659,6 +672,39 @@ void AppsGridView::CalculateDropTarget(const gfx::Point& drag_point,
}
}
+void AppsGridView::DispatchDragEventToDnDHost(const ui::LocatedEvent& event) {
+ if (!drag_view_ || !dnd_host_)
+ return;
+ if (bounds().Contains(last_drag_point_)) {
+ // The event was issued inside the app menu and we should get all events.
+ if (dnd_host_dispatched_drag_) {
+ // The DnD host was previously called and needs to be informed that the
+ // session returns to the owner.
+ dnd_host_dispatched_drag_ = false;
+ dnd_host_->EndDrag(true);
+ }
+ } else {
+ // The event happened outside our app menu and we might need to dispatch.
+ if (dnd_host_dispatched_drag_) {
+ // Dispatch since we have already started.
+ if (!dnd_host_->Drag(event.root_location())) {
+ // The host is not active any longer and we cancel the operation.
+ dnd_host_dispatched_drag_ = false;
+ dnd_host_->EndDrag(true);
+ }
+ } else {
+ if (dnd_host_->StartDrag(drag_view_->model()->app_id(),
+ event.root_location())) {
+ // From now on we forward the drag events.
+ dnd_host_dispatched_drag_ = true;
+ // Any flip operations are stopped.
+ page_flip_timer_.Stop();
+ page_flip_target_ = -1;
+ }
+ }
+ }
+}
+
void AppsGridView::MaybeStartPageFlipTimer(const gfx::Point& drag_point) {
int new_page_flip_target = -1;

Powered by Google App Engine
This is Rietveld 408576698