Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(733)

Unified Diff: chrome/browser/ui/views/aura/app_list/app_list_model.cc

Issue 8890049: [Aura] Implement views-based applist. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased and refactored Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/aura/app_list/app_list_model.cc
diff --git a/chrome/browser/ui/views/aura/app_list/app_list_model.cc b/chrome/browser/ui/views/aura/app_list/app_list_model.cc
new file mode 100644
index 0000000000000000000000000000000000000000..08b7f908c18e6cfd6ed5e400360479f32927f7af
--- /dev/null
+++ b/chrome/browser/ui/views/aura/app_list/app_list_model.cc
@@ -0,0 +1,133 @@
+// Copyright (c) 2011 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 "chrome/browser/ui/views/aura/app_list/app_list_model.h"
+
+#include "chrome/browser/extensions/extension_prefs.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/views/aura/app_list/extension_item_model.h"
+#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/pref_names.h"
+#include "grit/generated_resources.h"
+#include "ui/aura_shell/app_list/app_list_item_group_model.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+// Gets page ordinal of given |extension| in its app launch page.
+int GetExtensionPageOrdinal(const Extension* extension,
+ ExtensionPrefs* prefs) {
+ int page_ordinal = prefs->GetPageIndex(extension->id());
+ if (page_ordinal < 0) {
+ page_ordinal = extension->id() == extension_misc::kWebStoreAppId ?
+ 0 : prefs->GetNaturalAppPageIndex();
+ }
+
+ return page_ordinal;
+}
+
+// Gets app launch ordinal of given extension.
+int GetExtensionLaunchOrdinal(const Extension* extension,
+ ExtensionPrefs* prefs) {
+ int page_ordinal = GetExtensionPageOrdinal(extension, prefs);
+ int app_launch_ordinal = prefs->GetAppLaunchIndex(extension->id());
+ if (app_launch_ordinal == -1) {
+ // The webstore's app launch index is set to -2 to make sure it's first.
+ app_launch_ordinal = extension->id() == extension_misc::kWebStoreAppId ?
+ -2 : prefs->GetNextAppLaunchIndex(page_ordinal);
+ }
+ return app_launch_ordinal;
+}
+
+// Gets or creates group for given |extension| in |model|. The created gruop
sky 2011/12/14 16:51:33 gruop -> group
xiyuan 2011/12/20 00:14:42 Done.
+// is added to |model| and owned by it.
+aura_shell::AppListItemGroupModel* GetOrCreateGroup(
+ const Extension* extension,
+ ExtensionPrefs* prefs,
+ const ListValue* app_page_names,
+ AppListModel* model) {
+ int page_index = GetExtensionPageOrdinal(extension, prefs);
+ if (page_index >= model->item_count()) {
+ for (int i = model->item_count(); i <= page_index; ++i) {
+ std::string title;
+ if (!app_page_names->GetString(i, &title))
+ title = l10n_util::GetStringUTF8(IDS_APP_DEFAULT_PAGE_NAME);
+
+ aura_shell::AppListItemGroupModel* group =
+ new aura_shell::AppListItemGroupModel(title);
+ model->Add(group);
+ }
+ }
+
+ return model->item_at(page_index);
+}
+
+// Binary predict to sort extension apps. Smaller launch oridnal takes
+// precedence.
+struct ExtensionAppPrecedes {
+ explicit ExtensionAppPrecedes(ExtensionPrefs* prefs)
+ : prefs(prefs) {
+ }
+
+ bool operator()(const ExtensionItemModel* a,
+ const ExtensionItemModel* b) const {
+ return GetExtensionLaunchOrdinal(a->extension(), prefs) <
sky 2011/12/14 16:51:33 Is this an expensive operation? Would it be better
xiyuan 2011/12/20 00:14:42 Done. Launch ordinal is not stored in ExtensionIte
+ GetExtensionLaunchOrdinal(b->extension(), prefs);
+ }
+
+ ExtensionPrefs* prefs;
+};
+
+} // namespace
+
+AppListModel::AppListModel() {
+ UpdateExtensionApps();
+}
+
+AppListModel::~AppListModel() {
+}
+
+void AppListModel::UpdateExtensionApps() {
sky 2011/12/14 16:51:33 This is pretty heavy for a constructor. How about
xiyuan 2011/12/20 00:14:42 Done.
+ Profile* profile = ProfileManager::GetDefaultProfile();
sky 2011/12/14 16:51:33 Seems like this should be passed in the constructo
xiyuan 2011/12/20 00:14:42 Done.
+ if (!profile)
+ return;
+
+ ExtensionService* service = profile->GetExtensionService();
+ if (!service)
+ return;
+
+ // Get extension apps.
+ std::vector<ExtensionItemModel*> items;
+ const ExtensionSet* extensions = service->extensions();
+ for (ExtensionSet::const_iterator app = extensions->begin();
+ app != extensions->end(); ++app) {
+ if (AppLauncherHandler::IsAppExcludedFromList(*app))
+ continue;
+
+ items.push_back(new ExtensionItemModel(service, *app));
+ }
+
+ // Sort by launch ordinal.
+ std::sort(items.begin(), items.end(),
+ ExtensionAppPrecedes(service->extension_prefs()));
+
+ // Put all items into model and group them by page ordinal.
+ PrefService* prefs = profile->GetPrefs();
+ const ListValue* app_page_names = prefs->GetList(prefs::kNTPAppPageNames);
+ for (size_t i = 0; i < items.size(); ++i) {
+ ExtensionItemModel* item = items[i];
+
+ aura_shell::AppListItemGroupModel* group = GetOrCreateGroup(
+ item->extension(),
+ service->extension_prefs(),
+ app_page_names,
+ this);
+
+ group->Add(item);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698