Index: chrome/browser/ui/app_list/fast_show_pickler.cc |
diff --git a/chrome/browser/ui/app_list/fast_show_pickler.cc b/chrome/browser/ui/app_list/fast_show_pickler.cc |
index 80b2c0f58674719e07792bf8fcd3bba5c78f81c1..d5b31f10d7811a0df7e7060163737c59418cf8bc 100644 |
--- a/chrome/browser/ui/app_list/fast_show_pickler.cc |
+++ b/chrome/browser/ui/app_list/fast_show_pickler.cc |
@@ -189,7 +189,8 @@ bool PickleAppListItemModel(Pickle* pickle, AppListItemModel* item) { |
return true; |
} |
-void CopyOverItem(AppListItemModel* src_item, AppListItemModel* dest_item) { |
+void CopyAppListItemModel(const AppListItemModel* src_item, |
+ AppListItemModel* dest_item) { |
dest_item->SetTitleAndFullName(src_item->title(), src_item->full_name()); |
dest_item->SetIcon(src_item->icon(), src_item->has_shadow()); |
} |
@@ -198,8 +199,9 @@ void CopyOverItem(AppListItemModel* src_item, AppListItemModel* dest_item) { |
// The version of the pickle format defined here. This needs to be incremented |
// whenever this format is changed so new clients can invalidate old versions. |
-const int FastShowPickler::kVersion = 1; |
+const int FastShowPickler::kVersion = 2; |
+// static |
scoped_ptr<Pickle> FastShowPickler::PickleAppListModelForFastShow( |
AppListModel* model) { |
scoped_ptr<Pickle> result(new Pickle); |
@@ -207,26 +209,41 @@ scoped_ptr<Pickle> FastShowPickler::PickleAppListModelForFastShow( |
return scoped_ptr<Pickle>(); |
if (!result->WriteBool(model->signed_in())) |
return scoped_ptr<Pickle>(); |
- if (!result->WriteInt((int) model->apps()->item_count())) |
+ // Write the number of pages. |
+ size_t page_count = model->GetNumAppPages(); |
+ if (!result->WriteInt(static_cast<int>(page_count))) |
return scoped_ptr<Pickle>(); |
- for (size_t i = 0; i < model->apps()->item_count(); ++i) { |
- if (!PickleAppListItemModel(result.get(), model->apps()->GetItemAt(i))) |
+ for (size_t p = 0; p < page_count; ++p) { |
+ // Write the number of items in the page. |
+ size_t item_count = model->GetAppItemsForPage(p).item_count(); |
+ if (!result->WriteInt(static_cast<int>(item_count))) |
return scoped_ptr<Pickle>(); |
+ // Write the items in the page. |
+ for (size_t i = 0; i < item_count; ++i) { |
+ if (!PickleAppListItemModel(result.get(), model->GetItemAt(p, i))) |
+ return scoped_ptr<Pickle>(); |
+ } |
} |
return result.Pass(); |
} |
-void FastShowPickler::CopyOver(AppListModel* src, AppListModel* dest) { |
- dest->apps()->DeleteAll(); |
+// static |
+void FastShowPickler::CopyAppListModel(const AppListModel* src, |
+ AppListModel* dest) { |
+ CHECK_EQ(0u, dest->GetNumAppPages()); |
dest->SetSignedIn(src->signed_in()); |
- for (size_t i = 0; i < src->apps()->item_count(); i++) { |
- AppListItemModel* src_item = src->apps()->GetItemAt(i); |
- AppListItemModel* dest_item = new AppListItemModel(src_item->id()); |
- CopyOverItem(src_item, dest_item); |
- dest->apps()->Add(dest_item); |
+ for (size_t p = 0; p < src->GetNumAppPages(); ++p) { |
+ const AppListModel::AppItems& apps = src->GetAppItemsForPage(p); |
+ for (size_t i = 0; i < apps.item_count(); ++i) { |
+ const AppListItemModel* src_item = apps.GetItemAt(i); |
+ AppListItemModel* dest_item = new AppListItemModel(src_item->id()); |
+ CopyAppListItemModel(src_item, dest_item); |
+ dest->AddItem(dest_item); |
+ } |
} |
} |
+// static |
scoped_ptr<AppListModel> |
FastShowPickler::UnpickleAppListModelForFastShow(Pickle* pickle) { |
PickleIterator it(*pickle); |
@@ -235,20 +252,27 @@ FastShowPickler::UnpickleAppListModelForFastShow(Pickle* pickle) { |
return scoped_ptr<AppListModel>(); |
if (read_version != kVersion) |
return scoped_ptr<AppListModel>(); |
- int app_count = 0; |
bool signed_in = false; |
if (!it.ReadBool(&signed_in)) |
return scoped_ptr<AppListModel>(); |
- if (!it.ReadInt(&app_count)) |
+ // Read the number of pages. |
+ int page_count = 0; |
+ if (!it.ReadInt(&page_count)) |
return scoped_ptr<AppListModel>(); |
- |
scoped_ptr<AppListModel> model(new AppListModel); |
model->SetSignedIn(signed_in); |
- for (int i = 0; i < app_count; ++i) { |
- scoped_ptr<AppListItemModel> item(UnpickleAppListItemModel(&it).Pass()); |
- if (!item) |
+ for (size_t p = 0; p < static_cast<size_t>(page_count); ++p) { |
+ // Read the number of items in the page. |
+ int item_count = 0; |
+ if (!it.ReadInt(&item_count)) |
return scoped_ptr<AppListModel>(); |
- model->apps()->Add(item.release()); |
+ // Read each item in the page. |
+ for (int i = 0; i < item_count; ++i) { |
+ scoped_ptr<AppListItemModel> item(UnpickleAppListItemModel(&it).Pass()); |
+ if (!item) |
+ return scoped_ptr<AppListModel>(); |
+ model->AddItemToPage(item.release(), p); |
+ } |
} |
return model.Pass(); |