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

Unified Diff: chrome/browser/profiles/avatar_menu_model.cc

Issue 7544031: Create AvatarMenuModel for the new avatar menu interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Ready for review Created 9 years, 5 months 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
« no previous file with comments | « chrome/browser/profiles/avatar_menu_model.h ('k') | chrome/browser/profiles/avatar_menu_model_observer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/avatar_menu_model.cc
diff --git a/chrome/browser/profiles/avatar_menu_model.cc b/chrome/browser/profiles/avatar_menu_model.cc
new file mode 100644
index 0000000000000000000000000000000000000000..512c1ceca05c0eacfbe176fcf1b8a4a6e916255c
--- /dev/null
+++ b/chrome/browser/profiles/avatar_menu_model.cc
@@ -0,0 +1,128 @@
+// 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/profiles/avatar_menu_model.h"
+
+#include "base/stl_util.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/avatar_menu_model_observer.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_info_cache.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/url_constants.h"
+#include "content/common/notification_service.h"
+#include "ui/gfx/image/image.h"
+
+namespace {
+
+class ProfileSwitchObserver : public ProfileManagerObserver {
+ public:
+ virtual void OnProfileCreated(Profile* profile, Status status) OVERRIDE {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ if (status == STATUS_INITIALIZED) {
+ DCHECK(profile);
+ Browser* browser = BrowserList::FindTabbedBrowser(profile, false);
+ if (browser)
+ browser->window()->Activate();
+ else
+ Browser::NewWindowWithProfile(profile);
+ }
+ }
+
+ virtual bool DeleteAfter() OVERRIDE { return true; }
+};
+
+} // namespace
+
+AvatarMenuModel::AvatarMenuModel(ProfileInfoInterface* profile_cache,
+ AvatarMenuModelObserver* observer,
+ Browser* browser)
+ : profile_info_(profile_cache),
+ observer_(observer),
+ browser_(browser) {
+ DCHECK(profile_info_);
+ DCHECK(observer_);
+ // Don't DCHECK(browser_) so that unit tests can reuse this ctor.
+
+ // Register this as an observer of the info cache.
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
+ NotificationService::AllSources());
+
+ // Build the initial menu.
+ RebuildMenu();
+}
+
+AvatarMenuModel::~AvatarMenuModel() {
+ ClearMenu();
+}
+
+AvatarMenuModel::Item::Item(size_t model_index, const gfx::Image& icon)
+ : icon(icon),
+ model_index(model_index) {
+}
+
+AvatarMenuModel::Item::~Item() {
+}
+
+void AvatarMenuModel::SwichToProfile(size_t index) {
+ const Item& item = GetItemAt(index);
+ FilePath path = profile_info_->GetPathOfProfileAtIndex(item.model_index);
+
+ // This will be deleted by the manager after the profile is ready.
+ ProfileSwitchObserver* observer = new ProfileSwitchObserver();
+ g_browser_process->profile_manager()->CreateProfileAsync(
+ path, observer);
+}
+
+void AvatarMenuModel::EditProfile(size_t index) {
+ DCHECK(browser_);
+ browser_->ShowOptionsTab(chrome::kPersonalOptionsSubPage);
+}
+
+void AvatarMenuModel::AddNewProfile() {
+ ProfileManager::CreateMultiProfileAsync();
+}
+
+size_t AvatarMenuModel::GetNumberOfItems() {
+ return items_.size();
+}
+
+const AvatarMenuModel::Item& AvatarMenuModel::GetItemAt(size_t index) {
+ DCHECK_LT(index, items_.size());
+ return *items_[index];
+}
+
+void AvatarMenuModel::Observe(int type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, type);
+ RebuildMenu();
+}
+
+void AvatarMenuModel::RebuildMenu() {
+ ClearMenu();
+
+ const size_t count = profile_info_->GetNumberOfProfiles();
+ for (size_t i = 0; i < count; ++i) {
+ Item* item = new Item(i, profile_info_->GetAvatarIconOfProfileAtIndex(i));
+ item->name = profile_info_->GetNameOfProfileAtIndex(i);
+ if (browser_) {
+ FilePath path = profile_info_->GetPathOfProfileAtIndex(i);
+ item->active = browser_->profile()->GetPath() == path;
+ }
+ items_.push_back(item);
+ }
+
+ observer_->OnAvatarMenuModelChanged();
+}
+
+void AvatarMenuModel::ClearMenu() {
+ STLDeleteContainerPointers(items_.begin(), items_.end());
+ items_.clear();
+}
« no previous file with comments | « chrome/browser/profiles/avatar_menu_model.h ('k') | chrome/browser/profiles/avatar_menu_model_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698