Chromium Code Reviews| 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 dd145ca2d97536bded59c1657b1dcb958a1e1db5..92e5803155b8f48d54376d3f615be07d16a511b2 100644 |
| --- a/ui/app_list/views/apps_grid_view.cc |
| +++ b/ui/app_list/views/apps_grid_view.cc |
| @@ -15,6 +15,7 @@ |
| #include "ui/app_list/views/pulsing_block_view.h" |
| #include "ui/base/animation/animation.h" |
| #include "ui/base/events/event.h" |
| +#include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/views/border.h" |
| #include "ui/views/view_model_utils.h" |
| #include "ui/views/widget/widget.h" |
| @@ -201,14 +202,19 @@ void AppsGridView::InitiateDrag(AppListItemView* view, |
| // Note: This code has very likely to be changed for Windows (non metro mode) |
| // when a |drag_and_drop_host_| gets implemented. |
| if (drag_and_drop_host_) { |
| + // Determine the mouse offset to the center of the icon so that the drag and |
| + // drop host follows this layer. |
| + gfx::Vector2d delta = event.root_location() - |
| + drag_view_->GetBoundsInScreen().CenterPoint(); |
| + delta.set_y(delta.y() + drag_view_->title()->size().height() / 2); |
| // We have to hide the original item since the drag and drop host will do |
| // the OS dependent code to "lift off the dragged item". |
| - // Note that we cannot use SetVisible since it would remove the mouse input. |
| - drag_view_->SetSize(gfx::Size()); |
| drag_and_drop_host_->CreateDragIconProxy(event.root_location(), |
| view->model()->icon(), |
| drag_view_, |
| + delta, |
| kDragAndDropProxyScale); |
| + HideView(drag_view_, true); |
| } |
| drag_start_ = event.location(); |
| } |
| @@ -244,10 +250,8 @@ void AppsGridView::UpdateDrag(AppListItemView* view, |
| if (last_drop_target != drop_target_) |
| AnimateToIdealBounds(); |
| - if (drag_and_drop_host_) { |
| + if (drag_and_drop_host_) |
| drag_and_drop_host_->UpdateDragIconProxy(event.root_location()); |
| - return; |
| - } |
| drag_view_->SetPosition( |
| gfx::PointAtOffsetFromOrigin(last_drag_point_ - drag_start_)); |
| @@ -263,14 +267,11 @@ void AppsGridView::EndDrag(bool cancel) { |
| MoveItemInModel(drag_view_, drop_target_); |
| } |
| - // In case we had a drag and drop proxy icon, we delete it and make the real |
| - // item visible again. |
| if (drag_and_drop_host_) { |
| + // If we had a drag and drop proxy icon, we delete it and make the real |
| + // item visible again. |
| drag_and_drop_host_->DestroyDragIconProxy(); |
| - // To avoid an incorrect animation on re-group, |drag_view_| gets positioned |
| - // at its last known drag location. |
| - drag_view_->SetPosition( |
| - gfx::PointAtOffsetFromOrigin(last_drag_point_ - drag_start_)); |
| + HideView(drag_view_, false); |
| } |
| drag_pointer_ = NONE; |
| @@ -919,4 +920,10 @@ void AppsGridView::OnAppListModelStatusChanged() { |
| SchedulePaint(); |
| } |
| +void AppsGridView::HideView(views::View* view, bool hide) { |
| + ui::ScopedLayerAnimationSettings animator(view->layer()->GetAnimator()); |
| + animator.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET); |
| + view->layer()->SetOpacity(hide ? 0 : 1); |
|
xiyuan
2013/05/31 23:06:17
This would not compile on win bots since they migh
Mr4D (OOO till 08-26)
2013/05/31 23:32:20
Done.
|
| +} |
| + |
| } // namespace app_list |