Index: ui/app_list/apps_grid_view.cc |
diff --git a/ui/app_list/apps_grid_view.cc b/ui/app_list/apps_grid_view.cc |
deleted file mode 100644 |
index b37186b809b9bd55e3902427adb67db06a151dbb..0000000000000000000000000000000000000000 |
--- a/ui/app_list/apps_grid_view.cc |
+++ /dev/null |
@@ -1,793 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/app_list/apps_grid_view.h" |
- |
-#include <algorithm> |
- |
-#include "ui/app_list/app_list_item_view.h" |
-#include "ui/app_list/apps_grid_view_delegate.h" |
-#include "ui/app_list/page_switcher.h" |
-#include "ui/app_list/pagination_model.h" |
-#include "ui/app_list/pulsing_block_view.h" |
-#include "ui/base/animation/animation.h" |
-#include "ui/base/events/event.h" |
-#include "ui/views/border.h" |
-#include "ui/views/view_model_utils.h" |
-#include "ui/views/widget/widget.h" |
- |
-#if defined(USE_AURA) |
-#include "ui/aura/root_window.h" |
-#endif |
- |
-namespace { |
- |
-// Padding space in pixels for fixed layout. |
-const int kLeftRightPadding = 20; |
-const int kTopPadding = 1; |
- |
-// Padding space in pixels between pages. |
-const int kPagePadding = 40; |
- |
-// Preferred tile size when showing in fixed layout. |
-const int kPreferredTileWidth = 88; |
-const int kPreferredTileHeight = 98; |
- |
-// Width in pixels of the area on the sides that triggers a page flip. |
-const int kPageFlipZoneSize = 40; |
- |
-// Delay in milliseconds to do the page flip. |
-const int kPageFlipDelayInMs = 1000; |
- |
-// RowMoveAnimationDelegate is used when moving an item into a different row. |
-// Before running the animation, the item's layer is re-created and kept in |
-// the original position, then the item is moved to just before its target |
-// position and opacity set to 0. When the animation runs, this delegate moves |
-// the layer and fades it out while fading in the item at the same time. |
-class RowMoveAnimationDelegate |
- : public views::BoundsAnimator::OwnedAnimationDelegate { |
- public: |
- RowMoveAnimationDelegate(views::View* view, |
- ui::Layer* layer, |
- const gfx::Rect& layer_target) |
- : view_(view), |
- layer_(layer), |
- layer_start_(layer ? layer->bounds() : gfx::Rect()), |
- layer_target_(layer_target) { |
- } |
- virtual ~RowMoveAnimationDelegate() {} |
- |
- // ui::AnimationDelegate overrides: |
- virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE { |
- view_->layer()->SetOpacity(animation->GetCurrentValue()); |
- view_->layer()->ScheduleDraw(); |
- |
- if (layer_) { |
- layer_->SetOpacity(1 - animation->GetCurrentValue()); |
- layer_->SetBounds(animation->CurrentValueBetween(layer_start_, |
- layer_target_)); |
- layer_->ScheduleDraw(); |
- } |
- } |
- virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE { |
- view_->layer()->SetOpacity(1.0f); |
- view_->layer()->ScheduleDraw(); |
- } |
- virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE { |
- view_->layer()->SetOpacity(1.0f); |
- view_->layer()->ScheduleDraw(); |
- } |
- |
- private: |
- // The view that needs to be wrapped. Owned by views hierarchy. |
- views::View* view_; |
- |
- scoped_ptr<ui::Layer> layer_; |
- const gfx::Rect layer_start_; |
- const gfx::Rect layer_target_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RowMoveAnimationDelegate); |
-}; |
- |
-} // namespace |
- |
-namespace app_list { |
- |
-AppsGridView::AppsGridView(AppsGridViewDelegate* delegate, |
- PaginationModel* pagination_model) |
- : model_(NULL), |
- delegate_(delegate), |
- pagination_model_(pagination_model), |
- page_switcher_view_(new PageSwitcher(pagination_model)), |
- cols_(0), |
- rows_per_page_(0), |
- selected_view_(NULL), |
- drag_view_(NULL), |
- drag_pointer_(NONE), |
- page_flip_target_(-1), |
- page_flip_delay_in_ms_(kPageFlipDelayInMs), |
- ALLOW_THIS_IN_INITIALIZER_LIST(bounds_animator_(this)) { |
- pagination_model_->AddObserver(this); |
- AddChildView(page_switcher_view_); |
-} |
- |
-AppsGridView::~AppsGridView() { |
- if (model_) { |
- model_->RemoveObserver(this); |
- model_->apps()->RemoveObserver(this); |
- } |
- pagination_model_->RemoveObserver(this); |
-} |
- |
-void AppsGridView::SetLayout(int icon_size, int cols, int rows_per_page) { |
- icon_size_.SetSize(icon_size, icon_size); |
- cols_ = cols; |
- rows_per_page_ = rows_per_page; |
- |
- set_border(views::Border::CreateEmptyBorder(kTopPadding, |
- kLeftRightPadding, |
- 0, |
- kLeftRightPadding)); |
-} |
- |
-void AppsGridView::SetModel(AppListModel* model) { |
- if (model_) { |
- model_->RemoveObserver(this); |
- model_->apps()->RemoveObserver(this); |
- } |
- |
- model_ = model; |
- if (model_) { |
- model_->AddObserver(this); |
- model_->apps()->AddObserver(this); |
- } |
- Update(); |
-} |
- |
-void AppsGridView::SetSelectedView(views::View* view) { |
- if (IsSelectedView(view) || IsDraggedView(view)) |
- return; |
- |
- Index index = GetIndexOfView(view); |
- if (IsValidIndex(index)) |
- SetSelectedItemByIndex(index); |
-} |
- |
-void AppsGridView::ClearSelectedView(views::View* view) { |
- if (view && IsSelectedView(view)) { |
- selected_view_->SchedulePaint(); |
- selected_view_ = NULL; |
- } |
-} |
- |
-bool AppsGridView::IsSelectedView(const views::View* view) const { |
- return selected_view_ == view; |
-} |
- |
-void AppsGridView::EnsureViewVisible(const views::View* view) { |
- if (pagination_model_->has_transition()) |
- return; |
- |
- Index index = GetIndexOfView(view); |
- if (IsValidIndex(index)) |
- pagination_model_->SelectPage(index.page, false); |
-} |
- |
-void AppsGridView::InitiateDrag(views::View* view, |
- Pointer pointer, |
- const ui::LocatedEvent& event) { |
- if (drag_view_ || pulsing_blocks_model_.view_size()) |
- return; |
- |
- drag_view_ = view; |
- drag_start_ = event.location(); |
-} |
- |
-void AppsGridView::UpdateDrag(views::View* view, |
- Pointer pointer, |
- const ui::LocatedEvent& event) { |
- if (!dragging() && drag_view_ && |
- ExceededDragThreshold(event.location() - drag_start_)) { |
- drag_pointer_ = pointer; |
- // Move the view to the front so that it appears on top of other views. |
- ReorderChildView(drag_view_, -1); |
- bounds_animator_.StopAnimatingView(drag_view_); |
- } |
- if (drag_pointer_ != pointer) |
- return; |
- |
- ExtractDragLocation(event, &last_drag_point_); |
- |
- const Index last_drop_target = drop_target_; |
- CalculateDropTarget(last_drag_point_, false); |
- MaybeStartPageFlipTimer(last_drag_point_); |
- |
- gfx::Point page_switcher_point(last_drag_point_); |
- views::View::ConvertPointToTarget(this, page_switcher_view_, |
- &page_switcher_point); |
- page_switcher_view_->UpdateUIForDragPoint(page_switcher_point); |
- |
- if (last_drop_target != drop_target_) |
- AnimateToIdealBounds(); |
- drag_view_->SetPosition( |
- gfx::PointAtOffsetFromOrigin(last_drag_point_ - drag_start_)); |
-} |
- |
-void AppsGridView::EndDrag(bool cancel) { |
- if (!cancel && dragging() && drag_view_) { |
- CalculateDropTarget(last_drag_point_, true); |
- if (IsValidIndex(drop_target_)) |
- MoveItemInModel(drag_view_, drop_target_); |
- } |
- |
- drag_pointer_ = NONE; |
- drop_target_ = Index(); |
- if (drag_view_) { |
- drag_view_ = NULL; |
- AnimateToIdealBounds(); |
- } |
- |
- page_flip_timer_.Stop(); |
- page_flip_target_ = -1; |
-} |
- |
-bool AppsGridView::IsDraggedView(const views::View* view) const { |
- return drag_view_ == view; |
-} |
- |
-gfx::Size AppsGridView::GetPreferredSize() { |
- const gfx::Insets insets(GetInsets()); |
- const gfx::Size tile_size = gfx::Size(kPreferredTileWidth, |
- kPreferredTileHeight); |
- const int page_switcher_height = |
- page_switcher_view_->GetPreferredSize().height(); |
- return gfx::Size( |
- tile_size.width() * cols_ + insets.width(), |
- tile_size.height() * rows_per_page_ + |
- page_switcher_height + insets.height()); |
-} |
- |
-void AppsGridView::Layout() { |
- if (bounds_animator_.IsAnimating()) |
- bounds_animator_.Cancel(); |
- |
- CalculateIdealBounds(); |
- for (int i = 0; i < view_model_.view_size(); ++i) { |
- views::View* view = view_model_.view_at(i); |
- if (view != drag_view_) |
- view->SetBoundsRect(view_model_.ideal_bounds(i)); |
- } |
- views::ViewModelUtils::SetViewBoundsToIdealBounds(pulsing_blocks_model_); |
- |
- const int page_switcher_height = |
- page_switcher_view_->GetPreferredSize().height(); |
- gfx::Rect rect(GetContentsBounds()); |
- rect.set_y(rect.bottom() - page_switcher_height); |
- rect.set_height(page_switcher_height); |
- page_switcher_view_->SetBoundsRect(rect); |
-} |
- |
-bool AppsGridView::OnKeyPressed(const ui::KeyEvent& event) { |
- bool handled = false; |
- if (selected_view_) |
- handled = selected_view_->OnKeyPressed(event); |
- |
- if (!handled) { |
- switch (event.key_code()) { |
- case ui::VKEY_LEFT: |
- MoveSelected(0, -1); |
- return true; |
- case ui::VKEY_RIGHT: |
- MoveSelected(0, 1); |
- return true; |
- case ui::VKEY_UP: |
- MoveSelected(0, -cols_); |
- return true; |
- case ui::VKEY_DOWN: |
- MoveSelected(0, cols_); |
- return true; |
- case ui::VKEY_PRIOR: { |
- MoveSelected(-1, 0); |
- return true; |
- } |
- case ui::VKEY_NEXT: { |
- MoveSelected(1, 0); |
- return true; |
- } |
- default: |
- break; |
- } |
- } |
- |
- return handled; |
-} |
- |
-bool AppsGridView::OnKeyReleased(const ui::KeyEvent& event) { |
- bool handled = false; |
- if (selected_view_) |
- handled = selected_view_->OnKeyReleased(event); |
- |
- return handled; |
-} |
- |
-void AppsGridView::ViewHierarchyChanged(bool is_add, |
- views::View* parent, |
- views::View* child) { |
- if (!is_add && parent == this) { |
- if (selected_view_ == child) |
- selected_view_ = NULL; |
- |
- if (drag_view_ == child) |
- EndDrag(true); |
- |
- bounds_animator_.StopAnimatingView(child); |
- } |
-} |
- |
-void AppsGridView::Update() { |
- DCHECK(!selected_view_ && !drag_view_); |
- |
- view_model_.Clear(); |
- if (model_ && model_->apps()->item_count()) |
- ListItemsAdded(0, model_->apps()->item_count()); |
-} |
- |
-void AppsGridView::UpdatePaging() { |
- if (!view_model_.view_size() || !tiles_per_page()) { |
- pagination_model_->SetTotalPages(0); |
- return; |
- } |
- |
- pagination_model_->SetTotalPages( |
- (view_model_.view_size() - 1) / tiles_per_page() + 1); |
-} |
- |
-void AppsGridView::UpdatePulsingBlockViews() { |
- const int available_slots = |
- tiles_per_page() - model_->apps()->item_count() % tiles_per_page(); |
- const int desired = model_->status() == AppListModel::STATUS_SYNCING ? |
- available_slots : 0; |
- |
- if (pulsing_blocks_model_.view_size() == desired) |
- return; |
- |
- while (pulsing_blocks_model_.view_size() > desired) { |
- views::View* view = pulsing_blocks_model_.view_at(0); |
- pulsing_blocks_model_.Remove(0); |
- delete view; |
- } |
- |
- while (pulsing_blocks_model_.view_size() < desired) { |
- views::View* view = new PulsingBlockView( |
- gfx::Size(kPreferredTileWidth, kPreferredTileHeight), true); |
- pulsing_blocks_model_.Add(view, 0); |
- AddChildView(view); |
- } |
-} |
- |
-views::View* AppsGridView::CreateViewForItemAtIndex(size_t index) { |
- DCHECK_LT(index, model_->apps()->item_count()); |
- AppListItemView* view = new AppListItemView(this, |
- model_->apps()->GetItemAt(index)); |
- view->SetIconSize(icon_size_); |
-#if defined(USE_AURA) |
- view->SetPaintToLayer(true); |
- view->SetFillsBoundsOpaquely(false); |
-#endif |
- return view; |
-} |
- |
-void AppsGridView::SetSelectedItemByIndex(const Index& index) { |
- if (GetIndexOfView(selected_view_) == index) |
- return; |
- |
- views::View* new_selection = GetViewAtIndex(index); |
- if (!new_selection) |
- return; // Keep current selection. |
- |
- if (selected_view_) |
- selected_view_->SchedulePaint(); |
- |
- selected_view_ = new_selection; |
- EnsureViewVisible(selected_view_); |
- selected_view_->SchedulePaint(); |
- if (GetWidget()) { |
- GetWidget()->NotifyAccessibilityEvent( |
- selected_view_, ui::AccessibilityTypes::EVENT_FOCUS, true); |
- } |
-} |
- |
-bool AppsGridView::IsValidIndex(const Index& index) const { |
- return index.page >= 0 && index.page < pagination_model_->total_pages() && |
- index.slot >= 0 && index.slot < tiles_per_page() && |
- index.page * tiles_per_page() + index.slot < view_model_.view_size(); |
-} |
- |
-AppsGridView::Index AppsGridView::GetIndexOfView( |
- const views::View* view) const { |
- const int model_index = view_model_.GetIndexOfView(view); |
- if (model_index == -1) |
- return Index(); |
- |
- return Index(model_index / tiles_per_page(), model_index % tiles_per_page()); |
-} |
- |
-views::View* AppsGridView::GetViewAtIndex(const Index& index) const { |
- if (!IsValidIndex(index)) |
- return NULL; |
- |
- const int model_index = index.page * tiles_per_page() + index.slot; |
- return view_model_.view_at(model_index); |
-} |
- |
-void AppsGridView::MoveSelected(int page_delta, int slot_delta) { |
- if (!selected_view_) |
- return SetSelectedItemByIndex(Index(0, 0)); |
- |
- const Index& selected = GetIndexOfView(selected_view_); |
- int target_slot = selected.slot + slot_delta; |
- if (target_slot < 0) { |
- page_delta += (target_slot + 1) / tiles_per_page() - 1; |
- target_slot = tiles_per_page() + (target_slot + 1) % tiles_per_page() - 1; |
- } else if (target_slot > tiles_per_page()) { |
- page_delta += target_slot / tiles_per_page(); |
- target_slot %= tiles_per_page(); |
- } |
- |
- int target_page = std::min(pagination_model_->total_pages() - 1, |
- std::max(selected.page + page_delta, 0)); |
- SetSelectedItemByIndex(Index(target_page, target_slot)); |
-} |
- |
-void AppsGridView::CalculateIdealBounds() { |
- gfx::Rect rect(GetContentsBounds()); |
- if (rect.IsEmpty()) |
- return; |
- |
- gfx::Size tile_size(kPreferredTileWidth, kPreferredTileHeight); |
- |
- gfx::Rect grid_rect(gfx::Size(tile_size.width() * cols_, |
- tile_size.height() * rows_per_page_)); |
- grid_rect.Intersect(rect); |
- |
- // Page width including padding pixels. A tile.x + page_width means the same |
- // tile slot in the next page. |
- const int page_width = grid_rect.width() + kPagePadding; |
- |
- // If there is a transition, calculates offset for current and target page. |
- const int current_page = pagination_model_->selected_page(); |
- const PaginationModel::Transition& transition = |
- pagination_model_->transition(); |
- const bool is_valid = |
- pagination_model_->is_valid_page(transition.target_page); |
- |
- // Transition to right means negative offset. |
- const int dir = transition.target_page > current_page ? -1 : 1; |
- const int transition_offset = is_valid ? |
- transition.progress * page_width * dir : 0; |
- |
- const int total_views = |
- view_model_.view_size() + pulsing_blocks_model_.view_size(); |
- int slot_index = 0; |
- for (int i = 0; i < total_views; ++i) { |
- if (i < view_model_.view_size() && view_model_.view_at(i) == drag_view_) |
- continue; |
- |
- int page = slot_index / tiles_per_page(); |
- int slot = slot_index % tiles_per_page(); |
- |
- if (drop_target_.page == page && drop_target_.slot == slot) { |
- ++slot_index; |
- page = slot_index / tiles_per_page(); |
- slot = slot_index % tiles_per_page(); |
- } |
- |
- // Decides an x_offset for current item. |
- int x_offset = 0; |
- if (page < current_page) |
- x_offset = -page_width; |
- else if (page > current_page) |
- x_offset = page_width; |
- |
- if (is_valid) { |
- if (page == current_page || page == transition.target_page) |
- x_offset += transition_offset; |
- } |
- |
- const int row = slot / cols_; |
- const int col = slot % cols_; |
- gfx::Rect tile_slot( |
- gfx::Point(grid_rect.x() + col * tile_size.width() + x_offset, |
- grid_rect.y() + row * tile_size.height()), |
- tile_size); |
- if (i < view_model_.view_size()) { |
- view_model_.set_ideal_bounds(i, tile_slot); |
- } else { |
- pulsing_blocks_model_.set_ideal_bounds(i - view_model_.view_size(), |
- tile_slot); |
- } |
- |
- ++slot_index; |
- } |
-} |
- |
-void AppsGridView::AnimateToIdealBounds() { |
- const gfx::Rect visible_bounds(GetVisibleBounds()); |
- |
- CalculateIdealBounds(); |
- for (int i = 0; i < view_model_.view_size(); ++i) { |
- views::View* view = view_model_.view_at(i); |
- if (view == drag_view_) |
- continue; |
- |
- const gfx::Rect& target = view_model_.ideal_bounds(i); |
- if (bounds_animator_.GetTargetBounds(view) == target) |
- continue; |
- |
- const gfx::Rect& current = view->bounds(); |
- const bool current_visible = visible_bounds.Intersects(current); |
- const bool target_visible = visible_bounds.Intersects(target); |
- const bool visible = current_visible || target_visible; |
- |
- const int y_diff = target.y() - current.y(); |
- if (visible && y_diff && y_diff % kPreferredTileHeight == 0) { |
- AnimationBetweenRows(view, |
- current_visible, |
- current, |
- target_visible, |
- target); |
- } else { |
- bounds_animator_.AnimateViewTo(view, target); |
- } |
- } |
-} |
- |
-void AppsGridView::AnimationBetweenRows(views::View* view, |
- bool animate_current, |
- const gfx::Rect& current, |
- bool animate_target, |
- const gfx::Rect& target) { |
- // Determine page of |current| and |target|. -1 means in the left invisible |
- // page, 0 is the center visible page and 1 means in the right invisible page. |
- const int current_page = current.x() < 0 ? -1 : |
- current.x() >= width() ? 1 : 0; |
- const int target_page = target.x() < 0 ? -1 : |
- target.x() >= width() ? 1 : 0; |
- |
- const int dir = current_page < target_page || |
- (current_page == target_page && current.y() < target.y()) ? 1 : -1; |
- |
-#if defined(USE_AURA) |
- scoped_ptr<ui::Layer> layer; |
- if (animate_current) { |
- layer.reset(view->RecreateLayer()); |
- layer->SuppressPaint(); |
- |
- view->SetFillsBoundsOpaquely(false); |
- view->layer()->SetOpacity(0.f); |
- } |
- |
- gfx::Rect current_out(current); |
- current_out.Offset(dir * kPreferredTileWidth, 0); |
-#endif |
- |
- gfx::Rect target_in(target); |
- if (animate_target) |
- target_in.Offset(-dir * kPreferredTileWidth, 0); |
- view->SetBoundsRect(target_in); |
- bounds_animator_.AnimateViewTo(view, target); |
- |
-#if defined(USE_AURA) |
- bounds_animator_.SetAnimationDelegate( |
- view, |
- new RowMoveAnimationDelegate(view, layer.release(), current_out), |
- true); |
-#endif |
-} |
- |
-void AppsGridView::ExtractDragLocation(const ui::LocatedEvent& event, |
- gfx::Point* drag_point) { |
-#if defined(USE_AURA) |
- // Use root location of |event| instead of location in |drag_view_|'s |
- // coordinates because |drag_view_| has a scale transform and location |
- // could have integer round error and causes jitter. |
- *drag_point = event.root_location(); |
- |
- // GetWidget() could be NULL for tests. |
- if (GetWidget()) { |
- aura::Window::ConvertPointToTarget( |
- GetWidget()->GetNativeWindow()->GetRootWindow(), |
- GetWidget()->GetNativeWindow(), |
- drag_point); |
- } |
- |
- views::View::ConvertPointFromWidget(this, drag_point); |
-#else |
- // For non-aura, root location is not clearly defined but |drag_view_| does |
- // not have the scale transform. So no round error would be introduced and |
- // it's okay to use View::ConvertPointToTarget. |
- *drag_point = event.location(); |
- views::View::ConvertPointToTarget(drag_view_, this, drag_point); |
-#endif |
-} |
- |
-void AppsGridView::CalculateDropTarget(const gfx::Point& drag_point, |
- bool use_page_button_hovering) { |
- const int current_page = pagination_model_->selected_page(); |
- |
- if (use_page_button_hovering && |
- page_switcher_view_->bounds().Contains(drag_point)) { |
- gfx::Point page_switcher_point(drag_point); |
- views::View::ConvertPointToTarget(this, page_switcher_view_, |
- &page_switcher_point); |
- int page = page_switcher_view_->GetPageForPoint(page_switcher_point); |
- if (pagination_model_->is_valid_page(page)) { |
- drop_target_.page = page; |
- drop_target_.slot = tiles_per_page() - 1; |
- } |
- } else { |
- const int drop_row = drag_point.y() / kPreferredTileHeight; |
- const int drop_col = std::min(cols_ - 1, |
- drag_point.x() / kPreferredTileWidth); |
- |
- drop_target_.page = current_page; |
- drop_target_.slot = std::max(0, std::min( |
- tiles_per_page() - 1, |
- drop_row * cols_ + drop_col)); |
- } |
- |
- // Limits to the last possible slot on last page. |
- if (drop_target_.page == pagination_model_->total_pages() - 1) { |
- drop_target_.slot = std::min( |
- (view_model_.view_size() - 1) % tiles_per_page(), |
- drop_target_.slot); |
- } |
-} |
- |
-void AppsGridView::MaybeStartPageFlipTimer(const gfx::Point& drag_point) { |
- int new_page_flip_target = -1; |
- |
- if (page_switcher_view_->bounds().Contains(drag_point)) { |
- gfx::Point page_switcher_point(drag_point); |
- views::View::ConvertPointToTarget(this, page_switcher_view_, |
- &page_switcher_point); |
- new_page_flip_target = |
- page_switcher_view_->GetPageForPoint(page_switcher_point); |
- } |
- |
- // TODO(xiyuan): Fix this for RTL. |
- if (new_page_flip_target == -1 && drag_point.x() < kPageFlipZoneSize) |
- new_page_flip_target = pagination_model_->selected_page() - 1; |
- |
- if (new_page_flip_target == -1 && |
- drag_point.x() > width() - kPageFlipZoneSize) { |
- new_page_flip_target = pagination_model_->selected_page() + 1; |
- } |
- |
- if (new_page_flip_target == page_flip_target_) |
- return; |
- |
- if (pagination_model_->is_valid_page(new_page_flip_target)) { |
- page_flip_target_ = new_page_flip_target; |
- page_flip_timer_.Stop(); |
- |
- if (page_flip_target_ != pagination_model_->selected_page()) { |
- page_flip_timer_.Start(FROM_HERE, |
- base::TimeDelta::FromMilliseconds(page_flip_delay_in_ms_), |
- this, &AppsGridView::OnPageFlipTimer); |
- } |
- } else { |
- page_flip_target_ = -1; |
- page_flip_timer_.Stop(); |
- } |
-} |
- |
-void AppsGridView::OnPageFlipTimer() { |
- DCHECK(pagination_model_->is_valid_page(page_flip_target_)); |
- pagination_model_->SelectPage(page_flip_target_, true); |
-} |
- |
-void AppsGridView::MoveItemInModel(views::View* item_view, |
- const Index& target) { |
- int current_model_index = view_model_.GetIndexOfView(item_view); |
- DCHECK_GE(current_model_index, 0); |
- |
- int target_model_index = target.page * tiles_per_page() + target.slot; |
- if (target_model_index == current_model_index) |
- return; |
- |
- model_->apps()->RemoveObserver(this); |
- model_->apps()->Move(current_model_index, target_model_index); |
- view_model_.Move(current_model_index, target_model_index); |
- model_->apps()->AddObserver(this); |
- |
- if (pagination_model_->selected_page() != target.page) |
- pagination_model_->SelectPage(target.page, false); |
-} |
- |
-void AppsGridView::ButtonPressed(views::Button* sender, |
- const ui::Event& event) { |
- if (dragging()) |
- return; |
- |
- if (sender->GetClassName() != AppListItemView::kViewClassName) |
- return; |
- |
- if (delegate_) { |
- delegate_->ActivateApp(static_cast<AppListItemView*>(sender)->model(), |
- event.flags()); |
- } |
-} |
- |
-void AppsGridView::ListItemsAdded(size_t start, size_t count) { |
- EndDrag(true); |
- |
- for (size_t i = start; i < start + count; ++i) { |
- views::View* view = CreateViewForItemAtIndex(i); |
- view_model_.Add(view, i); |
- AddChildView(view); |
- } |
- |
- UpdatePaging(); |
- UpdatePulsingBlockViews(); |
- Layout(); |
- SchedulePaint(); |
-} |
- |
-void AppsGridView::ListItemsRemoved(size_t start, size_t count) { |
- EndDrag(true); |
- |
- for (size_t i = 0; i < count; ++i) { |
- views::View* view = view_model_.view_at(start); |
- view_model_.Remove(start); |
- delete view; |
- } |
- |
- UpdatePaging(); |
- UpdatePulsingBlockViews(); |
- Layout(); |
- SchedulePaint(); |
-} |
- |
-void AppsGridView::ListItemMoved(size_t index, size_t target_index) { |
- EndDrag(true); |
- view_model_.Move(index, target_index); |
- |
- UpdatePaging(); |
- AnimateToIdealBounds(); |
-} |
- |
-void AppsGridView::ListItemsChanged(size_t start, size_t count) { |
- NOTREACHED(); |
-} |
- |
-void AppsGridView::TotalPagesChanged() { |
-} |
- |
-void AppsGridView::SelectedPageChanged(int old_selected, int new_selected) { |
- if (dragging()) { |
- CalculateDropTarget(last_drag_point_, true); |
- Layout(); |
- MaybeStartPageFlipTimer(last_drag_point_); |
- } else { |
- Layout(); |
- } |
-} |
- |
-void AppsGridView::TransitionChanged() { |
- // Update layout for valid page transition only since over-scroll no longer |
- // animates app icons. |
- const PaginationModel::Transition& transition = |
- pagination_model_->transition(); |
- if (pagination_model_->is_valid_page(transition.target_page)) |
- Layout(); |
-} |
- |
-void AppsGridView::OnAppListModelStatusChanged() { |
- UpdatePulsingBlockViews(); |
- Layout(); |
- SchedulePaint(); |
-} |
- |
-} // namespace app_list |