| 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
|
| index 08ab470a1e3e258be890a1cf167cb8908b0091bb..666fef141116a178c6036de988276a136c31b269 100644
|
| --- a/ui/app_list/apps_grid_view.cc
|
| +++ b/ui/app_list/apps_grid_view.cc
|
| @@ -11,6 +11,7 @@
|
| #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"
|
| @@ -109,8 +110,10 @@ AppsGridView::AppsGridView(AppsGridViewDelegate* delegate,
|
| }
|
|
|
| AppsGridView::~AppsGridView() {
|
| - if (model_)
|
| + if (model_) {
|
| model_->RemoveObserver(this);
|
| + model_->apps()->RemoveObserver(this);
|
| + }
|
| pagination_model_->RemoveObserver(this);
|
| }
|
|
|
| @@ -125,13 +128,17 @@ void AppsGridView::SetLayout(int icon_size, int cols, int rows_per_page) {
|
| kLeftRightPadding));
|
| }
|
|
|
| -void AppsGridView::SetModel(AppListModel::Apps* model) {
|
| - if (model_)
|
| +void AppsGridView::SetModel(AppListModel* model) {
|
| + if (model_) {
|
| model_->RemoveObserver(this);
|
| + model_->apps()->RemoveObserver(this);
|
| + }
|
|
|
| model_ = model;
|
| - if (model_)
|
| + if (model_) {
|
| model_->AddObserver(this);
|
| + model_->apps()->AddObserver(this);
|
| + }
|
| Update();
|
| }
|
|
|
| @@ -165,7 +172,7 @@ void AppsGridView::EnsureViewVisible(const views::View* view) {
|
| void AppsGridView::InitiateDrag(views::View* view,
|
| Pointer pointer,
|
| const ui::LocatedEvent& event) {
|
| - if (drag_view_)
|
| + if (drag_view_ || pulsing_blocks_model_.view_size())
|
| return;
|
|
|
| drag_view_ = view;
|
| @@ -243,6 +250,7 @@ void AppsGridView::Layout() {
|
| 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();
|
| @@ -312,8 +320,8 @@ void AppsGridView::ViewHierarchyChanged(bool is_add,
|
| void AppsGridView::Update() {
|
| selected_view_ = NULL;
|
| view_model_.Clear();
|
| - if (model_ && model_->item_count())
|
| - ListItemsAdded(0, model_->item_count());
|
| + if (model_ && model_->apps()->item_count())
|
| + ListItemsAdded(0, model_->apps()->item_count());
|
| }
|
|
|
| void AppsGridView::UpdatePaging() {
|
| @@ -326,10 +334,33 @@ void AppsGridView::UpdatePaging() {
|
| (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_->item_count());
|
| + DCHECK_LT(index, model_->apps()->item_count());
|
| AppListItemView* view = new AppListItemView(this,
|
| - model_->GetItemAt(index));
|
| + model_->apps()->GetItemAt(index));
|
| view->SetIconSize(icon_size_);
|
| #if !defined(OS_WIN)
|
| view->SetPaintToLayer(true);
|
| @@ -424,9 +455,11 @@ void AppsGridView::CalculateIdealBounds() {
|
| 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 < view_model_.view_size(); ++i) {
|
| - if (view_model_.view_at(i) == drag_view_)
|
| + 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();
|
| @@ -456,7 +489,12 @@ void AppsGridView::CalculateIdealBounds() {
|
| gfx::Point(grid_rect.x() + col * tile_size.width() + x_offset,
|
| grid_rect.y() + row * tile_size.height()),
|
| tile_size);
|
| - view_model_.set_ideal_bounds(i, tile_slot);
|
| + 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;
|
| }
|
| @@ -619,10 +657,10 @@ void AppsGridView::MoveItemInModel(views::View* item_view,
|
| if (target_model_index == current_model_index)
|
| return;
|
|
|
| - model_->RemoveObserver(this);
|
| - model_->Move(current_model_index, target_model_index);
|
| + model_->apps()->RemoveObserver(this);
|
| + model_->apps()->Move(current_model_index, target_model_index);
|
| view_model_.Move(current_model_index, target_model_index);
|
| - model_->AddObserver(this);
|
| + model_->apps()->AddObserver(this);
|
|
|
| if (pagination_model_->selected_page() != target.page)
|
| pagination_model_->SelectPage(target.page, false);
|
| @@ -652,6 +690,7 @@ void AppsGridView::ListItemsAdded(size_t start, size_t count) {
|
| }
|
|
|
| UpdatePaging();
|
| + UpdatePulsingBlockViews();
|
| Layout();
|
| SchedulePaint();
|
| }
|
| @@ -666,6 +705,7 @@ void AppsGridView::ListItemsRemoved(size_t start, size_t count) {
|
| }
|
|
|
| UpdatePaging();
|
| + UpdatePulsingBlockViews();
|
| Layout();
|
| SchedulePaint();
|
| }
|
| @@ -704,4 +744,10 @@ void AppsGridView::TransitionChanged() {
|
| Layout();
|
| }
|
|
|
| +void AppsGridView::OnAppListModelStatusChanged() {
|
| + UpdatePulsingBlockViews();
|
| + Layout();
|
| + SchedulePaint();
|
| +}
|
| +
|
| } // namespace app_list
|
|
|