diff --git a/src/online/messages.cpp b/src/online/messages.cpp index d484cd0e2..d70dffb65 100644 --- a/src/online/messages.cpp +++ b/src/online/messages.cpp @@ -70,6 +70,13 @@ namespace Online return irr::core::stringw(_("Fetching servers")) + loadingDots(); } + // ------------------------------------------------------------------------ + + irr::core::stringw fetchingFriends() + { + return irr::core::stringw(_("Fetching friends")) + loadingDots(); + } + // ------------------------------------------------------------------------ irr::core::stringw loadingDots(bool spaces, float interval, int max_dots) { diff --git a/src/online/messages.hpp b/src/online/messages.hpp index 7c6cbb673..1020b836d 100644 --- a/src/online/messages.hpp +++ b/src/online/messages.hpp @@ -34,6 +34,7 @@ namespace Online irr::core::stringw joiningServer (); irr::core::stringw creatingServer (); irr::core::stringw fetchingServers (); + irr::core::stringw fetchingFriends (); irr::core::stringw signedInAs (const irr::core::stringw & name); } // namespace Messages }// namespace Online diff --git a/src/online/profile.cpp b/src/online/profile.cpp index 761943d2a..76504b6b9 100644 --- a/src/online/profile.cpp +++ b/src/online/profile.cpp @@ -90,6 +90,8 @@ namespace Online{ const PtrVector & Profile::getFriends() { assert (m_has_fetched_friends && getState() == S_READY); + delete m_friends_list_request; + m_friends_list_request = NULL; return m_friends; } // ============================================================================ diff --git a/src/online/profile_manager.hpp b/src/online/profile_manager.hpp index 985be11b3..52f1ea5e7 100644 --- a/src/online/profile_manager.hpp +++ b/src/online/profile_manager.hpp @@ -52,7 +52,7 @@ namespace Online{ ProfilesMap m_profiles_cache; Profile * m_currently_visiting; - const int m_max_cache_size = 5; + static const unsigned int m_max_cache_size = 5; void iterateCache(); void addToCache(Profile * profile); diff --git a/src/states_screens/online_profile_friends.cpp b/src/states_screens/online_profile_friends.cpp index 1816c0db2..885a3074e 100644 --- a/src/states_screens/online_profile_friends.cpp +++ b/src/states_screens/online_profile_friends.cpp @@ -23,6 +23,7 @@ #include "guiengine/widget.hpp" #include "states_screens/state_manager.hpp" #include "utils/translation.hpp" +#include "online/messages.hpp" #include @@ -47,14 +48,30 @@ OnlineProfileFriends::OnlineProfileFriends() : OnlineProfileBase("online/profile void OnlineProfileFriends::loadedFromFile() { OnlineProfileBase::loadedFromFile(); + m_friends_list_widget = getWidget("friends_list"); + assert(m_friends_list_widget != NULL); + } // loadedFromFile +// ---------------------------------------------------------------------------- + +void OnlineProfileFriends::beforeAddingWidget() +{ + m_friends_list_widget->clearColumns(); + m_friends_list_widget->addColumn( _("Username"), 3 ); +} + // ----------------------------------------------------------------------------- void OnlineProfileFriends::init() { OnlineProfileBase::init(); m_profile_tabs->select( m_friends_tab->m_properties[PROP_ID], PLAYER_ID_GAME_MASTER ); + m_visiting_profile = ProfileManager::get()->getVisitingProfile(); + m_visiting_profile->fetchFriends(); + m_friends_list_widget->clear(); + m_friends_list_widget->addItem("spacer", L""); + m_friends_list_widget->addItem("loading", Messages::fetchingFriends()); } // init // ----------------------------------------------------------------------------- @@ -63,3 +80,20 @@ void OnlineProfileFriends::eventCallback(Widget* widget, const std::string& name OnlineProfileBase::eventCallback( widget, name, playerID); } // eventCallback +// ---------------------------------------------------------------------------- +void OnlineProfileFriends::onUpdate(float delta, irr::video::IVideoDriver* driver) +{ + if(m_visiting_profile->isReady()) + { + for(int i = 0; i < m_visiting_profile->getFriends().size(); i++) + { + PtrVector * row = new PtrVector; + row->push_back(new GUIEngine::ListWidget::ListCell(m_visiting_profile->getFriends()[i].getUserName(),-1,3)); + m_friends_list_widget->addItem("server", row); + } + } + else + { + m_friends_list_widget->renameItem("loading", Messages::fetchingFriends()); + } +} diff --git a/src/states_screens/online_profile_friends.hpp b/src/states_screens/online_profile_friends.hpp index fd65d91d9..f6267d3cc 100644 --- a/src/states_screens/online_profile_friends.hpp +++ b/src/states_screens/online_profile_friends.hpp @@ -25,6 +25,8 @@ #include "guiengine/screen.hpp" #include "guiengine/widgets.hpp" #include "states_screens/online_profile_base.hpp" +#include "online/profile_manager.hpp" + namespace GUIEngine { class Widget; } @@ -38,6 +40,9 @@ class OnlineProfileFriends : public OnlineProfileBase, public GUIEngine::ScreenS private: OnlineProfileFriends(); + GUIEngine::ListWidget * m_friends_list_widget; + Online::Profile * m_visiting_profile; + public: friend class GUIEngine::ScreenSingleton; @@ -49,6 +54,10 @@ public: /** \brief implement callback from parent class GUIEngine::Screen */ virtual void init() OVERRIDE; + + virtual void onUpdate(float delta, irr::video::IVideoDriver* driver) OVERRIDE; + + virtual void beforeAddingWidget() OVERRIDE; }; #endif