| Index: ash/common/shelf/shelf_view.cc
|
| diff --git a/ash/common/shelf/shelf_view.cc b/ash/common/shelf/shelf_view.cc
|
| index c46b168b96fe3cc818aa5e87dc511376a85e2528..7f712b4a00febd5b3abd15179b74fab956cdbc8c 100644
|
| --- a/ash/common/shelf/shelf_view.cc
|
| +++ b/ash/common/shelf/shelf_view.cc
|
| @@ -275,7 +275,8 @@ ShelfView::ShelfView(ShelfModel* model,
|
| main_shelf_(nullptr),
|
| dragged_off_from_overflow_to_shelf_(false),
|
| is_repost_event_on_same_item_(false),
|
| - last_pressed_index_(-1) {
|
| + last_pressed_index_(-1),
|
| + weak_factory_(this) {
|
| DCHECK(model_);
|
| DCHECK(delegate_);
|
| DCHECK(wm_shelf_);
|
| @@ -483,26 +484,14 @@ void ShelfView::ButtonPressed(views::Button* sender,
|
| }
|
|
|
| const int64_t display_id = window->GetDisplayNearestWindow().id();
|
| - ShelfAction performed_action =
|
| - model_->GetShelfItemDelegate(model_->items()[last_pressed_index_].id)
|
| - ->ItemSelected(event.type(), event.flags(), display_id,
|
| - LAUNCH_FROM_UNKNOWN);
|
| -
|
| - shelf_button_pressed_metric_tracker_.ButtonPressed(event, sender,
|
| - performed_action);
|
| -
|
| - // For the app list menu no TRIGGERED ink drop effect is needed and it
|
| - // handles its own ACTIVATED/DEACTIVATED states.
|
| - if (performed_action == SHELF_ACTION_NEW_WINDOW_CREATED ||
|
| - (performed_action != SHELF_ACTION_APP_LIST_SHOWN &&
|
| - !ShowListMenuForView(model_->items()[last_pressed_index_], sender, event,
|
| - ink_drop))) {
|
| - ink_drop->AnimateToState(views::InkDropState::ACTION_TRIGGERED);
|
| - }
|
| - // Allow the menu to clear |scoped_root_window_for_new_windows_| during
|
| - // OnMenuClosed.
|
| - if (!IsShowingMenu())
|
| - scoped_root_window_for_new_windows_.reset();
|
| +
|
| + // Notify the item of its selection; handle the result in AfterItemSelected.
|
| + const ShelfItem& item = model_->items()[last_pressed_index_];
|
| + model_->GetShelfItemDelegate(item.id)->ItemSelected(
|
| + ui::Event::Clone(event), display_id, LAUNCH_FROM_UNKNOWN,
|
| + base::Bind(&ShelfView::AfterItemSelected, weak_factory_.GetWeakPtr(),
|
| + item, sender, base::Passed(ui::Event::Clone(event)),
|
| + ink_drop));
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -1604,29 +1593,38 @@ void ShelfView::ShelfItemMoved(int start_index, int target_index) {
|
| AnimateToIdealBounds();
|
| }
|
|
|
| -void ShelfView::OnSetShelfItemDelegate(ShelfID id,
|
| - ShelfItemDelegate* item_delegate) {}
|
| -
|
| -bool ShelfView::ShowListMenuForView(const ShelfItem& item,
|
| - views::View* source,
|
| - const ui::Event& event,
|
| - views::InkDrop* ink_drop) {
|
| - ShelfItemDelegate* item_delegate = model_->GetShelfItemDelegate(item.id);
|
| - ShelfAppMenuItemList items = item_delegate->GetAppMenuItems(event.flags());
|
| -
|
| - // The application list menu should only show for two or more items; return
|
| - // false here to ensure that other behavior is triggered (eg. activating or
|
| - // minimizing a single associated window, or launching a pinned shelf item).
|
| - if (items.size() < 2)
|
| - return false;
|
| -
|
| - ink_drop->AnimateToState(views::InkDropState::ACTIVATED);
|
| - context_menu_id_ = item.id;
|
| - ShowMenu(base::MakeUnique<ShelfApplicationMenuModel>(
|
| - item.title, std::move(items), item_delegate),
|
| - source, gfx::Point(), false, ui::GetMenuSourceTypeForEvent(event),
|
| - ink_drop);
|
| - return true;
|
| +void ShelfView::OnSetShelfItemDelegate(
|
| + ShelfID id,
|
| + mojom::ShelfItemDelegate* item_delegate) {}
|
| +
|
| +void ShelfView::AfterItemSelected(
|
| + const ShelfItem& item,
|
| + views::Button* sender,
|
| + std::unique_ptr<ui::Event> event,
|
| + views::InkDrop* ink_drop,
|
| + ShelfAction action,
|
| + base::Optional<std::vector<mojom::MenuItemPtr>> menu_items) {
|
| + shelf_button_pressed_metric_tracker_.ButtonPressed(*event, sender, action);
|
| +
|
| + // The app list handles its own ink drop effect state changes.
|
| + if (action != SHELF_ACTION_APP_LIST_SHOWN) {
|
| + if (action != SHELF_ACTION_NEW_WINDOW_CREATED && menu_items &&
|
| + menu_items->size() > 1) {
|
| + // Show the app menu if there are 2 or more items and no window was shown.
|
| + ink_drop->AnimateToState(views::InkDropState::ACTIVATED);
|
| + context_menu_id_ = item.id;
|
| + ShowMenu(base::MakeUnique<ShelfApplicationMenuModel>(
|
| + item.title, std::move(*menu_items),
|
| + model_->GetShelfItemDelegate(item.id)),
|
| + sender, gfx::Point(), false,
|
| + ui::GetMenuSourceTypeForEvent(*event), ink_drop);
|
| + } else {
|
| + ink_drop->AnimateToState(views::InkDropState::ACTION_TRIGGERED);
|
| + }
|
| + }
|
| + // The menu clears |scoped_root_window_for_new_windows_| in OnMenuClosed.
|
| + if (!IsShowingMenu())
|
| + scoped_root_window_for_new_windows_.reset();
|
| }
|
|
|
| void ShelfView::ShowContextMenuForView(views::View* source,
|
|
|