Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: ash/common/shelf/shelf_view.cc

Issue 2718563008: mash: Use mojo for ShelfItemDelegate and [app] MenuItem. (Closed)
Patch Set: Cleanup; fix ash_shell compile and a couple tests. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 // So, it is safe to be checked after handling overflow button. 443 // So, it is safe to be checked after handling overflow button.
444 if (!ShouldEventActivateButton(sender, event)) 444 if (!ShouldEventActivateButton(sender, event))
445 return; 445 return;
446 446
447 // Record the index for the last pressed shelf item. 447 // Record the index for the last pressed shelf item.
448 last_pressed_index_ = view_model_->GetIndexOfView(sender); 448 last_pressed_index_ = view_model_->GetIndexOfView(sender);
449 DCHECK_LT(-1, last_pressed_index_); 449 DCHECK_LT(-1, last_pressed_index_);
450 450
451 // Place new windows on the same display as the button. 451 // Place new windows on the same display as the button.
452 WmWindow* window = WmWindow::Get(sender->GetWidget()->GetNativeWindow()); 452 WmWindow* window = WmWindow::Get(sender->GetWidget()->GetNativeWindow());
453 scoped_root_window_for_new_windows_.reset( 453 scoped_root_window_for_new_windows_.reset(
James Cook 2017/03/09 01:09:46 Do you think this should live in AfterItemSelected
msw 2017/03/10 06:17:56 I don't think so; item selection itself frequently
James Cook 2017/03/10 16:56:01 Yeah, makes sense.
454 new ScopedRootWindowForNewWindows(window->GetRootWindow())); 454 new ScopedRootWindowForNewWindows(window->GetRootWindow()));
455 455
456 // Slow down activation animations if shift key is pressed. 456 // Slow down activation animations if shift key is pressed.
457 std::unique_ptr<ui::ScopedAnimationDurationScaleMode> slowing_animations; 457 std::unique_ptr<ui::ScopedAnimationDurationScaleMode> slowing_animations;
458 if (event.IsShiftDown()) { 458 if (event.IsShiftDown()) {
459 slowing_animations.reset(new ui::ScopedAnimationDurationScaleMode( 459 slowing_animations.reset(new ui::ScopedAnimationDurationScaleMode(
460 ui::ScopedAnimationDurationScaleMode::SLOW_DURATION)); 460 ui::ScopedAnimationDurationScaleMode::SLOW_DURATION));
461 } 461 }
462 462
463 // Collect usage statistics before we decide what to do with the click. 463 // Collect usage statistics before we decide what to do with the click.
(...skipping 12 matching lines...) Expand all
476 case TYPE_APP_PANEL: 476 case TYPE_APP_PANEL:
477 case TYPE_DIALOG: 477 case TYPE_DIALOG:
478 break; 478 break;
479 479
480 case TYPE_UNDEFINED: 480 case TYPE_UNDEFINED:
481 NOTREACHED() << "ShelfItemType must be set."; 481 NOTREACHED() << "ShelfItemType must be set.";
482 break; 482 break;
483 } 483 }
484 484
485 const int64_t display_id = window->GetDisplayNearestWindow().id(); 485 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 486
491 shelf_button_pressed_metric_tracker_.ButtonPressed(event, sender, 487 // Notify the item of its selection; handle the result in AfterItemSelected.
492 performed_action); 488 const ShelfItem& item = model_->items()[last_pressed_index_];
493 489 model_->GetShelfItemDelegate(item.id)->ItemSelected(
494 // For the app list menu no TRIGGERED ink drop effect is needed and it 490 ui::Event::Clone(event), display_id, LAUNCH_FROM_UNKNOWN,
495 // handles its own ACTIVATED/DEACTIVATED states. 491 base::Bind(&ShelfView::AfterItemSelected, base::Unretained(this), item,
James Cook 2017/03/09 01:09:46 Hrm. Is Unretained safe here? Could this cause a s
msw 2017/03/10 06:17:56 Added WeakPtr use to skip AfterItemSelected if the
James Cook 2017/03/10 16:56:01 nit: I would add a comment either here or in the h
496 if (performed_action == SHELF_ACTION_NEW_WINDOW_CREATED || 492 sender, base::Passed(ui::Event::Clone(event)), ink_drop));
497 (performed_action != SHELF_ACTION_APP_LIST_SHOWN &&
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 } 493 }
507 494
508 //////////////////////////////////////////////////////////////////////////////// 495 ////////////////////////////////////////////////////////////////////////////////
509 // ShelfView, FocusTraversable implementation: 496 // ShelfView, FocusTraversable implementation:
510 497
511 views::FocusSearch* ShelfView::GetFocusSearch() { 498 views::FocusSearch* ShelfView::GetFocusSearch() {
512 return focus_search_.get(); 499 return focus_search_.get();
513 } 500 }
514 501
515 views::FocusTraversable* ShelfView::GetFocusTraversableParent() { 502 views::FocusTraversable* ShelfView::GetFocusTraversableParent() {
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 // dragged item is moved back to its initial position. AnimateToIdealBounds 1587 // 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 1588 // 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_|. 1589 // at this time the |view_model_| is inconsistent with the |model_|.
1603 if (!cancelling_drag_model_changed_) 1590 if (!cancelling_drag_model_changed_)
1604 AnimateToIdealBounds(); 1591 AnimateToIdealBounds();
1605 } 1592 }
1606 1593
1607 void ShelfView::OnSetShelfItemDelegate(ShelfID id, 1594 void ShelfView::OnSetShelfItemDelegate(ShelfID id,
1608 ShelfItemDelegate* item_delegate) {} 1595 ShelfItemDelegate* item_delegate) {}
1609 1596
1610 bool ShelfView::ShowListMenuForView(const ShelfItem& item, 1597 void ShelfView::AfterItemSelected(const ShelfItem& item,
1611 views::View* source, 1598 views::Button* sender,
1612 const ui::Event& event, 1599 std::unique_ptr<ui::Event> event,
1613 views::InkDrop* ink_drop) { 1600 views::InkDrop* ink_drop,
1614 ShelfItemDelegate* item_delegate = model_->GetShelfItemDelegate(item.id); 1601 ShelfAction action,
1615 ShelfAppMenuItemList items = item_delegate->GetAppMenuItems(event.flags()); 1602 ShelfItemDelegate::MenuItemList menu_items) {
1603 const ui::Event& e = *event.get();
James Cook 2017/03/09 01:09:46 how about evt or event (vs. event_in) vs. inline *
msw 2017/03/10 06:17:56 Done.
1604 shelf_button_pressed_metric_tracker_.ButtonPressed(e, sender, action);
1616 1605
1617 // The application list menu should only show for two or more items; return 1606 // Show the app menu if there are 2 or more items and no window was created.
1618 // false here to ensure that other behavior is triggered (eg. activating or 1607 if (action != SHELF_ACTION_NEW_WINDOW_CREATED &&
1619 // minimizing a single associated window, or launching a pinned shelf item). 1608 action != SHELF_ACTION_APP_LIST_SHOWN && menu_items.size() > 1) {
1620 if (items.size() < 2) 1609 ink_drop->AnimateToState(views::InkDropState::ACTIVATED);
1621 return false; 1610 context_menu_id_ = item.id;
1622 1611 ShowMenu(base::MakeUnique<ShelfApplicationMenuModel>(
1623 ink_drop->AnimateToState(views::InkDropState::ACTIVATED); 1612 item.title, std::move(menu_items),
1624 context_menu_id_ = item.id; 1613 model_->GetShelfItemDelegate(item.id)),
1625 ShowMenu(base::MakeUnique<ShelfApplicationMenuModel>( 1614 sender, gfx::Point(), false, ui::GetMenuSourceTypeForEvent(e),
1626 item.title, std::move(items), item_delegate), 1615 ink_drop);
1627 source, gfx::Point(), false, ui::GetMenuSourceTypeForEvent(event), 1616 } else if (action != SHELF_ACTION_APP_LIST_SHOWN) {
1628 ink_drop); 1617 // For the app list menu no TRIGGERED ink drop effect is needed and it
1629 return true; 1618 // handles its own ACTIVATED/DEACTIVATED states.
1619 ink_drop->AnimateToState(views::InkDropState::ACTION_TRIGGERED);
1620 }
James Cook 2017/03/09 01:09:46 I'm having a hard time following the booleans here
msw 2017/03/10 06:17:56 Done. Using a nested if block.
1621 // Allow the menu to clear |scoped_root_window_for_new_windows_| during
1622 // OnMenuClosed.
1623 if (!IsShowingMenu())
1624 scoped_root_window_for_new_windows_.reset();
1630 } 1625 }
1631 1626
1632 void ShelfView::ShowContextMenuForView(views::View* source, 1627 void ShelfView::ShowContextMenuForView(views::View* source,
1633 const gfx::Point& point, 1628 const gfx::Point& point,
1634 ui::MenuSourceType source_type) { 1629 ui::MenuSourceType source_type) {
1635 last_pressed_index_ = -1; 1630 last_pressed_index_ = -1;
1636 1631
1637 const ShelfItem* item = ShelfItemForView(source); 1632 const ShelfItem* item = ShelfItemForView(source);
1638 if (!item) { 1633 if (!item) {
1639 WmShell::Get()->ShowContextMenu(point, source_type); 1634 WmShell::Get()->ShowContextMenu(point, source_type);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 1765
1771 int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const { 1766 int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const {
1772 const gfx::Rect bounds = GetBoundsInScreen(); 1767 const gfx::Rect bounds = GetBoundsInScreen();
1773 int distance = wm_shelf_->SelectValueForShelfAlignment( 1768 int distance = wm_shelf_->SelectValueForShelfAlignment(
1774 bounds.y() - coordinate.y(), coordinate.x() - bounds.right(), 1769 bounds.y() - coordinate.y(), coordinate.x() - bounds.right(),
1775 bounds.x() - coordinate.x()); 1770 bounds.x() - coordinate.x());
1776 return distance > 0 ? distance : 0; 1771 return distance > 0 ? distance : 0;
1777 } 1772 }
1778 1773
1779 } // namespace ash 1774 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698