Chromium Code Reviews| Index: ash/shelf/shelf_view.cc |
| diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc |
| index 434c5bfc76f6b15fee7922e1cf3c0695322809db..71b120abbce3ece9957a78859cd50bb7b8ef1ae3 100644 |
| --- a/ash/shelf/shelf_view.cc |
| +++ b/ash/shelf/shelf_view.cc |
| @@ -266,7 +266,7 @@ ShelfView::ShelfView(ShelfModel* model, |
| snap_back_from_rip_off_view_(nullptr), |
| overflow_mode_(false), |
| main_shelf_(nullptr), |
| - dragged_off_from_overflow_to_shelf_(false), |
| + dragged_off_from_shelf_to_other_shelf_(false), |
| is_repost_event_on_same_item_(false), |
| last_pressed_index_(-1), |
| weak_factory_(this) { |
| @@ -754,7 +754,7 @@ void ShelfView::UpdateAllButtonsVisibilityInOverflowMode() { |
| bool visible = i >= first_visible_index_ && i <= last_visible_index_; |
| // To track the dragging of |drag_view_| continuously, its visibility |
| // should be always true regardless of its position. |
| - if (dragged_off_from_overflow_to_shelf_ && |
| + if (dragged_off_from_shelf_to_other_shelf_ && |
| view_model_->view_at(i) == drag_view_) |
| view_model_->view_at(i)->SetVisible(true); |
| else |
| @@ -1077,17 +1077,21 @@ bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) { |
| // If the shelf/overflow bubble bounds contains |screen_location| we insert |
| // the item back into the shelf. |
| if (GetBoundsForDragInsertInScreen().Contains(screen_location)) { |
| - if (dragged_off_from_overflow_to_shelf_) { |
| + if (dragged_off_from_shelf_to_other_shelf_) { |
| // During the dragging an item from Shelf to Overflow, it can enter here |
| - // directly because both are located very closly. |
| - main_shelf_->EndDrag(true); |
| + // directly because both are located very closely. |
| + if (is_overflow_mode()) |
| + main_shelf_->EndDrag(true); |
| + else if (overflow_bubble_ && overflow_bubble_->IsShowing()) |
|
msw
2017/04/17 19:29:09
q: shouldn't this definitely be true if we are dra
sammiequon
2017/04/17 23:42:28
Done.
|
| + overflow_bubble_->shelf_view()->EndDrag(true); |
| + |
| // Stops the animation of |drag_view_| and sets its bounds explicitly |
| - // becase ContinueDrag() stops its animation. Without this, unexpected |
| + // because ContinueDrag() stops its animation. Without this, unexpected |
| // bounds will be set. |
| bounds_animator_->StopAnimatingView(drag_view_); |
| int drag_view_index = view_model_->GetIndexOfView(drag_view_); |
| drag_view_->SetBoundsRect(view_model_->ideal_bounds(drag_view_index)); |
| - dragged_off_from_overflow_to_shelf_ = false; |
| + dragged_off_from_shelf_to_other_shelf_ = false; |
| } |
| // Destroy our proxy view item. |
| DestroyDragIconProxy(); |
| @@ -1103,18 +1107,44 @@ bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) { |
| } else if (is_overflow_mode() && |
| main_shelf_->GetBoundsForDragInsertInScreen().Contains( |
| screen_location)) { |
| - if (!dragged_off_from_overflow_to_shelf_) { |
| - dragged_off_from_overflow_to_shelf_ = true; |
| + // Item is dragged from overflow shelf to shelf. |
|
msw
2017/04/17 19:29:09
nit: "The item was dragged from the overflow shelf
sammiequon
2017/04/17 23:42:29
Done.
|
| + if (!dragged_off_from_shelf_to_other_shelf_) { |
| + dragged_off_from_shelf_to_other_shelf_ = true; |
| drag_image_->SetOpacity(1.0f); |
| main_shelf_->StartDrag(dragged_app_id, screen_location); |
| } else { |
| main_shelf_->Drag(screen_location); |
| } |
| - } else if (dragged_off_from_overflow_to_shelf_) { |
| + } else if (!is_overflow_mode() && overflow_bubble_ && |
| + overflow_bubble_->IsShowing() && |
| + overflow_bubble_->shelf_view() |
| + ->GetBoundsForDragInsertInScreen() |
| + .Contains(screen_location)) { |
| + // Item is dragged from shelf to overflow shelf. |
|
msw
2017/04/17 19:29:09
The item was dragged from the main shelf to the ov
sammiequon
2017/04/17 23:42:28
Done.
|
| + if (!dragged_off_from_shelf_to_other_shelf_) { |
| + dragged_off_from_shelf_to_other_shelf_ = true; |
| + drag_image_->SetOpacity(1.0f); |
| + overflow_bubble_->shelf_view()->StartDrag(dragged_app_id, |
| + screen_location); |
| + } else { |
| + overflow_bubble_->shelf_view()->Drag(screen_location); |
| + } |
| + } else if (dragged_off_from_shelf_to_other_shelf_) { |
| // Makes the |drag_image_| partially disappear again. |
| - dragged_off_from_overflow_to_shelf_ = false; |
| + dragged_off_from_shelf_to_other_shelf_ = false; |
| drag_image_->SetOpacity(kDraggedImageOpacity); |
| - main_shelf_->EndDrag(true); |
| + |
| + if (is_overflow_mode()) { |
| + main_shelf_->EndDrag(true); |
| + } else if (overflow_bubble_ && overflow_bubble_->IsShowing()) { |
|
msw
2017/04/17 19:29:09
ditto q: shouldn't this definitely be true if we a
|
| + overflow_bubble_->shelf_view()->EndDrag(true); |
| + // After entering the overflow shelf the last item becomes visible |
|
msw
2017/04/17 19:29:09
I don't understand what is happening here (I also
sammiequon
2017/04/17 23:42:29
If we do not hide the last item, when an item is r
msw
2017/04/18 00:11:03
Ah, I didn't realize that when we started dragging
|
| + // again. Hide the last item when we exit the overflow shelf, otherwise |
| + // a copy of the item we are dragging will appear on the overflow shelf. |
| + overflow_bubble_->shelf_view()->last_visible_index_ = |
|
msw
2017/04/17 19:29:09
nit: overflow_bubble_->shelf_view()->last_visible_
sammiequon
2017/04/17 23:42:28
Done.
|
| + overflow_bubble_->shelf_view()->last_visible_index_ - 1; |
| + } |
| + |
| bounds_animator_->StopAnimatingView(drag_view_); |
| int drag_view_index = view_model_->GetIndexOfView(drag_view_); |
| drag_view_->SetBoundsRect(view_model_->ideal_bounds(drag_view_index)); |
| @@ -1140,6 +1170,14 @@ bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) { |
| if (current_index != model_->FirstPanelIndex() - 1) { |
| model_->Move(current_index, model_->FirstPanelIndex() - 1); |
| StartFadeInLastVisibleItem(); |
| + |
| + // If the overflow bubble is showing, the current item will swap to the |
|
msw
2017/04/17 19:29:09
Ditto, I'm a bit confused by this... current/last/
|
| + // back of the overflow shelf as well, so we tell the overflow shelf to |
| + // not show their last item, which would be the current item. |
| + if (overflow_bubble_ && overflow_bubble_->IsShowing()) { |
| + overflow_bubble_->shelf_view()->last_visible_index_ = |
|
msw
2017/04/17 19:29:09
nit: overflow_bubble_->shelf_view()->last_visible_
sammiequon
2017/04/17 23:42:28
Done.
|
| + overflow_bubble_->shelf_view()->last_visible_index_ - 1; |
| + } |
| } else if (is_overflow_mode()) { |
| // Overflow bubble should be shrunk when an item is ripped off. |
| PreferredSizeChanged(); |
| @@ -1174,9 +1212,12 @@ void ShelfView::FinalizeRipOffDrag(bool cancel) { |
| bool snap_back = false; |
| // Items which cannot be dragged off will be handled as a cancel. |
| if (!cancel) { |
| - if (dragged_off_from_overflow_to_shelf_) { |
| - dragged_off_from_overflow_to_shelf_ = false; |
| - main_shelf_->EndDrag(false); |
| + if (dragged_off_from_shelf_to_other_shelf_) { |
| + dragged_off_from_shelf_to_other_shelf_ = false; |
| + if (is_overflow_mode()) |
| + main_shelf_->EndDrag(false); |
| + else if (overflow_bubble_ && overflow_bubble_->IsShowing()) |
|
msw
2017/04/17 19:29:09
ditto q: shouldn't this definitely be true if we a
sammiequon
2017/04/17 23:42:28
Done.
|
| + overflow_bubble_->shelf_view()->EndDrag(false); |
| drag_view_->layer()->SetOpacity(1.0f); |
| } else if (RemovableByRipOff(current_index) != REMOVABLE) { |
| // Make sure we do not try to remove un-removable items like items which |
| @@ -1192,10 +1233,13 @@ void ShelfView::FinalizeRipOffDrag(bool cancel) { |
| } |
| } |
| if (cancel || snap_back) { |
| - if (dragged_off_from_overflow_to_shelf_) { |
| - dragged_off_from_overflow_to_shelf_ = false; |
| - // Main shelf handles revert of dragged item. |
| - main_shelf_->EndDrag(true); |
| + if (dragged_off_from_shelf_to_other_shelf_) { |
| + dragged_off_from_shelf_to_other_shelf_ = false; |
| + // Other shelf handles revert of dragged item. |
| + if (is_overflow_mode()) |
| + main_shelf_->EndDrag(true); |
| + else if (overflow_bubble_ && overflow_bubble_->IsShowing()) |
|
msw
2017/04/17 19:29:09
ditto q: shouldn't this definitely be true if we a
sammiequon
2017/04/17 23:42:29
Done.
|
| + overflow_bubble_->shelf_view()->EndDrag(true); |
| drag_view_->layer()->SetOpacity(1.0f); |
| } else if (!cancelling_drag_model_changed_) { |
| // Only do something if the change did not come through a model change. |
| @@ -1409,10 +1453,10 @@ gfx::Size ShelfView::GetPreferredSize() const { |
| // When an item is dragged off from the overflow bubble, it is moved to last |
| // position and and changed to invisible. Overflow bubble size should be |
| // shrunk to fit only for visible items. |
| - // If |dragged_off_from_overflow_to_shelf_| is set, there will be no invisible |
| - // items in the shelf. |
| + // If |dragged_off_from_shelf_to_other_shelf_| is set, there will be no |
| + // invisible items in the shelf. |
| if (is_overflow_mode() && dragged_off_shelf_ && |
| - !dragged_off_from_overflow_to_shelf_ && |
| + !dragged_off_from_shelf_to_other_shelf_ && |
| RemovableByRipOff(view_model_->GetIndexOfView(drag_view_)) == REMOVABLE) |
| last_button_index--; |