Related to previous commit. Changes to the modal dialog core. (Not 100% sure if every dialog still works.) Some core changes to profile, profile manager, and the related callbacks for friending.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13520 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
unitraxx 2013-08-20 17:36:20 +00:00
parent 445706793e
commit 8e6495139e
12 changed files with 110 additions and 38 deletions

View File

@ -30,7 +30,7 @@
<icon-button id="enter" width="64" height="64" icon="gui/difficulty_medium.png" <icon-button id="enter" width="64" height="64" icon="gui/difficulty_medium.png"
I18N="User info dialog" text="View" label_location="bottom"/> I18N="User info dialog" text="View" label_location="bottom"/>
<icon-button id="cancel" width="64" height="64" icon="gui/main_quit.png" <icon-button id="cancel" width="64" height="64" icon="gui/main_quit.png"
I18N="User info dialog" text="Cancel" label_location="bottom"/> I18N="User info dialog" text="Close" label_location="bottom"/>
</buttonbar> </buttonbar>

View File

@ -63,7 +63,7 @@ namespace GUIEngine
if(entry->closes() || !ModalDialog::isADialogActive()) if(entry->closes() || !ModalDialog::isADialogActive())
{ {
ModalDialog::dismiss(); ModalDialog::dismiss();
entry->get()->doInit(); entry->get()->load();
m_queue.pop(); m_queue.pop();
delete entry; delete entry;
} }

View File

@ -47,20 +47,19 @@ using namespace GUIEngine;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
ModalDialog::ModalDialog(const float percentWidth, const float percentHeight, bool do_init, ModalDialogLocation location) ModalDialog::ModalDialog(const float percentWidth, const float percentHeight, ModalDialogLocation location)
{ {
m_dialog_location = location; m_dialog_location = location;
m_init = false; m_init = false;
m_percent_width = percentWidth; m_percent_width = percentWidth;
m_percent_height = percentHeight; m_percent_height = percentHeight;
if(do_init)
doInit();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void ModalDialog::loadFromFile(const char* xmlFile) void ModalDialog::loadFromFile(const char* xmlFile)
{ {
doInit();
IXMLReader* xml = file_manager->createXMLReader( (file_manager->getGUIDir() + xmlFile).c_str() ); IXMLReader* xml = file_manager->createXMLReader( (file_manager->getGUIDir() + xmlFile).c_str() );
if (xml == NULL) if (xml == NULL)
{ {

View File

@ -71,7 +71,7 @@ namespace GUIEngine
/** /**
* \brief Creates a modal dialog with given percentage of screen width and height * \brief Creates a modal dialog with given percentage of screen width and height
*/ */
ModalDialog(const float percentWidth, const float percentHeight, bool do_init = true, ModalDialog(const float percentWidth, const float percentHeight,
ModalDialogLocation location = MODAL_DIALOG_LOCATION_CENTER); ModalDialogLocation location = MODAL_DIALOG_LOCATION_CENTER);
/** \brief Load a XML file to create the dialog from /** \brief Load a XML file to create the dialog from
@ -86,12 +86,13 @@ namespace GUIEngine
* that takes a XML file as argument is used) * that takes a XML file as argument is used)
*/ */
virtual void loadedFromFile() {} virtual void loadedFromFile() {}
void doInit();
public: public:
LEAK_CHECK() LEAK_CHECK()
/** Because C++ doesn't support constructor delegation... */ /** Because C++ doesn't support constructor delegation... */
void doInit();
bool isInited() {return m_init;} bool isInited() {return m_init;}
virtual ~ModalDialog(); virtual ~ModalDialog();
@ -120,6 +121,7 @@ namespace GUIEngine
* init(), which is invoked afer widgets were added) * init(), which is invoked afer widgets were added)
*/ */
virtual void beforeAddingWidgets() {} virtual void beforeAddingWidgets() {}
virtual void load() {}
/** \brief Optional callback invoked after widgets have been add()ed */ /** \brief Optional callback invoked after widgets have been add()ed */
virtual void init() {} virtual void init() {}

View File

@ -28,6 +28,7 @@
#include "addons/addon.hpp" #include "addons/addon.hpp"
#include "guiengine/dialog_queue.hpp" #include "guiengine/dialog_queue.hpp"
#include "states_screens/dialogs/user_info_dialog.hpp" #include "states_screens/dialogs/user_info_dialog.hpp"
#include "states_screens/online_profile_friends.hpp"
#include <sstream> #include <sstream>
#include <stdlib.h> #include <stdlib.h>
@ -390,7 +391,10 @@ namespace Online{
irr::core::stringw info_text(""); irr::core::stringw info_text("");
if(m_success) if(m_success)
{ {
ProfileManager::get()->removePersistent(id); CurrentUser::get()->getProfile()->removeFriend(id);
ProfileManager::get()->moveToCache(id);
ProfileManager::get()->getProfileByID(id)->deleteRelationalInfo();
OnlineProfileFriends::getInstance()->refreshFriendsList();
info_text = _("Friend request declined!"); info_text = _("Friend request declined!");
} }
else else

View File

@ -161,6 +161,32 @@ namespace Online{
// ============================================================================ // ============================================================================
void Profile::removeFriend( const uint32_t id)
{
assert (m_has_fetched_friends);
std::vector<uint32_t>::iterator iter;
for (iter = m_friends.begin(); iter != m_friends.end();)
{
if (*iter == id)
{
m_friends.erase(iter++);
break;
}
else
++iter;
}
}
// ============================================================================
void Profile::deleteRelationalInfo()
{
delete m_relation_info;
m_relation_info = NULL;
}
// ============================================================================
const std::vector<uint32_t> & Profile::getFriends() const std::vector<uint32_t> & Profile::getFriends()
{ {
assert (m_has_fetched_friends && m_state == S_READY); assert (m_has_fetched_friends && m_state == S_READY);

View File

@ -107,6 +107,8 @@ namespace Online{
bool isCurrentUser() const { return m_is_current_user; } bool isCurrentUser() const { return m_is_current_user; }
bool isFriend() const { return m_is_friend; } bool isFriend() const { return m_is_friend; }
void setFriend() { m_is_friend = true; } void setFriend() { m_is_friend = true; }
void removeFriend(const uint32_t id);
void deleteRelationalInfo();
RelationInfo * getRelationInfo() { return m_relation_info; } RelationInfo * getRelationInfo() { return m_relation_info; }
void setRelationInfo(RelationInfo * r){ delete m_relation_info; m_relation_info = r;} void setRelationInfo(RelationInfo * r){ delete m_relation_info; m_relation_info = r;}

View File

@ -117,23 +117,47 @@ namespace Online{
void ProfileManager::addPersistent(Profile * profile) void ProfileManager::addPersistent(Profile * profile)
{ {
assert (!inPersistent(profile->getID())); if(inPersistent(profile->getID()))
{
delete m_profiles_persistent[profile->getID()];
m_profiles_persistent[profile->getID()] = profile; m_profiles_persistent[profile->getID()] = profile;
} }
else
{
m_profiles_persistent[profile->getID()] = profile;
}
}
// ============================================================================ // ============================================================================
void ProfileManager::removePersistent(const uint32_t id) void ProfileManager::deleteFromPersistent(const uint32_t id)
{
if (inPersistent(id))
{ {
assert (inPersistent(id));
delete m_profiles_persistent[id]; delete m_profiles_persistent[id];
m_profiles_persistent.erase(id); m_profiles_persistent.erase(id);
} }
else
Log::warn("ProfileManager::removePersistent", "Tried to remove profile with id %d from persistent while not present", id);
}
// ============================================================================
void ProfileManager::moveToCache(const uint32_t id)
{
if (inPersistent(id))
{
Profile * profile = getProfileByID(id);
m_profiles_persistent.erase(id);
addToCache(profile);
}
else
Log::warn("ProfileManager::removePersistent", "Tried to move profile with id %d from persistent to cache while not present", id);
}
// ============================================================================ // ============================================================================
void ProfileManager::addToCache(Profile * profile) void ProfileManager::addToCache(Profile * profile)
{ {
if(inPersistent(profile->getID())) if(inPersistent(profile->getID()))
{ {
//FIXME should do updating of values //FIXME should do updating of values
@ -147,6 +171,8 @@ namespace Online{
{ {
directToCache(profile); directToCache(profile);
} }
Log::info("persistent size","%d", m_profiles_persistent.size());
Log::info("cache size","%d", m_profiles_cache.size());
} }
// ============================================================================ // ============================================================================
@ -182,6 +208,7 @@ namespace Online{
Profile * ProfileManager::getProfileByID(const uint32_t id) Profile * ProfileManager::getProfileByID(const uint32_t id)
{ {
if(inPersistent(id)) if(inPersistent(id))
return m_profiles_persistent[id]; return m_profiles_persistent[id];
if(cacheHit(id)) if(cacheHit(id))

View File

@ -59,7 +59,8 @@ namespace Online{
void addToCache(Profile * profile); void addToCache(Profile * profile);
void addPersistent(Profile * profile); void addPersistent(Profile * profile);
void removePersistent(const uint32_t id); void deleteFromPersistent(const uint32_t id);
void moveToCache(const uint32_t id);
void setVisiting(const uint32_t id); void setVisiting(const uint32_t id);
bool cacheHit(const uint32_t id); bool cacheHit(const uint32_t id);
bool inPersistent(const uint32_t id); bool inPersistent(const uint32_t id);

View File

@ -35,29 +35,32 @@ using namespace Online;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UserInfoDialog::UserInfoDialog(uint32_t showing_id, const core::stringw info, bool error, bool from_queue) UserInfoDialog::UserInfoDialog(uint32_t showing_id, const core::stringw info, bool error, bool from_queue)
: ModalDialog(0.8f,0.8f, !from_queue), m_showing_id(showing_id) : ModalDialog(0.8f,0.8f), m_showing_id(showing_id)
{ {
m_profile = ProfileManager::get()->getProfileByID(showing_id);
if(m_profile->isCurrentUser())
ModalDialog::dismiss();
m_self_destroy = false;
m_enter_profile = false;
m_processing = false;
m_error = error; m_error = error;
m_info = info; m_info = info;
if(!from_queue) load();
}
void UserInfoDialog::load()
{
loadFromFile("online/user_info_dialog.stkgui");
} }
void UserInfoDialog::beforeAddingWidgets() void UserInfoDialog::beforeAddingWidgets()
{ {
loadFromFile("online/user_info_dialog.stkgui"); m_profile = ProfileManager::get()->getProfileByID(m_showing_id);
if(m_error) m_self_destroy = false;
m_info_widget->setErrorColor(); m_enter_profile = false;
m_info_widget->setText(m_info, false); m_processing = false;
m_name_widget = getWidget<LabelWidget>("name"); m_name_widget = getWidget<LabelWidget>("name");
assert(m_name_widget != NULL); assert(m_name_widget != NULL);
m_name_widget->setText(m_profile->getUserName(),false); m_name_widget->setText(m_profile->getUserName(),false);
m_info_widget = getWidget<LabelWidget>("info"); m_info_widget = getWidget<LabelWidget>("info");
assert(m_info_widget != NULL); assert(m_info_widget != NULL);
if(m_error)
m_info_widget->setErrorColor();
m_info_widget->setText(m_info, false);
m_options_widget = getWidget<RibbonWidget>("options"); m_options_widget = getWidget<RibbonWidget>("options");
assert(m_options_widget != NULL); assert(m_options_widget != NULL);
m_friend_widget = getWidget<IconButtonWidget>("friend"); m_friend_widget = getWidget<IconButtonWidget>("friend");
@ -72,17 +75,21 @@ void UserInfoDialog::beforeAddingWidgets()
assert(m_cancel_widget != NULL); assert(m_cancel_widget != NULL);
m_options_widget->setFocusForPlayer(PLAYER_ID_GAME_MASTER); m_options_widget->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
Profile::RelationInfo * relation_info = m_profile->getRelationInfo();
if(relation_info == NULL || !relation_info->isPending() || !relation_info->isAsker())
{
m_accept_widget->setVisible(false); m_accept_widget->setVisible(false);
m_decline_widget->setVisible(false); m_decline_widget->setVisible(false);
if (relation_info == NULL) return; if(m_profile->isFriend() || m_profile->isCurrentUser())
m_friend_widget->setVisible(false);
Profile::RelationInfo * relation_info = m_profile->getRelationInfo();
if(relation_info != NULL)
{
if(relation_info->isPending() && relation_info->isAsker())
{
m_accept_widget->setVisible(true);
m_decline_widget->setVisible(true);
} }
if(m_profile->isFriend() || relation_info->isPending()) if(relation_info->isPending())
{
m_friend_widget->setVisible(false); m_friend_widget->setVisible(false);
} }

View File

@ -66,6 +66,7 @@ public:
~UserInfoDialog(); ~UserInfoDialog();
virtual void beforeAddingWidgets(); virtual void beforeAddingWidgets();
virtual void load();
void onEnterPressedInternal(); void onEnterPressedInternal();
GUIEngine::EventPropagation processEvent(const std::string& eventSource); GUIEngine::EventPropagation processEvent(const std::string& eventSource);

View File

@ -47,6 +47,7 @@ private:
int m_selected_friend_index; int m_selected_friend_index;
bool m_waiting_for_friends; bool m_waiting_for_friends;
bool m_own_profile; bool m_own_profile;
bool m_refresh_screen;
public: public:
friend class GUIEngine::ScreenSingleton<OnlineProfileFriends>; friend class GUIEngine::ScreenSingleton<OnlineProfileFriends>;
@ -63,6 +64,8 @@ public:
virtual void onUpdate(float delta, irr::video::IVideoDriver* driver) OVERRIDE; virtual void onUpdate(float delta, irr::video::IVideoDriver* driver) OVERRIDE;
virtual void beforeAddingWidget() OVERRIDE; virtual void beforeAddingWidget() OVERRIDE;
virtual void refreshFriendsList() {m_waiting_for_friends = true; }
}; };
#endif #endif