| Index: ash/shelf/shelf_view.cc
|
| diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
|
| index ed9850e7d232e0684877b1fa47a5eb6ede82b507..9be5a0857adf070f366d7f998055bac8d43d747c 100644
|
| --- a/ash/shelf/shelf_view.cc
|
| +++ b/ash/shelf/shelf_view.cc
|
| @@ -18,7 +18,6 @@
|
| #include "ash/shelf/shelf_application_menu_model.h"
|
| #include "ash/shelf/shelf_button.h"
|
| #include "ash/shelf/shelf_constants.h"
|
| -#include "ash/shelf/shelf_delegate.h"
|
| #include "ash/shelf/shelf_model.h"
|
| #include "ash/shelf/shelf_widget.h"
|
| #include "ash/shelf/wm_shelf.h"
|
| @@ -239,11 +238,9 @@ class ShelfView::StartFadeAnimationDelegate : public gfx::AnimationDelegate {
|
| const int ShelfView::kMinimumDragDistance = 8;
|
|
|
| ShelfView::ShelfView(ShelfModel* model,
|
| - ShelfDelegate* delegate,
|
| WmShelf* wm_shelf,
|
| ShelfWidget* shelf_widget)
|
| : model_(model),
|
| - delegate_(delegate),
|
| wm_shelf_(wm_shelf),
|
| shelf_widget_(shelf_widget),
|
| view_model_(new views::ViewModel),
|
| @@ -271,7 +268,6 @@ ShelfView::ShelfView(ShelfModel* model,
|
| last_pressed_index_(-1),
|
| weak_factory_(this) {
|
| DCHECK(model_);
|
| - DCHECK(delegate_);
|
| DCHECK(wm_shelf_);
|
| DCHECK(shelf_widget_);
|
| bounds_animator_.reset(new views::BoundsAnimator(this));
|
| @@ -560,18 +556,16 @@ bool ShelfView::StartDrag(const std::string& app_id,
|
| CancelDrag(-1);
|
| drag_and_drop_item_pinned_ = false;
|
| drag_and_drop_app_id_ = app_id;
|
| - drag_and_drop_shelf_id_ =
|
| - delegate_->GetShelfIDForAppID(drag_and_drop_app_id_);
|
| + drag_and_drop_shelf_id_ = model_->GetShelfIDForAppID(drag_and_drop_app_id_);
|
| // Check if the application is known and pinned - if not, we have to pin it so
|
| // that we can re-arrange the shelf order accordingly. Note that items have
|
| // to be pinned to give them the same (order) possibilities as a shortcut.
|
| // When an item is dragged from overflow to shelf, IsShowingOverflowBubble()
|
| // returns true. At this time, we don't need to pin the item.
|
| if (!IsShowingOverflowBubble() &&
|
| - (!drag_and_drop_shelf_id_ || !delegate_->IsAppPinned(app_id))) {
|
| - delegate_->PinAppWithID(app_id);
|
| - drag_and_drop_shelf_id_ =
|
| - delegate_->GetShelfIDForAppID(drag_and_drop_app_id_);
|
| + (!drag_and_drop_shelf_id_ || !model_->IsAppPinned(app_id))) {
|
| + model_->PinAppWithID(app_id);
|
| + drag_and_drop_shelf_id_ = model_->GetShelfIDForAppID(drag_and_drop_app_id_);
|
| if (!drag_and_drop_shelf_id_)
|
| return false;
|
| drag_and_drop_item_pinned_ = true;
|
| @@ -629,7 +623,7 @@ void ShelfView::EndDrag(bool cancel) {
|
|
|
| // Either destroy the temporarily created item - or - make the item visible.
|
| if (drag_and_drop_item_pinned_ && cancel) {
|
| - delegate_->UnpinAppWithID(drag_and_drop_app_id_);
|
| + model_->UnpinAppWithID(drag_and_drop_app_id_);
|
| } else if (drag_and_drop_view) {
|
| if (cancel) {
|
| // When a hosted drag gets canceled, the item can remain in the same slot
|
| @@ -1063,7 +1057,7 @@ bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) {
|
| int current_index = view_model_->GetIndexOfView(drag_view_);
|
| DCHECK_NE(-1, current_index);
|
| std::string dragged_app_id =
|
| - delegate_->GetAppIDForShelfID(model_->items()[current_index].id);
|
| + model_->GetAppIDForShelfID(model_->items()[current_index].id);
|
|
|
| gfx::Point screen_location =
|
| WmWindow::Get(GetWidget()->GetNativeWindow())
|
| @@ -1186,8 +1180,8 @@ void ShelfView::FinalizeRipOffDrag(bool cancel) {
|
| // Make sure the item stays invisible upon removal.
|
| drag_view_->SetVisible(false);
|
| std::string app_id =
|
| - delegate_->GetAppIDForShelfID(model_->items()[current_index].id);
|
| - delegate_->UnpinAppWithID(app_id);
|
| + model_->GetAppIDForShelfID(model_->items()[current_index].id);
|
| + model_->UnpinAppWithID(app_id);
|
| }
|
| }
|
| if (cancel || snap_back) {
|
| @@ -1229,10 +1223,9 @@ ShelfView::RemovableState ShelfView::RemovableByRipOff(int index) const {
|
| return NOT_REMOVABLE;
|
|
|
| // Note: Only pinned app shortcuts can be removed!
|
| - std::string app_id = delegate_->GetAppIDForShelfID(model_->items()[index].id);
|
| - return (type == TYPE_PINNED_APP && delegate_->IsAppPinned(app_id))
|
| - ? REMOVABLE
|
| - : DRAGGABLE;
|
| + std::string app_id = model_->GetAppIDForShelfID(model_->items()[index].id);
|
| + return (type == TYPE_PINNED_APP && model_->IsAppPinned(app_id)) ? REMOVABLE
|
| + : DRAGGABLE;
|
| }
|
|
|
| bool ShelfView::SameDragType(ShelfItemType typea, ShelfItemType typeb) const {
|
| @@ -1281,8 +1274,7 @@ void ShelfView::ToggleOverflowBubble() {
|
| if (!overflow_bubble_)
|
| overflow_bubble_.reset(new OverflowBubble(wm_shelf_));
|
|
|
| - ShelfView* overflow_view =
|
| - new ShelfView(model_, delegate_, wm_shelf_, shelf_widget_);
|
| + ShelfView* overflow_view = new ShelfView(model_, wm_shelf_, shelf_widget_);
|
| overflow_view->overflow_mode_ = true;
|
| overflow_view->Init();
|
| overflow_view->set_owner_overflow_bubble(overflow_bubble_.get());
|
| @@ -1538,6 +1530,13 @@ void ShelfView::ShelfItemRemoved(int model_index, const ShelfItem& old_item) {
|
|
|
| void ShelfView::ShelfItemChanged(int model_index, const ShelfItem& old_item) {
|
| const ShelfItem& item(model_->items()[model_index]);
|
| +
|
| + // Bail if the view and shelf sizes do not match. ShelfItemChanged may be
|
| + // called here before ShelfItemAdded, due to ChromeLauncherController's
|
| + // item initialization, which calls SetItem during ShelfItemAdded.
|
| + if (static_cast<int>(model_->items().size()) != view_model_->view_size())
|
| + return;
|
| +
|
| if (old_item.type != item.type) {
|
| // Type changed, swap the views.
|
| model_index = CancelDrag(model_index);
|
|
|