Lots of stuff. Mutex optimization. Addon voting. Some profile stuff continued. Progress+++

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13424 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
unitraxx 2013-08-06 22:45:33 +00:00
parent 856a21a47e
commit 366ae7009d
11 changed files with 277 additions and 111 deletions

View File

@ -18,10 +18,8 @@
<spacer height="40" width="50">
<buttonbar id="options" width="25%" height="20%" align="center">
<icon-button id="save" width="64" height="64" icon="gui/green_check.png"
I18N="Vote dialog" text="Save" label_location="none"/>
<icon-button id="cancel" width="64" height="64" icon="gui/main_quit.png"
I18N="Vote dialog" text="Cancel" label_location="none"/>
I18N="Vote dialog" text="Close" label_location="none"/>
</buttonbar>
</div>

View File

@ -1,4 +1,4 @@
# Generated by /home/gl3nn/repos/gsoc-stk-branch/update_file_list.sh. Do not edit this file manually.
# Generated by ./update_file_list.sh. Do not edit this file manually.
set(STK_SOURCES
src/addons/addon.cpp
src/addons/addons_manager.cpp
@ -229,6 +229,7 @@ src/states_screens/main_menu_screen.cpp
src/states_screens/networking_lobby.cpp
src/states_screens/network_kart_selection.cpp
src/states_screens/offline_kart_selection.cpp
src/states_screens/online_profile_friends.cpp
src/states_screens/online_profile_overview.cpp
src/states_screens/online_screen.cpp
src/states_screens/options_screen_audio.cpp
@ -526,6 +527,7 @@ src/states_screens/main_menu_screen.hpp
src/states_screens/networking_lobby.hpp
src/states_screens/network_kart_selection.hpp
src/states_screens/offline_kart_selection.hpp
src/states_screens/online_profile_friends.hpp
src/states_screens/online_profile_overview.hpp
src/states_screens/online_screen.hpp
src/states_screens/options_screen_audio.hpp

View File

@ -126,18 +126,18 @@ namespace Online{
return request;
}
void CurrentUser::signIn(const SignInRequest * input)
void CurrentUser::signIn(bool success, const XMLNode * input)
{
if (input->isSuccess())
if (success)
{
std::string token("");
int token_fetched = input->getResult()->get("token", &token);
int token_fetched = input->get("token", &token);
setToken(token);
irr::core::stringw username("");
int username_fetched = input->getResult()->get("username", &username);
int username_fetched = input->get("username", &username);
setUserName(username);
uint32_t userid(0);
int userid_fetched = input->getResult()->get("userid", &userid);
int userid_fetched = input->get("userid", &userid);
setUserID(userid);
assert(token_fetched && username_fetched && userid_fetched);
setUserState (US_SIGNED_IN);
@ -147,6 +147,12 @@ namespace Online{
UserConfigParams::m_saved_token = getToken();
UserConfigParams::m_saved_session = true;
}
else
{
UserConfigParams::m_saved_user = 0;
UserConfigParams::m_saved_token = "";
UserConfigParams::m_saved_session = false;
}
}
else
setUserState (US_SIGNED_OUT);
@ -154,7 +160,7 @@ namespace Online{
void CurrentUser::SignInRequest::callback()
{
CurrentUser::get()->signIn(this);
CurrentUser::get()->signIn(m_success, m_result);
}
// ============================================================================
@ -176,11 +182,11 @@ namespace Online{
void CurrentUser::ServerCreationRequest::callback()
{
if(isSuccess())
if(m_success)
{
Server * server = new Server(*getResult()->getNode("server"));
Server * server = new Server(*m_result->getNode("server"));
ServersManager::get()->addServer(server);
m_created_server_id.setAtomic(server->getServerId());
m_created_server_id = server->getServerId();
}
}
@ -197,9 +203,9 @@ namespace Online{
return request;
}
void CurrentUser::signOut(const SignOutRequest * input)
void CurrentUser::signOut(bool success, const XMLNode * input)
{
if(!input->isSuccess())
if(!success)
{
Log::warn("CurrentUser::signOut", "%s", _("There were some connection issues while signing out. Report a bug if this caused issues."));
}
@ -214,7 +220,7 @@ namespace Online{
void CurrentUser::SignOutRequest::callback()
{
CurrentUser::get()->signOut(this);
CurrentUser::get()->signOut(m_success, m_result);
}
// ============================================================================
@ -239,7 +245,7 @@ namespace Online{
if(isSuccess())
{
uint32_t server_id;
getResult()->get("serverid", &server_id);
m_result->get("serverid", &server_id);
ServersManager::get()->setJoinedServer(server_id);
}
//FIXME needs changes for actual valid joining
@ -254,8 +260,8 @@ namespace Online{
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
request->setParameter("action", std::string("get-addon-vote"));
request->setParameter("token", getToken());
request->setParameter("id", getUserID());
request->setParameter("addon-id", addon_id);
request->setParameter("userid", getUserID());
request->setParameter("addonid", addon_id);
HTTPManager::get()->addRequest(request);
return request;
}
@ -269,8 +275,8 @@ namespace Online{
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
request->setParameter("action", std::string("set-addon-vote"));
request->setParameter("token", getToken());
request->setParameter("id", getUserID());
request->setParameter("addon-id", addon_id);
request->setParameter("userid", getUserID());
request->setParameter("addonid", addon_id);
request->setParameter("rating", rating);
HTTPManager::get()->addRequest(request);
return request;
@ -278,12 +284,12 @@ namespace Online{
void CurrentUser::setAddonVoteRequest::callback()
{
if(isSuccess())
if(m_success)
{
std::string addon_id;
getResult()->get("addon-id", &addon_id);
m_result->get("addon-id", &addon_id);
float average;
getResult()->get("new-average", &average);
m_result->get("new-average", &average);
addons_manager->getAddon(addon_id)->setRating(average);
}
}

View File

@ -28,6 +28,7 @@
#include <irrString.h>
#include <string>
#include <assert.h>
namespace Online{
@ -74,10 +75,10 @@ namespace Online{
class ServerCreationRequest : public XMLRequest {
virtual void callback ();
Synchronised<uint32_t> m_created_server_id;
uint32_t m_created_server_id;
public:
ServerCreationRequest() : XMLRequest(RT_SERVER_CREATION) {}
const uint32_t getCreatedServerID() const {return m_created_server_id.getAtomic();}
const uint32_t getCreatedServerID() const { assert(isDone()); return m_created_server_id;}
};
class ServerJoinRequest : public XMLRequest {
@ -106,9 +107,8 @@ namespace Online{
CurrentUser();
void signIn (const SignInRequest * input);
void signOut (const SignOutRequest * input);
void createServer (const ServerCreationRequest * input);
void signIn (bool success, const XMLNode * input);
void signOut (bool success, const XMLNode * input);
public:
/**Singleton */

View File

@ -149,6 +149,7 @@ namespace Online{
void HTTPManager::addRequest(Request *request)
{
assert(request->isAllowedToAdd());
request->setBusy();
m_request_queue.lock();
m_request_queue.getData().push(request);
// Wake up the network http thread

View File

@ -36,7 +36,7 @@ namespace Online{
: m_type(type), m_manage_memory(manage_memory), m_priority(priority)
{
m_cancel.setAtomic(false);
m_done.setAtomic(false);
m_state.setAtomic(S_PREPARING);
} // Request
Request::~Request()
@ -45,6 +45,7 @@ namespace Online{
void Request::execute()
{
assert(isBusy());
prepareOperation();
operation();
afterOperation();
@ -52,7 +53,7 @@ namespace Online{
void Request::afterOperation()
{
m_done.setAtomic(true);
m_state.setAtomic(S_DONE);
}
// =========================================================================================
@ -62,26 +63,21 @@ namespace Online{
{
//Negative numbers are reserved for special requests ment for the HTTP Manager
assert(type >= 0);
m_url.setAtomic("");
MutexLocker(m_parameters);
m_parameters.getData() = new Parameters;
m_url = "";
m_parameters = new Parameters();
m_progress.setAtomic(0);
}
HTTPRequest::~HTTPRequest()
{
MutexLocker(m_parameters);
delete m_parameters.getData();
delete m_parameters;
}
bool HTTPRequest::isAllowedToAdd()
{
bool ok = true;
m_url.lock();
if (m_url.getData().size() > 5 && ( m_url.getData().substr(0, 5) != "http:"))
ok = false;
m_url.unlock();
return ok;
if (!Request::isAllowedToAdd() || m_url.size() < 5 || ( m_url.substr(0, 5) != "http:"))
return false;
return true;
}
void HTTPRequest::prepareOperation()
@ -92,7 +88,7 @@ namespace Online{
Log::error("HTTPRequest::prepareOperation", "LibCurl session not initialized.");
return;
}
curl_easy_setopt(m_curl_session, CURLOPT_URL, m_url.getAtomic().c_str());
curl_easy_setopt(m_curl_session, CURLOPT_URL, m_url.c_str());
curl_easy_setopt(m_curl_session, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_curl_session, CURLOPT_WRITEFUNCTION, &HTTPRequest::WriteCallback);
curl_easy_setopt(m_curl_session, CURLOPT_NOPROGRESS, 0);
@ -109,10 +105,9 @@ namespace Online{
return;
Parameters::iterator iter;
std::string postString("");
m_parameters.lock();
for (iter = m_parameters.getData()->begin(); iter != m_parameters.getData()->end(); ++iter)
for (iter = m_parameters->begin(); iter != m_parameters->end(); ++iter)
{
if(iter != m_parameters.getData()->begin())
if(iter != m_parameters->begin())
postString.append("&");
char * escaped = curl_easy_escape(m_curl_session , iter->first.c_str(), iter->first.size());
postString.append(escaped);
@ -122,7 +117,6 @@ namespace Online{
postString.append(escaped);
curl_free(escaped);
}
m_parameters.unlock();
curl_easy_setopt(m_curl_session, CURLOPT_POSTFIELDS, postString.c_str());
std::string uagent( std::string("SuperTuxKart/") + STK_VERSION );
#ifdef WIN32
@ -209,16 +203,14 @@ namespace Online{
: HTTPRequest(priority, manage_memory, type)
{
m_string_buffer = "";
m_info.setAtomic("");
m_success.setAtomic(false);
MutexLocker(m_result);
m_result.getData() = NULL;
m_info = "";
m_success = false;
m_result = NULL;
}
XMLRequest::~XMLRequest()
{
MutexLocker(m_result);
delete m_result.getData();
delete m_result;
}
void XMLRequest::prepareOperation()
@ -231,8 +223,7 @@ namespace Online{
void XMLRequest::operation()
{
HTTPRequest::operation();
MutexLocker(m_result);
m_result.getData() = file_manager->createXMLTreeFromString(m_string_buffer);
m_result = file_manager->createXMLTreeFromString(m_string_buffer);
}
void XMLRequest::afterOperation()
@ -241,35 +232,34 @@ namespace Online{
Log::error( "XMLRequest::afterOperation", "curl_easy_perform() failed: %s", curl_easy_strerror(m_curl_code));
else
Log::info( "XMLRequest::afterOperation", "Received : %s", m_string_buffer.c_str());
m_result.lock();;
bool success = false;
irr::core::stringw info;
std::string rec_success;
if(m_result.getData()->get("success", &rec_success))
if(m_result->get("success", &rec_success))
{
if (rec_success =="yes")
success = true;
m_result.getData()->get("info", &info);
m_result->get("info", &m_info);
}
else
info = _("Unable to connect to the server. Check your internet connection or try again later.");
m_result.unlock();
m_info.lock();
m_info.getData() = info;
m_info.unlock();
m_success.setAtomic(success);
m_info = _("Unable to connect to the server. Check your internet connection or try again later.");
m_success = success;
HTTPRequest::afterOperation();
}
const XMLNode * XMLRequest::getResult() const
{
MutexLocker(m_result);
return m_result.getData();
assert(isDone());
return m_result;
}
const irr::core::stringw & XMLRequest::getInfo() const
{
MutexLocker(m_info);
return m_info.getData();
assert(isDone());
return m_info;
}
bool XMLRequest::isSuccess() const
{
assert(isDone());
return m_success;
}
} // namespace Online

View File

@ -28,7 +28,7 @@
# include <winsock2.h>
#endif
#include <curl/curl.h>
#include <assert.h>
#include <string>
namespace Online{
@ -54,12 +54,19 @@ namespace Online{
important this request is. */
const int m_priority;
enum State
{
S_PREPARING,
S_BUSY,
S_DONE
};
protected:
/** Cancel this request if it is active. */
Synchronised<bool> m_cancel;
/** Set to though if the reply of the request is in and callbacks are executed */
Synchronised<bool> m_done;
Synchronised<State> m_state;
virtual void prepareOperation() {}
virtual void operation() {}
@ -92,10 +99,19 @@ namespace Online{
bool isCancelled() const { return m_cancel.getAtomic(); }
// ------------------------------------------------------------------------
/** Returns if this request is done. */
bool isDone() const { return m_done.getAtomic(); }
bool isDone() const { return m_state.getAtomic() == S_DONE; }
// ------------------------------------------------------------------------
/** Returns if this request is being prepared. */
bool isPreparing() const { return m_state.getAtomic() == S_PREPARING; }
// ------------------------------------------------------------------------
/** Returns if this request is busy. */
bool isBusy() const { return m_state.getAtomic() == S_BUSY; }
// ------------------------------------------------------------------------
/** Sets the request stqte to busy. */
void setBusy() { m_state.setAtomic(S_BUSY); }
// ------------------------------------------------------------------------
/** Virtual method to check if a request has initialized all needed members to a valid value. */
virtual bool isAllowedToAdd() const { return true; }
virtual bool isAllowedToAdd() const { return isPreparing(); }
/** This class is used by the priority queue to sort requests by priority.
*/
@ -126,8 +142,8 @@ namespace Online{
* packet is downloaded. At the end either -1 (error) or 1
* (everything ok) at the end. */
Synchronised<float> m_progress;
Synchronised<std::string> m_url;
Synchronised<Parameters *> m_parameters;
std::string m_url;
Parameters * m_parameters;
CURL * m_curl_session;
CURLcode m_curl_code;
@ -154,32 +170,27 @@ namespace Online{
virtual ~HTTPRequest();
void setParameter(const std::string & name, const std::string &value){
MutexLocker(m_parameters);
(*m_parameters.getData())[name] = value;
assert(isPreparing());
(*m_parameters)[name] = value;
};
void setParameter(const std::string & name, const irr::core::stringw &value){
MutexLocker(m_parameters);
(*m_parameters.getData())[name] = irr::core::stringc(value.c_str()).c_str();
assert(isPreparing());
(*m_parameters)[name] = irr::core::stringc(value.c_str()).c_str();
}
template <typename T>
void setParameter(const std::string & name, const T& value){
MutexLocker(m_parameters);
(*m_parameters.getData())[name] = StringUtils::toString(value);
assert(isPreparing());
(*m_parameters)[name] = StringUtils::toString(value);
}
/** Returns the current progress. */
float getProgress() const { return m_progress.getAtomic(); }
float getProgress() const { return m_progress.getAtomic(); }
/** Sets the current progress. */
void setProgress(float f) { m_progress.setAtomic(f); }
void setProgress(float f) { m_progress.setAtomic(f); }
const std::string getURL() {
m_url.lock();
const std::string url = m_url.getData();
m_url.unlock();
return url;
}
const std::string & getURL() { assert(isBusy()); return m_url;}
void setURL(const std::string & url) { m_url.setAtomic(url);}
void setURL(const std::string & url) { assert(isPreparing()); m_url = url;}
virtual bool isAllowedToAdd() OVERRIDE;
@ -188,12 +199,12 @@ namespace Online{
class XMLRequest : public HTTPRequest
{
private:
Synchronised<XMLNode *> m_result;
std::string m_string_buffer;
protected :
Synchronised<irr::core::stringw> m_info;
Synchronised<bool> m_success;
XMLNode * m_result;
irr::core::stringw m_info;
bool m_success;
virtual void prepareOperation() OVERRIDE;
virtual void operation() OVERRIDE;
@ -205,7 +216,7 @@ namespace Online{
const XMLNode * getResult() const;
const irr::core::stringw & getInfo() const;
bool isSuccess() const { return m_success.getAtomic(); }
bool isSuccess() const;
};
} //namespace Online

View File

@ -53,8 +53,6 @@ VoteDialog::VoteDialog(const std::string & addon_id)
m_rating_widget->allowVoting();
m_options_widget = getWidget<RibbonWidget>("options");
assert(m_options_widget != NULL);
m_save_widget = getWidget<IconButtonWidget>("save");
assert(m_save_widget != NULL);
m_cancel_widget = getWidget<IconButtonWidget>("cancel");
assert(m_cancel_widget != NULL);
m_options_widget->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
@ -62,7 +60,6 @@ VoteDialog::VoteDialog(const std::string & addon_id)
m_fetch_vote_request = CurrentUser::get()->requestGetAddonVote(m_addon_id);
m_rating_widget->setDeactivated();
m_save_widget->setDeactivated();
m_cancel_widget->setDeactivated();
}
@ -88,7 +85,9 @@ GUIEngine::EventPropagation VoteDialog::processEvent(const std::string& eventSou
if (eventSource == m_rating_widget->m_properties[PROP_ID])
{
m_self_destroy = true;
m_perform_vote_request = CurrentUser::get()->requestSetAddonVote(m_addon_id, m_rating_widget->getRating());
m_rating_widget->setDeactivated();
m_cancel_widget->setDeactivated();
return GUIEngine::EVENT_BLOCK;
}
@ -100,14 +99,6 @@ GUIEngine::EventPropagation VoteDialog::processEvent(const std::string& eventSou
m_self_destroy = true;
return GUIEngine::EVENT_BLOCK;
}
else if (selection == m_save_widget->m_properties[PROP_ID])
{
m_perform_vote_request = CurrentUser::get()->requestSetAddonVote(m_addon_id, m_rating_widget->getRating());
m_rating_widget->setDeactivated();
m_save_widget->setDeactivated();
m_cancel_widget->setDeactivated();
return GUIEngine::EVENT_BLOCK;
}
}
return GUIEngine::EVENT_LET;
}
@ -124,7 +115,20 @@ void VoteDialog::onUpdate(float dt)
{
m_info_widget->setDefaultColor();
m_info_widget->setText(_("bla"), false); //FIXME
m_options_widget->setActivated();
std::string voted;
m_fetch_vote_request->getResult()->get("voted", &voted);
if(voted == "yes")
{
float rating;
m_fetch_vote_request->getResult()->get("rating", &rating);
m_rating_widget->setRating(rating);
m_info_widget->setText(_("You can adapt your previous rating by clicking the stars beneath."), false);
}
else if(voted == "no")
{
m_info_widget->setText(_("You have not yet voted for this addon. Select your desired rating by clicking the stars beneath"), false);
}
m_cancel_widget->setActivated();
m_rating_widget->setActivated();
}
else
@ -149,7 +153,7 @@ void VoteDialog::onUpdate(float dt)
if(m_perform_vote_request->isSuccess())
{
m_info_widget->setDefaultColor();
m_info_widget->setText(_("Vote cast! You can now close the window."), false);
m_info_widget->setText(_("Vote successful! You can now close the window."), false);
m_cancel_widget->setActivated();
}
else
@ -157,7 +161,7 @@ void VoteDialog::onUpdate(float dt)
sfx_manager->quickSound( "anvil" );
m_info_widget->setErrorColor();
m_info_widget->setText(m_perform_vote_request->getInfo(), false);
m_options_widget->setActivated();
m_cancel_widget->setActivated();
m_rating_widget->setActivated();
}
delete m_perform_vote_request;

View File

@ -53,7 +53,6 @@ private:
GUIEngine::RatingBarWidget * m_rating_widget;
GUIEngine::RibbonWidget * m_options_widget;
GUIEngine::IconButtonWidget * m_save_widget;
GUIEngine::IconButtonWidget * m_cancel_widget;
public:

View File

@ -0,0 +1,96 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2010 Glenn De Jonghe
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "states_screens/online_profile_friends.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/scalable_font.hpp"
#include "guiengine/screen.hpp"
#include "guiengine/widget.hpp"
#include "states_screens/state_manager.hpp"
#include "utils/translation.hpp"
#include <IGUIButton.h>
#include <iostream>
#include <sstream>
using namespace GUIEngine;
using namespace irr::core;
using namespace irr::gui;
using namespace Online;
DEFINE_SCREEN_SINGLETON( OnlineProfileFriends );
// -----------------------------------------------------------------------------
OnlineProfileFriends::OnlineProfileFriends() : Screen("online/profile_overview.stkgui")
{
} // OnlineProfileFriends
// -----------------------------------------------------------------------------
void OnlineProfileFriends::loadedFromFile()
{
m_profile_tabs = this->getWidget<RibbonWidget>("profile_tabs");
assert(m_profile_tabs != NULL);
LabelWidget * header = this->getWidget<LabelWidget>("title");
assert(header != NULL);
header->setText(_("Your profile"), false);
} // loadedFromFile
// -----------------------------------------------------------------------------
void OnlineProfileFriends::init()
{
Screen::init();
m_profile_tabs->select( "tab_players", PLAYER_ID_GAME_MASTER );
/*
tabBar->getRibbonChildren()[0].setTooltip( _("Graphics") );
tabBar->getRibbonChildren()[1].setTooltip( _("Audio") );
tabBar->getRibbonChildren()[2].setTooltip( _("User Interface") );
tabBar->getRibbonChildren()[4].setTooltip( _("Controls") );*/
} // init
// -----------------------------------------------------------------------------
void OnlineProfileFriends::tearDown()
{
Screen::tearDown();
} // tearDown
// -----------------------------------------------------------------------------
void OnlineProfileFriends::eventCallback(Widget* widget, const std::string& name, const int playerID)
{
if (name == m_profile_tabs->m_properties[PROP_ID])
{
std::string selection = ((RibbonWidget*)widget)->getSelectionIDString(PLAYER_ID_GAME_MASTER).c_str();
//if (selection == "tab_audio") StateManager::get()->replaceTopMostScreen(OptionsScreenAudio::getInstance());
}
else if (name == "back")
{
StateManager::get()->escapePressed();
}
} // eventCallback

View File

@ -0,0 +1,59 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2013 Glenn De Jonghe
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef __HEADER_ONLINE_PROFILE_FRIENDS_HPP__
#define __HEADER_ONLINE_PROFILE_FRIENDS_HPP__
#include <string>
#include <irrString.h>
#include "guiengine/screen.hpp"
#include "guiengine/widgets.hpp"
namespace GUIEngine { class Widget; }
/**
* \brief Online profiel overview screen
* \ingroup states_screens
*/
class OnlineProfileFriends : public GUIEngine::Screen, public GUIEngine::ScreenSingleton<OnlineProfileFriends>
{
private:
OnlineProfileFriends();
GUIEngine::RibbonWidget* m_profile_tabs;
public:
friend class GUIEngine::ScreenSingleton<OnlineProfileFriends>;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void loadedFromFile() OVERRIDE;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void eventCallback(GUIEngine::Widget* widget, const std::string& name,
const int playerID) OVERRIDE;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void init() OVERRIDE;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void tearDown() OVERRIDE;
};
#endif