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/shelf/shelf_view.h" | 5 #include "ash/shelf/shelf_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "ash/ash_constants.h" | 9 #include "ash/ash_constants.h" |
| 10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 closing_event_time_(base::TimeDelta()), | 382 closing_event_time_(base::TimeDelta()), |
| 383 got_deleted_(NULL), | 383 got_deleted_(NULL), |
| 384 drag_and_drop_item_pinned_(false), | 384 drag_and_drop_item_pinned_(false), |
| 385 drag_and_drop_shelf_id_(0), | 385 drag_and_drop_shelf_id_(0), |
| 386 dragged_off_shelf_(false), | 386 dragged_off_shelf_(false), |
| 387 snap_back_from_rip_off_view_(NULL), | 387 snap_back_from_rip_off_view_(NULL), |
| 388 item_manager_(Shell::GetInstance()->shelf_item_delegate_manager()), | 388 item_manager_(Shell::GetInstance()->shelf_item_delegate_manager()), |
| 389 layout_manager_(manager), | 389 layout_manager_(manager), |
| 390 overflow_mode_(false), | 390 overflow_mode_(false), |
| 391 main_shelf_(NULL), | 391 main_shelf_(NULL), |
| 392 dragged_off_from_overflow_to_shelf_(false) { | 392 dragged_off_from_overflow_to_shelf_(false), |
| 393 is_usable_event_(true), | |
| 394 last_view_index_(-1) { | |
| 393 DCHECK(model_); | 395 DCHECK(model_); |
| 394 bounds_animator_.reset(new views::BoundsAnimator(this)); | 396 bounds_animator_.reset(new views::BoundsAnimator(this)); |
| 395 bounds_animator_->AddObserver(this); | 397 bounds_animator_->AddObserver(this); |
| 396 set_context_menu_controller(this); | 398 set_context_menu_controller(this); |
| 397 focus_search_.reset(new ShelfFocusSearch(view_model_.get())); | 399 focus_search_.reset(new ShelfFocusSearch(view_model_.get())); |
| 398 tooltip_.reset(new ShelfTooltipManager(manager, this)); | 400 tooltip_.reset(new ShelfTooltipManager(manager, this)); |
| 399 } | 401 } |
| 400 | 402 |
| 401 ShelfView::~ShelfView() { | 403 ShelfView::~ShelfView() { |
| 402 bounds_animator_->RemoveObserver(this); | 404 bounds_animator_->RemoveObserver(this); |
| (...skipping 1161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1564 | 1566 |
| 1565 int index = view_model_->GetIndexOfView(view); | 1567 int index = view_model_->GetIndexOfView(view); |
| 1566 if (index == -1) | 1568 if (index == -1) |
| 1567 return; | 1569 return; |
| 1568 | 1570 |
| 1569 ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( | 1571 ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( |
| 1570 model_->items()[index].id); | 1572 model_->items()[index].id); |
| 1571 if (view_model_->view_size() <= 1 || !item_delegate->IsDraggable()) | 1573 if (view_model_->view_size() <= 1 || !item_delegate->IsDraggable()) |
| 1572 return; // View is being deleted or not draggable, ignore request. | 1574 return; // View is being deleted or not draggable, ignore request. |
| 1573 | 1575 |
| 1576 if (!IsUsableEvent(event)) { | |
|
Mr4D (OOO till 08-26)
2014/12/05 15:21:47
No {}'s
Mr4D (OOO till 08-26)
2014/12/05 15:21:47
Aha! Nice find! Yes, this is much better then the
| |
| 1577 is_usable_event_ = false; | |
| 1578 } | |
| 1579 | |
| 1574 CHECK_EQ(ShelfButton::kViewClassName, view->GetClassName()); | 1580 CHECK_EQ(ShelfButton::kViewClassName, view->GetClassName()); |
| 1575 drag_view_ = static_cast<ShelfButton*>(view); | 1581 drag_view_ = static_cast<ShelfButton*>(view); |
| 1576 drag_origin_ = gfx::Point(event.x(), event.y()); | 1582 drag_origin_ = gfx::Point(event.x(), event.y()); |
| 1577 UMA_HISTOGRAM_ENUMERATION("Ash.ShelfAlignmentUsage", | 1583 UMA_HISTOGRAM_ENUMERATION("Ash.ShelfAlignmentUsage", |
| 1578 layout_manager_->SelectValueForShelfAlignment( | 1584 layout_manager_->SelectValueForShelfAlignment( |
| 1579 SHELF_ALIGNMENT_UMA_ENUM_VALUE_BOTTOM, | 1585 SHELF_ALIGNMENT_UMA_ENUM_VALUE_BOTTOM, |
| 1580 SHELF_ALIGNMENT_UMA_ENUM_VALUE_LEFT, | 1586 SHELF_ALIGNMENT_UMA_ENUM_VALUE_LEFT, |
| 1581 SHELF_ALIGNMENT_UMA_ENUM_VALUE_RIGHT, | 1587 SHELF_ALIGNMENT_UMA_ENUM_VALUE_RIGHT, |
| 1582 -1), | 1588 -1), |
| 1583 SHELF_ALIGNMENT_UMA_ENUM_VALUE_COUNT); | 1589 SHELF_ALIGNMENT_UMA_ENUM_VALUE_COUNT); |
| 1584 } | 1590 } |
| 1585 | 1591 |
| 1586 void ShelfView::PointerDraggedOnButton(views::View* view, | 1592 void ShelfView::PointerDraggedOnButton(views::View* view, |
| 1587 Pointer pointer, | 1593 Pointer pointer, |
| 1588 const ui::LocatedEvent& event) { | 1594 const ui::LocatedEvent& event) { |
| 1589 // To prepare all drag types (moving an item in the shelf and dragging off), | 1595 // To prepare all drag types (moving an item in the shelf and dragging off), |
| 1590 // we should check the x-axis and y-axis offset. | 1596 // we should check the x-axis and y-axis offset. |
| 1591 if (!dragging() && drag_view_ && | 1597 if (!dragging() && drag_view_ && |
| 1592 ((std::abs(event.x() - drag_origin_.x()) >= kMinimumDragDistance) || | 1598 ((std::abs(event.x() - drag_origin_.x()) >= kMinimumDragDistance) || |
| 1593 (std::abs(event.y() - drag_origin_.y()) >= kMinimumDragDistance))) { | 1599 (std::abs(event.y() - drag_origin_.y()) >= kMinimumDragDistance))) { |
| 1594 PrepareForDrag(pointer, event); | 1600 PrepareForDrag(pointer, event); |
| 1595 } | 1601 } |
| 1596 if (drag_pointer_ == pointer) | 1602 if (drag_pointer_ == pointer) |
| 1597 ContinueDrag(event); | 1603 ContinueDrag(event); |
| 1598 } | 1604 } |
| 1599 | 1605 |
| 1600 void ShelfView::PointerReleasedOnButton(views::View* view, | 1606 void ShelfView::PointerReleasedOnButton(views::View* view, |
| 1601 Pointer pointer, | 1607 Pointer pointer, |
| 1602 bool canceled) { | 1608 bool canceled) { |
|
Mr4D (OOO till 08-26)
2014/12/05 15:21:47
Reset the variable.
(Note: If you would not do it
xdai1
2014/12/05 19:01:46
I reset the variable at line 1675 and line 1680. I
Mr4D (OOO till 08-26)
2014/12/05 20:57:13
It's not enough. This could be failing:
Click on
| |
| 1603 if (canceled) { | 1609 if (canceled) { |
| 1604 CancelDrag(-1); | 1610 CancelDrag(-1); |
| 1605 } else if (drag_pointer_ == pointer) { | 1611 } else if (drag_pointer_ == pointer) { |
| 1606 FinalizeRipOffDrag(false); | 1612 FinalizeRipOffDrag(false); |
| 1607 drag_pointer_ = NONE; | 1613 drag_pointer_ = NONE; |
| 1608 AnimateToIdealBounds(); | 1614 AnimateToIdealBounds(); |
| 1609 } | 1615 } |
| 1610 // If the drag pointer is NONE, no drag operation is going on and the | 1616 // If the drag pointer is NONE, no drag operation is going on and the |
| 1611 // drag_view can be released. | 1617 // drag_view can be released. |
| 1612 if (drag_pointer_ == NONE) | 1618 if (drag_pointer_ == NONE) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1656 if (sender == overflow_button_) { | 1662 if (sender == overflow_button_) { |
| 1657 ToggleOverflowBubble(); | 1663 ToggleOverflowBubble(); |
| 1658 return; | 1664 return; |
| 1659 } | 1665 } |
| 1660 | 1666 |
| 1661 int view_index = view_model_->GetIndexOfView(sender); | 1667 int view_index = view_model_->GetIndexOfView(sender); |
| 1662 // May be -1 while in the process of animating closed. | 1668 // May be -1 while in the process of animating closed. |
| 1663 if (view_index == -1) | 1669 if (view_index == -1) |
| 1664 return; | 1670 return; |
| 1665 | 1671 |
| 1666 // If the previous menu was closed by the same event as this one, we ignore | 1672 // If the menu was just closed by the same event as this one, we ignore |
| 1667 // the call. | 1673 // the call. See crbug.com/343005 for more detail. |
| 1668 if (!IsUsableEvent(event)) | 1674 if (!is_usable_event_ && (view_index == last_view_index_)) { |
|
Mr4D (OOO till 08-26)
2014/12/05 15:21:47
The index does not need to be checked since we are
xdai1
2014/12/05 19:01:46
I think we still need to check the index because o
| |
| 1675 is_usable_event_ = true; | |
| 1669 return; | 1676 return; |
| 1677 } | |
| 1678 | |
| 1679 // Reset the |is_usable_event_| to true and record the |view_index|. | |
| 1680 is_usable_event_ = true; | |
| 1681 last_view_index_ = view_index; | |
| 1670 | 1682 |
| 1671 // Don't activate the item twice on double-click. Otherwise the window starts | 1683 // Don't activate the item twice on double-click. Otherwise the window starts |
| 1672 // animating open due to the first click, then immediately minimizes due to | 1684 // animating open due to the first click, then immediately minimizes due to |
| 1673 // the second click. The user most likely intended to open or minimize the | 1685 // the second click. The user most likely intended to open or minimize the |
| 1674 // item once, not do both. | 1686 // item once, not do both. |
| 1675 if (event.flags() & ui::EF_IS_DOUBLE_CLICK) | 1687 if (event.flags() & ui::EF_IS_DOUBLE_CLICK) |
| 1676 return; | 1688 return; |
| 1677 | 1689 |
| 1678 { | 1690 { |
| 1679 ScopedTargetRootWindow scoped_target( | 1691 ScopedTargetRootWindow scoped_target( |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1870 ShelfButton* button = static_cast<ShelfButton*>(view); | 1882 ShelfButton* button = static_cast<ShelfButton*>(view); |
| 1871 button->ClearState(ShelfButton::STATE_HIDDEN); | 1883 button->ClearState(ShelfButton::STATE_HIDDEN); |
| 1872 break; | 1884 break; |
| 1873 } | 1885 } |
| 1874 } | 1886 } |
| 1875 snap_back_from_rip_off_view_ = NULL; | 1887 snap_back_from_rip_off_view_ = NULL; |
| 1876 } | 1888 } |
| 1877 } | 1889 } |
| 1878 } | 1890 } |
| 1879 | 1891 |
| 1880 bool ShelfView::IsUsableEvent(const ui::Event& event) { | 1892 bool ShelfView::IsUsableEvent(const ui::Event& event) { |
|
Mr4D (OOO till 08-26)
2014/12/05 15:21:47
Rename to IsRepostEvent() (and negate the logic ac
| |
| 1881 if (closing_event_time_ == base::TimeDelta()) | 1893 if (closing_event_time_ == base::TimeDelta()) |
| 1882 return true; | 1894 return true; |
| 1883 | 1895 |
| 1884 base::TimeDelta delta = | 1896 base::TimeDelta delta = |
| 1885 base::TimeDelta(event.time_stamp() - closing_event_time_); | 1897 base::TimeDelta(event.time_stamp() - closing_event_time_); |
| 1886 closing_event_time_ = base::TimeDelta(); | 1898 closing_event_time_ = base::TimeDelta(); |
| 1887 // TODO(skuhne): This time seems excessive, but it appears that the reposting | 1899 // If the current (press down) event is a reposted event, the time stamp of |
| 1888 // takes that long. Need to come up with a better way of doing this. | 1900 // these two events should be the same. |
| 1889 return (delta.InMilliseconds() < 0 || delta.InMilliseconds() > 130); | 1901 return (delta.InMilliseconds() != 0); |
|
Mr4D (OOO till 08-26)
2014/12/05 15:21:47
Ahhhh! Much better!
| |
| 1890 } | 1902 } |
| 1891 | 1903 |
| 1892 const ShelfItem* ShelfView::ShelfItemForView(const views::View* view) const { | 1904 const ShelfItem* ShelfView::ShelfItemForView(const views::View* view) const { |
| 1893 int view_index = view_model_->GetIndexOfView(view); | 1905 int view_index = view_model_->GetIndexOfView(view); |
| 1894 if (view_index == -1) | 1906 if (view_index == -1) |
| 1895 return NULL; | 1907 return NULL; |
| 1896 return &(model_->items()[view_index]); | 1908 return &(model_->items()[view_index]); |
| 1897 } | 1909 } |
| 1898 | 1910 |
| 1899 bool ShelfView::ShouldShowTooltipForView(const views::View* view) const { | 1911 bool ShelfView::ShouldShowTooltipForView(const views::View* view) const { |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1925 distance = bounds.x() - coordinate.x(); | 1937 distance = bounds.x() - coordinate.x(); |
| 1926 break; | 1938 break; |
| 1927 case SHELF_ALIGNMENT_TOP: | 1939 case SHELF_ALIGNMENT_TOP: |
| 1928 distance = coordinate.y() - bounds.bottom(); | 1940 distance = coordinate.y() - bounds.bottom(); |
| 1929 break; | 1941 break; |
| 1930 } | 1942 } |
| 1931 return distance > 0 ? distance : 0; | 1943 return distance > 0 ? distance : 0; |
| 1932 } | 1944 } |
| 1933 | 1945 |
| 1934 } // namespace ash | 1946 } // namespace ash |
| OLD | NEW |