Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/common/shelf/shelf_view.h" | 5 #include "ash/common/shelf/shelf_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "ash/common/ash_constants.h" | 10 #include "ash/common/ash_constants.h" |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 closing_event_time_(base::TimeTicks()), | 268 closing_event_time_(base::TimeTicks()), |
| 269 drag_and_drop_item_pinned_(false), | 269 drag_and_drop_item_pinned_(false), |
| 270 drag_and_drop_shelf_id_(0), | 270 drag_and_drop_shelf_id_(0), |
| 271 drag_replaced_view_(nullptr), | 271 drag_replaced_view_(nullptr), |
| 272 dragged_off_shelf_(false), | 272 dragged_off_shelf_(false), |
| 273 snap_back_from_rip_off_view_(nullptr), | 273 snap_back_from_rip_off_view_(nullptr), |
| 274 overflow_mode_(false), | 274 overflow_mode_(false), |
| 275 main_shelf_(nullptr), | 275 main_shelf_(nullptr), |
| 276 dragged_off_from_overflow_to_shelf_(false), | 276 dragged_off_from_overflow_to_shelf_(false), |
| 277 is_repost_event_on_same_item_(false), | 277 is_repost_event_on_same_item_(false), |
| 278 last_pressed_index_(-1) { | 278 last_pressed_index_(-1), |
| 279 weak_factory_(this) { | |
| 279 DCHECK(model_); | 280 DCHECK(model_); |
| 280 DCHECK(delegate_); | 281 DCHECK(delegate_); |
| 281 DCHECK(wm_shelf_); | 282 DCHECK(wm_shelf_); |
| 282 DCHECK(shelf_widget_); | 283 DCHECK(shelf_widget_); |
| 283 bounds_animator_.reset(new views::BoundsAnimator(this)); | 284 bounds_animator_.reset(new views::BoundsAnimator(this)); |
| 284 bounds_animator_->AddObserver(this); | 285 bounds_animator_->AddObserver(this); |
| 285 set_context_menu_controller(this); | 286 set_context_menu_controller(this); |
| 286 focus_search_.reset(new ShelfFocusSearch(view_model_.get())); | 287 focus_search_.reset(new ShelfFocusSearch(view_model_.get())); |
| 287 } | 288 } |
| 288 | 289 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 476 case TYPE_APP_PANEL: | 477 case TYPE_APP_PANEL: |
| 477 case TYPE_DIALOG: | 478 case TYPE_DIALOG: |
| 478 break; | 479 break; |
| 479 | 480 |
| 480 case TYPE_UNDEFINED: | 481 case TYPE_UNDEFINED: |
| 481 NOTREACHED() << "ShelfItemType must be set."; | 482 NOTREACHED() << "ShelfItemType must be set."; |
| 482 break; | 483 break; |
| 483 } | 484 } |
| 484 | 485 |
| 485 const int64_t display_id = window->GetDisplayNearestWindow().id(); | 486 const int64_t display_id = window->GetDisplayNearestWindow().id(); |
| 486 ShelfAction performed_action = | |
| 487 model_->GetShelfItemDelegate(model_->items()[last_pressed_index_].id) | |
| 488 ->ItemSelected(event.type(), event.flags(), display_id, | |
| 489 LAUNCH_FROM_UNKNOWN); | |
| 490 | 487 |
| 491 shelf_button_pressed_metric_tracker_.ButtonPressed(event, sender, | 488 // Notify the item of its selection; handle the result in AfterItemSelected. |
| 492 performed_action); | 489 const ShelfItem& item = model_->items()[last_pressed_index_]; |
| 493 | 490 model_->GetShelfItemDelegate(item.id)->ItemSelected( |
| 494 // For the app list menu no TRIGGERED ink drop effect is needed and it | 491 ui::Event::Clone(event), display_id, LAUNCH_FROM_UNKNOWN, |
| 495 // handles its own ACTIVATED/DEACTIVATED states. | 492 base::Bind(&ShelfView::AfterItemSelected, weak_factory_.GetWeakPtr(), |
| 496 if (performed_action == SHELF_ACTION_NEW_WINDOW_CREATED || | 493 item, sender, base::Passed(ui::Event::Clone(event)), |
| 497 (performed_action != SHELF_ACTION_APP_LIST_SHOWN && | 494 ink_drop)); |
| 498 !ShowListMenuForView(model_->items()[last_pressed_index_], sender, event, | |
| 499 ink_drop))) { | |
| 500 ink_drop->AnimateToState(views::InkDropState::ACTION_TRIGGERED); | |
| 501 } | |
| 502 // Allow the menu to clear |scoped_root_window_for_new_windows_| during | |
| 503 // OnMenuClosed. | |
| 504 if (!IsShowingMenu()) | |
| 505 scoped_root_window_for_new_windows_.reset(); | |
| 506 } | 495 } |
| 507 | 496 |
| 508 //////////////////////////////////////////////////////////////////////////////// | 497 //////////////////////////////////////////////////////////////////////////////// |
| 509 // ShelfView, FocusTraversable implementation: | 498 // ShelfView, FocusTraversable implementation: |
| 510 | 499 |
| 511 views::FocusSearch* ShelfView::GetFocusSearch() { | 500 views::FocusSearch* ShelfView::GetFocusSearch() { |
| 512 return focus_search_.get(); | 501 return focus_search_.get(); |
| 513 } | 502 } |
| 514 | 503 |
| 515 views::FocusTraversable* ShelfView::GetFocusTraversableParent() { | 504 views::FocusTraversable* ShelfView::GetFocusTraversableParent() { |
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1597 void ShelfView::ShelfItemMoved(int start_index, int target_index) { | 1586 void ShelfView::ShelfItemMoved(int start_index, int target_index) { |
| 1598 view_model_->Move(start_index, target_index); | 1587 view_model_->Move(start_index, target_index); |
| 1599 // When cancelling a drag due to a shelf item being added, the currently | 1588 // When cancelling a drag due to a shelf item being added, the currently |
| 1600 // dragged item is moved back to its initial position. AnimateToIdealBounds | 1589 // dragged item is moved back to its initial position. AnimateToIdealBounds |
| 1601 // will be called again when the new item is added to the |view_model_| but | 1590 // will be called again when the new item is added to the |view_model_| but |
| 1602 // at this time the |view_model_| is inconsistent with the |model_|. | 1591 // at this time the |view_model_| is inconsistent with the |model_|. |
| 1603 if (!cancelling_drag_model_changed_) | 1592 if (!cancelling_drag_model_changed_) |
| 1604 AnimateToIdealBounds(); | 1593 AnimateToIdealBounds(); |
| 1605 } | 1594 } |
| 1606 | 1595 |
| 1607 void ShelfView::OnSetShelfItemDelegate(ShelfID id, | 1596 void ShelfView::OnSetShelfItemDelegate( |
| 1608 ShelfItemDelegate* item_delegate) {} | 1597 ShelfID id, |
| 1598 mojom::ShelfItemDelegate* item_delegate) {} | |
| 1609 | 1599 |
| 1610 bool ShelfView::ShowListMenuForView(const ShelfItem& item, | 1600 void ShelfView::AfterItemSelected(const ShelfItem& item, |
| 1611 views::View* source, | 1601 views::Button* sender, |
| 1612 const ui::Event& event, | 1602 std::unique_ptr<ui::Event> event, |
| 1613 views::InkDrop* ink_drop) { | 1603 views::InkDrop* ink_drop, |
| 1614 ShelfItemDelegate* item_delegate = model_->GetShelfItemDelegate(item.id); | 1604 ShelfAction action, |
| 1615 ShelfAppMenuItemList items = item_delegate->GetAppMenuItems(event.flags()); | 1605 std::vector<mojom::MenuItemPtr> menu_items) { |
| 1606 shelf_button_pressed_metric_tracker_.ButtonPressed(*event, sender, action); | |
| 1616 | 1607 |
| 1617 // The application list menu should only show for two or more items; return | 1608 if (action != SHELF_ACTION_APP_LIST_SHOWN) { |
| 1618 // false here to ensure that other behavior is triggered (eg. activating or | 1609 if (action != SHELF_ACTION_NEW_WINDOW_CREATED && menu_items.size() > 1) { |
| 1619 // minimizing a single associated window, or launching a pinned shelf item). | 1610 // Show the app menu if there are 2 or more items and no window was shown. |
| 1620 if (items.size() < 2) | 1611 ink_drop->AnimateToState(views::InkDropState::ACTIVATED); |
| 1621 return false; | 1612 context_menu_id_ = item.id; |
| 1622 | 1613 ShowMenu(base::MakeUnique<ShelfApplicationMenuModel>( |
| 1623 ink_drop->AnimateToState(views::InkDropState::ACTIVATED); | 1614 item.title, std::move(menu_items), |
| 1624 context_menu_id_ = item.id; | 1615 model_->GetShelfItemDelegate(item.id)), |
| 1625 ShowMenu(base::MakeUnique<ShelfApplicationMenuModel>( | 1616 sender, gfx::Point(), false, |
| 1626 item.title, std::move(items), item_delegate), | 1617 ui::GetMenuSourceTypeForEvent(*event), ink_drop); |
| 1627 source, gfx::Point(), false, ui::GetMenuSourceTypeForEvent(event), | 1618 } else { |
| 1628 ink_drop); | 1619 // For the app list menu no TRIGGERED ink drop effect is needed and it |
|
James Cook
2017/03/10 16:56:01
I think what's confusing me where is that this com
msw
2017/03/10 20:44:45
Done (moved the comment up and simplified it a bit
| |
| 1629 return true; | 1620 // handles its own ACTIVATED/DEACTIVATED states. |
| 1621 ink_drop->AnimateToState(views::InkDropState::ACTION_TRIGGERED); | |
| 1622 } | |
| 1623 } | |
| 1624 // Allow the menu to clear |scoped_root_window_for_new_windows_| during | |
| 1625 // OnMenuClosed. | |
| 1626 if (!IsShowingMenu()) | |
| 1627 scoped_root_window_for_new_windows_.reset(); | |
| 1630 } | 1628 } |
| 1631 | 1629 |
| 1632 void ShelfView::ShowContextMenuForView(views::View* source, | 1630 void ShelfView::ShowContextMenuForView(views::View* source, |
| 1633 const gfx::Point& point, | 1631 const gfx::Point& point, |
| 1634 ui::MenuSourceType source_type) { | 1632 ui::MenuSourceType source_type) { |
| 1635 last_pressed_index_ = -1; | 1633 last_pressed_index_ = -1; |
| 1636 | 1634 |
| 1637 const ShelfItem* item = ShelfItemForView(source); | 1635 const ShelfItem* item = ShelfItemForView(source); |
| 1638 if (!item) { | 1636 if (!item) { |
| 1639 WmShell::Get()->ShowContextMenu(point, source_type); | 1637 WmShell::Get()->ShowContextMenu(point, source_type); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1770 | 1768 |
| 1771 int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const { | 1769 int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const { |
| 1772 const gfx::Rect bounds = GetBoundsInScreen(); | 1770 const gfx::Rect bounds = GetBoundsInScreen(); |
| 1773 int distance = wm_shelf_->SelectValueForShelfAlignment( | 1771 int distance = wm_shelf_->SelectValueForShelfAlignment( |
| 1774 bounds.y() - coordinate.y(), coordinate.x() - bounds.right(), | 1772 bounds.y() - coordinate.y(), coordinate.x() - bounds.right(), |
| 1775 bounds.x() - coordinate.x()); | 1773 bounds.x() - coordinate.x()); |
| 1776 return distance > 0 ? distance : 0; | 1774 return distance > 0 ? distance : 0; |
| 1777 } | 1775 } |
| 1778 | 1776 |
| 1779 } // namespace ash | 1777 } // namespace ash |
| OLD | NEW |