| Index: ash/shelf/shelf_view.cc
|
| diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
|
| index 41a6a5206217593370df8e867666ea992d0d567e..f03f2b87a9c34cefb6de9b3d1e5fd0ecd6ed56b4 100644
|
| --- a/ash/shelf/shelf_view.cc
|
| +++ b/ash/shelf/shelf_view.cc
|
| @@ -728,8 +728,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_ &&
|
| - view_model_->view_at(i) == drag_view_)
|
| + if (dragged_to_another_shelf_ && view_model_->view_at(i) == drag_view_)
|
| view_model_->view_at(i)->SetVisible(true);
|
| else
|
| view_model_->view_at(i)->SetVisible(visible);
|
| @@ -1034,6 +1033,15 @@ void ShelfView::ContinueDrag(const ui::LocatedEvent& event) {
|
| bounds_animator_->StopAnimatingView(drag_view_);
|
| }
|
|
|
| +void ShelfView::EndDragOnOtherShelf(bool cancel) {
|
| + if (is_overflow_mode()) {
|
| + main_shelf_->EndDrag(cancel);
|
| + } else {
|
| + DCHECK(overflow_bubble_->IsShowing());
|
| + overflow_bubble_->shelf_view()->EndDrag(cancel);
|
| + }
|
| +}
|
| +
|
| bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) {
|
| int current_index = view_model_->GetIndexOfView(drag_view_);
|
| DCHECK_NE(-1, current_index);
|
| @@ -1051,17 +1059,18 @@ 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_to_another_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.
|
| + EndDragOnOtherShelf(true /* cancel */);
|
| +
|
| // 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_to_another_shelf_ = false;
|
| }
|
| // Destroy our proxy view item.
|
| DestroyDragIconProxy();
|
| @@ -1077,18 +1086,42 @@ 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;
|
| + // The item was dragged from the overflow shelf to the main shelf.
|
| + if (!dragged_to_another_shelf_) {
|
| + dragged_to_another_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)) {
|
| + // The item was dragged from the main shelf to the overflow shelf.
|
| + if (!dragged_to_another_shelf_) {
|
| + dragged_to_another_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_to_another_shelf_) {
|
| // Makes the |drag_image_| partially disappear again.
|
| - dragged_off_from_overflow_to_shelf_ = false;
|
| + dragged_to_another_shelf_ = false;
|
| drag_image_->SetOpacity(kDraggedImageOpacity);
|
| - main_shelf_->EndDrag(true);
|
| +
|
| + EndDragOnOtherShelf(true /* cancel */);
|
| + if (!is_overflow_mode()) {
|
| + // During dragging, the position of the dragged item is moved to the
|
| + // back. If the overflow bubble is showing, a copy of the dragged item
|
| + // will appear at the end of the overflow shelf. Decrement the last
|
| + // visible index of the overflow shelf to hide this copy.
|
| + overflow_bubble_->shelf_view()->last_visible_index_--;
|
| + }
|
| +
|
| bounds_animator_->StopAnimatingView(drag_view_);
|
| int drag_view_index = view_model_->GetIndexOfView(drag_view_);
|
| drag_view_->SetBoundsRect(view_model_->ideal_bounds(drag_view_index));
|
| @@ -1114,6 +1147,13 @@ bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) {
|
| if (current_index != model_->FirstPanelIndex() - 1) {
|
| model_->Move(current_index, model_->FirstPanelIndex() - 1);
|
| StartFadeInLastVisibleItem();
|
| +
|
| + // During dragging, the position of the dragged item is moved to the
|
| + // back. If the overflow bubble is showing, a copy of the dragged item
|
| + // will appear at the end of the overflow shelf. Decrement the last
|
| + // visible index of the overflow shelf to hide this copy.
|
| + if (overflow_bubble_ && overflow_bubble_->IsShowing())
|
| + overflow_bubble_->shelf_view()->last_visible_index_--;
|
| } else if (is_overflow_mode()) {
|
| // Overflow bubble should be shrunk when an item is ripped off.
|
| PreferredSizeChanged();
|
| @@ -1148,9 +1188,9 @@ 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_to_another_shelf_) {
|
| + dragged_to_another_shelf_ = false;
|
| + EndDragOnOtherShelf(false /* cancel */);
|
| 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
|
| @@ -1166,10 +1206,10 @@ 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_to_another_shelf_) {
|
| + dragged_to_another_shelf_ = false;
|
| + // Other shelf handles revert of dragged item.
|
| + EndDragOnOtherShelf(false /* 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.
|
| @@ -1378,10 +1418,9 @@ 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 (is_overflow_mode() && dragged_off_shelf_ &&
|
| - !dragged_off_from_overflow_to_shelf_ &&
|
| + // If |dragged_to_another_shelf_| is set, there will be no
|
| + // invisible items in the shelf.
|
| + if (is_overflow_mode() && dragged_off_shelf_ && !dragged_to_another_shelf_ &&
|
| RemovableByRipOff(view_model_->GetIndexOfView(drag_view_)) == REMOVABLE)
|
| last_button_index--;
|
|
|
|
|