Index: ash/shelf/shelf_view.cc |
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc |
index b3ddf686191a9dda5c8e575311ae0c01e757d105..3a197984936d9c1d22a441d05a6a666f68357a9d 100644 |
--- a/ash/shelf/shelf_view.cc |
+++ b/ash/shelf/shelf_view.cc |
@@ -23,7 +23,6 @@ |
#include "ash/shelf/shelf_item_delegate_manager.h" |
#include "ash/shelf/shelf_menu_model.h" |
#include "ash/shelf/shelf_model.h" |
-#include "ash/shelf/shelf_tooltip_manager.h" |
#include "ash/shelf/shelf_widget.h" |
#include "ash/shell.h" |
#include "ash/shell_delegate.h" |
@@ -224,8 +223,7 @@ bool ShelfMenuModelAdapter::ShouldReserveSpaceForSubmenuIndicator() const { |
class ShelfFocusSearch : public views::FocusSearch { |
public: |
explicit ShelfFocusSearch(views::ViewModel* view_model) |
- : FocusSearch(NULL, true, true), |
- view_model_(view_model) {} |
+ : FocusSearch(nullptr, true, true), view_model_(view_model) {} |
~ShelfFocusSearch() override {} |
// views::FocusSearch overrides: |
@@ -370,25 +368,26 @@ ShelfView::ShelfView(ShelfModel* model, ShelfDelegate* delegate, Shelf* shelf) |
view_model_(new views::ViewModel), |
first_visible_index_(0), |
last_visible_index_(-1), |
- overflow_button_(NULL), |
- owner_overflow_bubble_(NULL), |
+ overflow_button_(nullptr), |
+ owner_overflow_bubble_(nullptr), |
+ tooltip_(this), |
drag_pointer_(NONE), |
- drag_view_(NULL), |
+ drag_view_(nullptr), |
start_drag_index_(-1), |
context_menu_id_(0), |
leading_inset_(kDefaultLeadingInset), |
cancelling_drag_model_changed_(false), |
last_hidden_index_(0), |
closing_event_time_(base::TimeDelta()), |
- got_deleted_(NULL), |
+ got_deleted_(nullptr), |
drag_and_drop_item_pinned_(false), |
drag_and_drop_shelf_id_(0), |
drag_replaced_view_(nullptr), |
dragged_off_shelf_(false), |
- snap_back_from_rip_off_view_(NULL), |
+ snap_back_from_rip_off_view_(nullptr), |
item_manager_(Shell::GetInstance()->shelf_item_delegate_manager()), |
overflow_mode_(false), |
- main_shelf_(NULL), |
+ main_shelf_(nullptr), |
dragged_off_from_overflow_to_shelf_(false), |
is_repost_event_(false), |
last_pressed_index_(-1) { |
@@ -397,7 +396,6 @@ ShelfView::ShelfView(ShelfModel* model, ShelfDelegate* delegate, Shelf* shelf) |
bounds_animator_->AddObserver(this); |
set_context_menu_controller(this); |
focus_search_.reset(new ShelfFocusSearch(view_model_.get())); |
- tooltip_.reset(new ShelfTooltipManager(shelf->shelf_layout_manager(), this)); |
} |
ShelfView::~ShelfView() { |
@@ -434,7 +432,7 @@ void ShelfView::OnShelfAlignmentChanged() { |
if (i >= first_visible_index_ && i <= last_visible_index_) |
view_model_->view_at(i)->Layout(); |
} |
- tooltip_->Close(); |
+ tooltip_.Close(); |
if (overflow_bubble_) |
overflow_bubble_->Hide(); |
} |
@@ -517,7 +515,42 @@ views::View* ShelfView::GetAppListButtonView() const { |
} |
NOTREACHED() << "Applist button not found"; |
- return NULL; |
+ return nullptr; |
+} |
+ |
+bool ShelfView::ShouldHideTooltip(const gfx::Point& cursor_location) const { |
+ gfx::Rect tooltip_bounds; |
+ for (int i = 0; i < child_count(); ++i) { |
+ const views::View* child = child_at(i); |
+ if (child != overflow_button_ && ShouldShowTooltipForView(child)) |
+ tooltip_bounds.Union(child->GetMirroredBounds()); |
+ } |
+ return !tooltip_bounds.Contains(cursor_location); |
+} |
+ |
+bool ShelfView::ShouldShowTooltipForView(const views::View* view) const { |
+ if (view == GetAppListButtonView() && |
+ Shell::GetInstance()->GetAppListWindow()) { |
+ return false; |
+ } |
+ const ShelfItem* item = ShelfItemForView(view); |
+ if (!item) |
+ return false; |
+ return item_manager_->GetShelfItemDelegate(item->id)->ShouldShowTooltip(); |
+} |
+ |
+base::string16 ShelfView::GetTitleForView(const views::View* view) const { |
+ const ShelfItem* item = ShelfItemForView(view); |
+ if (!item) |
+ return base::string16(); |
+ return item_manager_->GetShelfItemDelegate(item->id)->GetTitle(); |
+} |
+ |
+gfx::Rect ShelfView::GetVisibleItemsBoundsInScreen() { |
+ gfx::Size preferred_size = GetPreferredSize(); |
+ gfx::Point origin(GetMirroredXWithWidthInView(0, preferred_size.width()), 0); |
+ ConvertPointToScreen(this, &origin); |
+ return gfx::Rect(origin, preferred_size); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -560,7 +593,7 @@ void ShelfView::CreateDragIconProxy( |
void ShelfView::UpdateDragIconProxy( |
const gfx::Point& location_in_screen_coordinates) { |
- // TODO(jennyz): Investigate why drag_image_ becomes NULL at this point per |
+ // TODO(jennyz): Investigate why drag_image_ becomes null at this point per |
// crbug.com/34722, while the app list item is still being dragged around. |
if (drag_image_) { |
drag_image_->SetScreenPosition( |
@@ -621,9 +654,7 @@ bool ShelfView::StartDrag(const std::string& app_id, |
ash::wm::GetRootWindowAt(location_in_screen_coordinates), &point_in_root); |
ui::MouseEvent event(ui::ET_MOUSE_PRESSED, pt, point_in_root, |
ui::EventTimeForNow(), 0, 0); |
- PointerPressedOnButton(drag_and_drop_view, |
- ShelfButtonHost::DRAG_AND_DROP, |
- event); |
+ PointerPressedOnButton(drag_and_drop_view, DRAG_AND_DROP, event); |
// Drag the item where it really belongs. |
Drag(location_in_screen_coordinates); |
@@ -644,9 +675,7 @@ bool ShelfView::Drag(const gfx::Point& location_in_screen_coordinates) { |
ash::wm::GetRootWindowAt(location_in_screen_coordinates), &point_in_root); |
ui::MouseEvent event(ui::ET_MOUSE_DRAGGED, pt, point_in_root, |
ui::EventTimeForNow(), 0, 0); |
- PointerDraggedOnButton(drag_and_drop_view, |
- ShelfButtonHost::DRAG_AND_DROP, |
- event); |
+ PointerDraggedOnButton(drag_and_drop_view, DRAG_AND_DROP, event); |
return true; |
} |
@@ -656,8 +685,7 @@ void ShelfView::EndDrag(bool cancel) { |
views::View* drag_and_drop_view = view_model_->view_at( |
model_->ItemIndexByID(drag_and_drop_shelf_id_)); |
- PointerReleasedOnButton( |
- drag_and_drop_view, ShelfButtonHost::DRAG_AND_DROP, cancel); |
+ PointerReleasedOnButton(drag_and_drop_view, DRAG_AND_DROP, cancel); |
// Either destroy the temporarily created item - or - make the item visible. |
if (drag_and_drop_item_pinned_ && cancel) { |
@@ -676,6 +704,69 @@ void ShelfView::EndDrag(bool cancel) { |
drag_and_drop_shelf_id_ = 0; |
} |
+void ShelfView::PointerPressedOnButton(views::View* view, |
+ Pointer pointer, |
+ const ui::LocatedEvent& event) { |
+ if (drag_view_) |
+ return; |
+ |
+ int index = view_model_->GetIndexOfView(view); |
+ if (index == -1) |
+ return; |
+ |
+ ShelfItemDelegate* item_delegate = |
+ item_manager_->GetShelfItemDelegate(model_->items()[index].id); |
+ if (view_model_->view_size() <= 1 || !item_delegate->IsDraggable()) |
+ return; // View is being deleted or not draggable, ignore request. |
+ |
+ // Only when the repost event occurs on the same shelf item, we should ignore |
+ // the call in ShelfView::ButtonPressed(...). |
+ is_repost_event_ = IsRepostEvent(event) && (last_pressed_index_ == index); |
+ |
+ CHECK_EQ(ShelfButton::kViewClassName, view->GetClassName()); |
+ drag_view_ = static_cast<ShelfButton*>(view); |
+ drag_origin_ = gfx::Point(event.x(), event.y()); |
+ UMA_HISTOGRAM_ENUMERATION("Ash.ShelfAlignmentUsage", |
+ shelf_->SelectValueForShelfAlignment( |
+ SHELF_ALIGNMENT_UMA_ENUM_VALUE_BOTTOM, |
+ SHELF_ALIGNMENT_UMA_ENUM_VALUE_LEFT, |
+ SHELF_ALIGNMENT_UMA_ENUM_VALUE_RIGHT, -1), |
+ SHELF_ALIGNMENT_UMA_ENUM_VALUE_COUNT); |
+} |
+ |
+void ShelfView::PointerDraggedOnButton(views::View* view, |
+ Pointer pointer, |
+ const ui::LocatedEvent& event) { |
+ // To prepare all drag types (moving an item in the shelf and dragging off), |
+ // we should check the x-axis and y-axis offset. |
+ if (!dragging() && drag_view_ && |
+ ((std::abs(event.x() - drag_origin_.x()) >= kMinimumDragDistance) || |
+ (std::abs(event.y() - drag_origin_.y()) >= kMinimumDragDistance))) { |
+ PrepareForDrag(pointer, event); |
+ } |
+ if (drag_pointer_ == pointer) |
+ ContinueDrag(event); |
+} |
+ |
+void ShelfView::PointerReleasedOnButton(views::View* view, |
+ Pointer pointer, |
+ bool canceled) { |
+ // Reset |is_repost_event| to false. |
+ is_repost_event_ = false; |
+ |
+ if (canceled) { |
+ CancelDrag(-1); |
+ } else if (drag_pointer_ == pointer) { |
+ FinalizeRipOffDrag(false); |
+ drag_pointer_ = NONE; |
+ AnimateToIdealBounds(); |
+ } |
+ // If the drag pointer is NONE, no drag operation is going on and the |
+ // drag_view can be released. |
+ if (drag_pointer_ == NONE) |
+ drag_view_ = nullptr; |
+} |
+ |
void ShelfView::LayoutToIdealBounds() { |
if (bounds_animator_->IsAnimating()) { |
AnimateToIdealBounds(); |
@@ -883,7 +974,7 @@ void ShelfView::AnimateToIdealBounds() { |
} |
views::View* ShelfView::CreateViewForItem(const ShelfItem& item) { |
- views::View* view = NULL; |
+ views::View* view = nullptr; |
switch (item.type) { |
case TYPE_BROWSER_SHORTCUT: |
case TYPE_APP_SHORTCUT: |
@@ -891,7 +982,7 @@ views::View* ShelfView::CreateViewForItem(const ShelfItem& item) { |
case TYPE_PLATFORM_APP: |
case TYPE_DIALOG: |
case TYPE_APP_PANEL: { |
- ShelfButton* button = ShelfButton::Create(this, this, shelf_); |
+ ShelfButton* button = new ShelfButton(this); |
button->SetImage(item.image); |
ReflectItemStatus(item, button); |
view = button; |
@@ -899,16 +990,15 @@ views::View* ShelfView::CreateViewForItem(const ShelfItem& item) { |
} |
case TYPE_APP_LIST: { |
- view = new AppListButton(this, this, shelf_->shelf_widget()); |
+ view = new AppListButton(this); |
break; |
} |
- default: |
- break; |
+ case TYPE_UNDEFINED: |
+ return nullptr; |
} |
- view->set_context_menu_controller(this); |
- DCHECK(view); |
+ view->set_context_menu_controller(this); |
ConfigureChildView(view); |
return view; |
} |
@@ -1295,30 +1385,6 @@ void ShelfView::UpdateOverflowRange(ShelfView* overflow_view) const { |
overflow_view->last_visible_index_ = last_overflow_index; |
} |
-bool ShelfView::ShouldHideTooltip(const gfx::Point& cursor_location) { |
- gfx::Rect active_bounds; |
- |
- for (int i = 0; i < child_count(); ++i) { |
- views::View* child = child_at(i); |
- if (child == overflow_button_) |
- continue; |
- if (!ShouldShowTooltipForView(child)) |
- continue; |
- |
- gfx::Rect child_bounds = child->GetMirroredBounds(); |
- active_bounds.Union(child_bounds); |
- } |
- |
- return !active_bounds.Contains(cursor_location); |
-} |
- |
-gfx::Rect ShelfView::GetVisibleItemsBoundsInScreen() { |
- gfx::Size preferred_size = GetPreferredSize(); |
- gfx::Point origin(GetMirroredXWithWidthInView(0, preferred_size.width()), 0); |
- ConvertPointToScreen(this, &origin); |
- return gfx::Rect(origin, preferred_size); |
-} |
- |
gfx::Rect ShelfView::GetBoundsForDragInsertInScreen() { |
gfx::Size preferred_size; |
if (is_overflow_mode()) { |
@@ -1366,7 +1432,7 @@ int ShelfView::CancelDrag(int modified_index) { |
bool was_dragging = dragging(); |
int drag_view_index = view_model_->GetIndexOfView(drag_view_); |
drag_pointer_ = NONE; |
- drag_view_ = NULL; |
+ drag_view_ = nullptr; |
if (drag_view_index == modified_index) { |
// The view that was being dragged is being modified. Don't do anything. |
return modified_index; |
@@ -1376,9 +1442,9 @@ int ShelfView::CancelDrag(int modified_index) { |
// Restore previous position, tracking the position of the modified view. |
bool at_end = modified_index == view_model_->view_size(); |
- views::View* modified_view = |
- (modified_index >= 0 && !at_end) ? |
- view_model_->view_at(modified_index) : NULL; |
+ views::View* modified_view = (modified_index >= 0 && !at_end) |
+ ? view_model_->view_at(modified_index) |
+ : nullptr; |
model_->Move(drag_view_index, start_drag_index_); |
// If the modified view will be at the end of the list, return the new end of |
@@ -1441,6 +1507,12 @@ void ShelfView::GetAccessibleState(ui::AXViewState* state) { |
state->name = l10n_util::GetStringUTF16(IDS_ASH_SHELF_ACCESSIBLE_NAME); |
} |
+void ShelfView::ViewHierarchyChanged( |
+ const ViewHierarchyChangedDetails& details) { |
+ if (details.is_add && details.child == this && GetWidget()) |
+ tooltip_.Init(); |
+} |
+ |
void ShelfView::OnGestureEvent(ui::GestureEvent* event) { |
aura::Window* target_window = static_cast<views::View*>(event->target()) |
->GetWidget() |
@@ -1523,10 +1595,8 @@ void ShelfView::ShelfItemRemoved(int model_index, ShelfID id) { |
AnimateToIdealBounds(); |
} |
- // Close the tooltip because it isn't needed any longer and its anchor view |
- // will be deleted soon. |
- if (tooltip_->GetCurrentAnchorView() == view) |
- tooltip_->Close(); |
+ if (view == tooltip_.GetCurrentAnchorView()) |
+ tooltip_.Close(); |
} |
void ShelfView::ShelfItemChanged(int model_index, const ShelfItem& old_item) { |
@@ -1585,104 +1655,6 @@ void ShelfView::ShelfItemMoved(int start_index, int target_index) { |
AnimateToIdealBounds(); |
} |
-void ShelfView::PointerPressedOnButton(views::View* view, |
- Pointer pointer, |
- const ui::LocatedEvent& event) { |
- if (drag_view_) |
- return; |
- |
- int index = view_model_->GetIndexOfView(view); |
- if (index == -1) |
- return; |
- |
- ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( |
- model_->items()[index].id); |
- if (view_model_->view_size() <= 1 || !item_delegate->IsDraggable()) |
- return; // View is being deleted or not draggable, ignore request. |
- |
- // Only when the repost event occurs on the same shelf item, we should ignore |
- // the call in ShelfView::ButtonPressed(...). |
- is_repost_event_ = IsRepostEvent(event) && (last_pressed_index_ == index); |
- |
- CHECK_EQ(ShelfButton::kViewClassName, view->GetClassName()); |
- drag_view_ = static_cast<ShelfButton*>(view); |
- drag_origin_ = gfx::Point(event.x(), event.y()); |
- UMA_HISTOGRAM_ENUMERATION("Ash.ShelfAlignmentUsage", |
- shelf_->SelectValueForShelfAlignment( |
- SHELF_ALIGNMENT_UMA_ENUM_VALUE_BOTTOM, |
- SHELF_ALIGNMENT_UMA_ENUM_VALUE_LEFT, |
- SHELF_ALIGNMENT_UMA_ENUM_VALUE_RIGHT, -1), |
- SHELF_ALIGNMENT_UMA_ENUM_VALUE_COUNT); |
-} |
- |
-void ShelfView::PointerDraggedOnButton(views::View* view, |
- Pointer pointer, |
- const ui::LocatedEvent& event) { |
- // To prepare all drag types (moving an item in the shelf and dragging off), |
- // we should check the x-axis and y-axis offset. |
- if (!dragging() && drag_view_ && |
- ((std::abs(event.x() - drag_origin_.x()) >= kMinimumDragDistance) || |
- (std::abs(event.y() - drag_origin_.y()) >= kMinimumDragDistance))) { |
- PrepareForDrag(pointer, event); |
- } |
- if (drag_pointer_ == pointer) |
- ContinueDrag(event); |
-} |
- |
-void ShelfView::PointerReleasedOnButton(views::View* view, |
- Pointer pointer, |
- bool canceled) { |
- // Reset |is_repost_event| to false. |
- is_repost_event_ = false; |
- |
- if (canceled) { |
- CancelDrag(-1); |
- } else if (drag_pointer_ == pointer) { |
- FinalizeRipOffDrag(false); |
- drag_pointer_ = NONE; |
- AnimateToIdealBounds(); |
- } |
- // If the drag pointer is NONE, no drag operation is going on and the |
- // drag_view can be released. |
- if (drag_pointer_ == NONE) |
- drag_view_ = NULL; |
-} |
- |
-void ShelfView::MouseMovedOverButton(views::View* view) { |
- if (!ShouldShowTooltipForView(view)) |
- return; |
- |
- if (!tooltip_->IsVisible()) |
- tooltip_->ResetTimer(); |
-} |
- |
-void ShelfView::MouseEnteredButton(views::View* view) { |
- if (!ShouldShowTooltipForView(view)) |
- return; |
- |
- if (tooltip_->IsVisible()) { |
- tooltip_->ShowImmediately(view, GetAccessibleName(view)); |
- } else { |
- tooltip_->ShowDelayed(view, GetAccessibleName(view)); |
- } |
-} |
- |
-void ShelfView::MouseExitedButton(views::View* view) { |
- if (!tooltip_->IsVisible()) |
- tooltip_->StopTimer(); |
-} |
- |
-base::string16 ShelfView::GetAccessibleName(const views::View* view) { |
- int view_index = view_model_->GetIndexOfView(view); |
- // May be -1 while in the process of animating closed. |
- if (view_index == -1) |
- return base::string16(); |
- |
- ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( |
- model_->items()[view_index].id); |
- return item_delegate->GetTitle(); |
-} |
- |
void ShelfView::ButtonPressed(views::Button* sender, const ui::Event& event) { |
// Do not handle mouse release during drag. |
if (dragging()) |
@@ -1882,7 +1854,7 @@ void ShelfView::OnBoundsAnimatorDone(views::BoundsAnimator* animator) { |
break; |
} |
} |
- snap_back_from_rip_off_view_ = NULL; |
+ snap_back_from_rip_off_view_ = nullptr; |
} |
} |
} |
@@ -1904,18 +1876,6 @@ const ShelfItem* ShelfView::ShelfItemForView(const views::View* view) const { |
return (view_index < 0) ? nullptr : &(model_->items()[view_index]); |
} |
-bool ShelfView::ShouldShowTooltipForView(const views::View* view) const { |
- if (view == GetAppListButtonView() && |
- Shell::GetInstance()->GetAppListTargetVisibility()) |
- return false; |
- const ShelfItem* item = ShelfItemForView(view); |
- if (!item) |
- return true; |
- ShelfItemDelegate* item_delegate = |
- item_manager_->GetShelfItemDelegate(item->id); |
- return item_delegate->ShouldShowTooltip(); |
-} |
- |
int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const { |
const gfx::Rect bounds = GetBoundsInScreen(); |
int distance = shelf_->SelectValueForShelfAlignment( |