more cleanup in menu callbacks

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3343 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2009-04-02 00:03:15 +00:00
parent bc6caced03
commit 017e004985

View File

@ -13,27 +13,23 @@
#include <vector>
/**
* This stack will contain menu names (e.g. main.stkgui), and/or 'race'.
*/
std::vector<std::string> g_menu_stack;
static bool g_game_mode = false;
#if 0
#pragma mark Callbacks
#endif
namespace StateManager
{
void showTrackSelectionScreen()
{
pushMenu("tracks.stkgui");
GUIEngine::RibbonGridWidget* w = dynamic_cast<GUIEngine::RibbonGridWidget*>(GUIEngine::getCurrentScreen()->getWidget("tracks"));
assert( w != NULL );
// FIXME - should be called only once, not on every show?
w->addItem("Track 1","t1","track1.png");
w->addItem("Track 2","t2","track2.png");
w->addItem("Track 3","t3","track3.png");
w->addItem("Track 4","t4","track4.png");
w->addItem("Track 5","t5","track5.png");
w->addItem("Track 6","t6","track6.png");
w->addItem("Track 7","t7","track7.png");
w->addItem("Track 8","t8","track8.png");
w->updateItemDisplay();
}
/**
* Callback handling events from the main menu
*/
void menuEventMain(GUIEngine::Widget* widget, std::string& name)
{
GUIEngine::RibbonWidget* ribbon = dynamic_cast<GUIEngine::RibbonWidget*>(widget);
@ -95,6 +91,9 @@ namespace StateManager
}
}
/**
* Callback handling events from the kart selection menu
*/
void menuEventKarts(GUIEngine::Widget* widget, std::string& name)
{
// TODO - actually check which kart was selected
@ -104,6 +103,9 @@ namespace StateManager
}
}
/**
* Callback handling events from the race setup menu
*/
void menuEventRaceSetup(GUIEngine::Widget* widget, std::string& name)
{
// TODO - detect difficulty, allow more game modes
@ -112,7 +114,7 @@ namespace StateManager
GUIEngine::RibbonWidget* w = dynamic_cast<GUIEngine::RibbonWidget*>(widget);
if(w->getSelectionName() == "normal")
{
showTrackSelectionScreen();
StateManager::pushMenu("tracks.stkgui");
}
}
/*
@ -161,8 +163,31 @@ namespace StateManager
*/
}
/**
* Callback handling events from the track menu
*/
void menuEventTracks(GUIEngine::Widget* widget, std::string& name)
{
static bool track_menu_inited = false;
if(name == "init" && !track_menu_inited)
{
GUIEngine::RibbonGridWidget* w = dynamic_cast<GUIEngine::RibbonGridWidget*>
(GUIEngine::getCurrentScreen()->getWidget("tracks"));
assert( w != NULL );
w->addItem("Track 1","t1","track1.png");
w->addItem("Track 2","t2","track2.png");
w->addItem("Track 3","t3","track3.png");
w->addItem("Track 4","t4","track4.png");
w->addItem("Track 5","t5","track5.png");
w->addItem("Track 6","t6","track6.png");
w->addItem("Track 7","t7","track7.png");
w->addItem("Track 8","t8","track8.png");
w->updateItemDisplay();
track_menu_inited = true;
}
// -- track seelction screen
if(name == "tracks")
{
@ -194,6 +219,10 @@ namespace StateManager
}
}
/**
* Callback handling events from the options menus
*/
void menuEventOptions(GUIEngine::Widget* widget, std::string& name)
{
// -- options
@ -215,7 +244,13 @@ namespace StateManager
}
}
/**
* All widget events will be dispatched to this function; arguments are
* a pointer to the widget from which the event originates, and its internal
* name. There is one exception : right after showing a new screen, an event with
* name 'init' and widget set to NULL will be fired, so the screen can be filled
* with the right values or so.
*/
void eventCallback(GUIEngine::Widget* widget, std::string& name)
{
std::cout << "event!! " << name.c_str() << std::endl;
@ -234,61 +269,21 @@ namespace StateManager
menuEventOptions(widget, name);
else
std::cerr << "Warning, unknown menu " << screen_name << " in event callback\n";
}
#if 0
#pragma mark -
#pragma mark Other
#endif
void initGUI()
{
IrrlichtDevice* device = irr_driver->getDevice();
video::IVideoDriver* driver = device->getVideoDriver();
GUIEngine::init(device, driver, &eventCallback);
}
std::vector<std::string> g_menu_stack;
static bool g_game_mode = false;
void pushMenu(std::string name)
{
input_manager->setMode(InputManager::MENU);
g_menu_stack.push_back(name);
g_game_mode = false;
GUIEngine::switchToScreen(name.c_str());
}
void replaceTopMostMenu(std::string name)
{
input_manager->setMode(InputManager::MENU);
g_menu_stack[g_menu_stack.size()-1] = name;
g_game_mode = false;
GUIEngine::switchToScreen(name.c_str());
}
void popMenu()
{
g_menu_stack.pop_back();
if(g_menu_stack.size() == 0)
{
main_loop->abort();
return;
}
g_game_mode = g_menu_stack[g_menu_stack.size()-1] == "race";
GUIEngine::switchToScreen(g_menu_stack[g_menu_stack.size()-1].c_str());
}
void resetAndGoToMenu(std::string name)
{
race_manager->exitRace();
input_manager->setMode(InputManager::MENU);
g_menu_stack.clear();
g_menu_stack.push_back(name);
g_game_mode = false;
GUIEngine::switchToScreen(name.c_str());
}
void enterGameState()
{
g_menu_stack.clear();
@ -314,5 +309,59 @@ namespace StateManager
popMenu();
}
}
#if 0
#pragma mark -
#pragma mark Push/pop menus
#endif
static std::string g_init_event = "init";
void pushMenu(std::string name)
{
input_manager->setMode(InputManager::MENU);
g_menu_stack.push_back(name);
g_game_mode = false;
GUIEngine::switchToScreen(name.c_str());
eventCallback(NULL, g_init_event);
}
void replaceTopMostMenu(std::string name)
{
input_manager->setMode(InputManager::MENU);
g_menu_stack[g_menu_stack.size()-1] = name;
g_game_mode = false;
GUIEngine::switchToScreen(name.c_str());
eventCallback(NULL, g_init_event);
}
void popMenu()
{
g_menu_stack.pop_back();
if(g_menu_stack.size() == 0)
{
main_loop->abort();
return;
}
g_game_mode = g_menu_stack[g_menu_stack.size()-1] == "race";
GUIEngine::switchToScreen(g_menu_stack[g_menu_stack.size()-1].c_str());
eventCallback(NULL, g_init_event);
}
void resetAndGoToMenu(std::string name)
{
race_manager->exitRace();
input_manager->setMode(InputManager::MENU);
g_menu_stack.clear();
g_menu_stack.push_back(name);
g_game_mode = false;
GUIEngine::switchToScreen(name.c_str());
eventCallback(NULL, g_init_event);
}
}