Ported race paused dialog to XML files + fixed many small things with dialogs-from-xml on the way
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@5741 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
f03c8b94fe
commit
f43d9d4d35
@ -479,7 +479,10 @@ EventPropagation EventHandler::onWidgetActivated(GUIEngine::Widget* w, const int
|
|||||||
// notify modal dialog too
|
// notify modal dialog too
|
||||||
if (ModalDialog::isADialogActive())
|
if (ModalDialog::isADialogActive())
|
||||||
{
|
{
|
||||||
if (ModalDialog::getCurrent()->processEvent(parent->m_properties[PROP_ID]) == EVENT_BLOCK) return EVENT_BLOCK;
|
if (ModalDialog::getCurrent()->processEvent(parent->m_properties[PROP_ID]) == EVENT_BLOCK)
|
||||||
|
{
|
||||||
|
return EVENT_BLOCK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sendEventToUser(parent, parent->m_properties[PROP_ID], playerID);
|
sendEventToUser(parent, parent->m_properties[PROP_ID], playerID);
|
||||||
@ -521,25 +524,29 @@ EventPropagation EventHandler::onGUIEvent(const SEvent& event)
|
|||||||
//else break;
|
//else break;
|
||||||
}
|
}
|
||||||
case EGET_ELEMENT_HOVERED:
|
case EGET_ELEMENT_HOVERED:
|
||||||
{
|
{
|
||||||
Widget* w = GUIEngine::getWidget(id);
|
Widget* w = GUIEngine::getWidget(id);
|
||||||
|
|
||||||
if (w == NULL) break;
|
if (w == NULL) break;
|
||||||
|
|
||||||
if (!w->m_focusable) return GUIEngine::EVENT_BLOCK;
|
if (!w->m_focusable) return GUIEngine::EVENT_BLOCK;
|
||||||
|
|
||||||
// When a modal dialog is shown, don't select widgets out of the dialog
|
// When a modal dialog is shown, don't select widgets out of the dialog
|
||||||
if (ModalDialog::isADialogActive() && !ModalDialog::getCurrent()->isMyChild(w))
|
if (ModalDialog::isADialogActive() && !ModalDialog::getCurrent()->isMyChild(w))
|
||||||
{
|
{
|
||||||
// check for parents too before discarding event
|
// check for parents too before discarding event
|
||||||
if (w->m_event_handler != NULL)
|
if (w->m_event_handler != NULL)
|
||||||
{
|
{
|
||||||
if (!ModalDialog::getCurrent()->isMyChild(w->m_event_handler)) break;
|
if (!ModalDialog::getCurrent()->isMyChild(w->m_event_handler))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// select ribbons on hover
|
// select ribbons on hover
|
||||||
if (w->m_event_handler != NULL && w->m_event_handler->m_type == WTYPE_RIBBON)
|
if (w->m_event_handler != NULL && w->m_event_handler->m_type == WTYPE_RIBBON)
|
||||||
{
|
{
|
||||||
RibbonWidget* ribbon = (RibbonWidget*)(w->m_event_handler);
|
RibbonWidget* ribbon = (RibbonWidget*)(w->m_event_handler);
|
||||||
if (ribbon == NULL) break;
|
if (ribbon == NULL) break;
|
||||||
|
|
||||||
|
@ -52,29 +52,13 @@ ModalDialog::ModalDialog(const float percentWidth, const float percentHeight)
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void traceChildren(const ptr_vector<Widget>& widgets, int indent=0)
|
void ModalDialog::loadFromFile(const char* xmlFile)
|
||||||
{
|
{
|
||||||
for (int n=0; n<widgets.size(); n++)
|
|
||||||
{
|
|
||||||
for (int i=0; i<indent; i++) std::cout << " ";
|
|
||||||
std::cout << " Type " << widgets[n].getType() << " : "
|
|
||||||
<< const_cast<Widget*>(widgets.getConst(n))->m_properties[PROP_ID].c_str() << "\n";
|
|
||||||
traceChildren (widgets[n].getChildren(), indent+1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ModalDialog::ModalDialog(const char* xmlFile, const float percentWidth, const float percentHeight)
|
|
||||||
{
|
|
||||||
// FIXME: dialog are destroyed when dismissed, this means the disk
|
|
||||||
// will be seeked everytime the same dialog is opened to read its
|
|
||||||
// XML file... cache loaded dialogs somehow maybe?
|
|
||||||
doInit(percentWidth, percentHeight);
|
|
||||||
IrrXMLReader* xml = irr::io::createIrrXMLReader( (file_manager->getGUIDir() + "/" + xmlFile).c_str() );
|
IrrXMLReader* xml = irr::io::createIrrXMLReader( (file_manager->getGUIDir() + "/" + xmlFile).c_str() );
|
||||||
Screen::parseScreenFileDiv(xml, m_children, m_irrlicht_window);
|
Screen::parseScreenFileDiv(xml, m_children, m_irrlicht_window);
|
||||||
delete xml;
|
delete xml;
|
||||||
|
|
||||||
std::cout << "Dialog children :\n";
|
loadedFromFile();
|
||||||
traceChildren(m_children);
|
|
||||||
|
|
||||||
LayoutManager::calculateLayout( m_children, this );
|
LayoutManager::calculateLayout( m_children, this );
|
||||||
|
|
||||||
@ -282,3 +266,30 @@ void ModalDialog::addWidgetsRecursively(ptr_vector<Widget>& widgets, Widget* par
|
|||||||
} // addWidgetsRecursively
|
} // addWidgetsRecursively
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool isMyChildHelperFunc(const ptr_vector<Widget>* within, const Widget* widget)
|
||||||
|
{
|
||||||
|
if (within->size() == 0) return false;
|
||||||
|
|
||||||
|
if (within->contains(widget))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int count = within->size();
|
||||||
|
for (int n=0; n<count; n++)
|
||||||
|
{
|
||||||
|
if (isMyChildHelperFunc(&within->getConst(n)->getChildren(), widget))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ModalDialog::isMyChild(Widget* widget) const
|
||||||
|
{
|
||||||
|
return isMyChildHelperFunc(&m_children, widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -59,18 +59,18 @@ 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);
|
ModalDialog(const float percentWidth, const float percentHeight);
|
||||||
|
|
||||||
/**
|
void loadFromFile(const char* xmlFile);
|
||||||
* \brief Creates a modal dialog with given percentage of screen width and height
|
|
||||||
*/
|
|
||||||
ModalDialog(const char* xmlFile, const float percentWidth, const float percentHeight);
|
|
||||||
|
|
||||||
|
|
||||||
virtual void onEnterPressedInternal();
|
virtual void onEnterPressedInternal();
|
||||||
void clearWindow();
|
void clearWindow();
|
||||||
|
|
||||||
void addWidgetsRecursively(ptr_vector<Widget>& widgets, Widget* parent=NULL);
|
void addWidgetsRecursively(ptr_vector<Widget>& widgets, Widget* parent=NULL);
|
||||||
|
|
||||||
|
/** \brief Callback invoked when the dialog was loaded from the XML file (if the constructor
|
||||||
|
* that takes a XML file as argument is used)
|
||||||
|
*/
|
||||||
|
virtual void loadedFromFile() {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ptr_vector<Widget> m_children;
|
ptr_vector<Widget> m_children;
|
||||||
@ -80,7 +80,7 @@ namespace GUIEngine
|
|||||||
/** Returns whether to block event propagation (usually, you will want to block events you processed) */
|
/** Returns whether to block event propagation (usually, you will want to block events you processed) */
|
||||||
virtual EventPropagation processEvent(const std::string& eventSource){ return EVENT_LET; }
|
virtual EventPropagation processEvent(const std::string& eventSource){ return EVENT_LET; }
|
||||||
|
|
||||||
bool isMyChild(Widget* widget) const { return m_children.contains(widget); }
|
bool isMyChild(Widget* widget) const;
|
||||||
bool isMyChild(irr::gui::IGUIElement* widget) const { return m_irrlicht_window->isMyChild(widget); }
|
bool isMyChild(irr::gui::IGUIElement* widget) const { return m_irrlicht_window->isMyChild(widget); }
|
||||||
|
|
||||||
Widget* getFirstWidget();
|
Widget* getFirstWidget();
|
||||||
|
@ -160,6 +160,22 @@ void Widget::setDeactivated()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool Widget::deleteChild(const char* id)
|
||||||
|
{
|
||||||
|
const int count = m_children.size();
|
||||||
|
for (int n=0; n<count; n++)
|
||||||
|
{
|
||||||
|
if (m_children[n].m_properties[PROP_ID] == id)
|
||||||
|
{
|
||||||
|
m_children.erase(n);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
namespace GUIEngine
|
namespace GUIEngine
|
||||||
{
|
{
|
||||||
|
@ -377,6 +377,13 @@ namespace GUIEngine
|
|||||||
|
|
||||||
const ptr_vector<Widget>& getChildren() const { return m_children; }
|
const ptr_vector<Widget>& getChildren() const { return m_children; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief removes and deletes the child with the given PROP_ID
|
||||||
|
* \param id PROP_ID property of the child to remove
|
||||||
|
* \return whether deletion was successful
|
||||||
|
*/
|
||||||
|
bool deleteChild(const char* id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override in children to possibly receive updates (you may need to register to
|
* Override in children to possibly receive updates (you may need to register to
|
||||||
* them first)
|
* them first)
|
||||||
|
@ -30,8 +30,9 @@ using namespace irr::gui;
|
|||||||
// ------------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PressAKeyDialog::PressAKeyDialog(const float w, const float h) :
|
PressAKeyDialog::PressAKeyDialog(const float w, const float h) :
|
||||||
ModalDialog("press_a_key_dialog.stkgui", w, h)
|
ModalDialog(w, h)
|
||||||
{
|
{
|
||||||
|
loadFromFile("press_a_key_dialog.stkgui");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// SuperTuxKart - a fun racing game with go-kart
|
// SuperTuxKart - a fun racing game with go-kart
|
||||||
// Copyright (C) 2009 Marianne Gagnon
|
// Copyright (C) 2010 Marianne Gagnon
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License
|
// modify it under the terms of the GNU General Public License
|
||||||
@ -44,83 +44,12 @@ RacePausedDialog::RacePausedDialog(const float percentWidth,
|
|||||||
const float percentHeight) :
|
const float percentHeight) :
|
||||||
ModalDialog(percentWidth, percentHeight)
|
ModalDialog(percentWidth, percentHeight)
|
||||||
{
|
{
|
||||||
|
loadFromFile("race_paused_dialog.stkgui");
|
||||||
|
|
||||||
World::getWorld()->pause(WorldStatus::IN_GAME_MENU_PHASE);
|
World::getWorld()->pause(WorldStatus::IN_GAME_MENU_PHASE);
|
||||||
|
|
||||||
ScalableFont* font = GUIEngine::getTitleFont();
|
|
||||||
const int text_height = GUIEngine::getFontHeight();
|
|
||||||
|
|
||||||
IGUIFont* titlefont = GUIEngine::getTitleFont();
|
|
||||||
const int title_height = font->getDimension(L"X").Height;
|
|
||||||
|
|
||||||
|
|
||||||
const int icon_size = (m_area.getHeight() - text_height - 150) / 2;
|
|
||||||
|
|
||||||
// ---- Caption
|
|
||||||
core::rect< s32 > area(0, 0, m_area.getWidth(), title_height);
|
|
||||||
IGUIStaticText* caption =
|
|
||||||
GUIEngine::getGUIEnv()->addStaticText( _("Paused"),
|
|
||||||
area, /*border*/false,
|
|
||||||
/*word wrap*/ false,
|
|
||||||
m_irrlicht_window);
|
|
||||||
caption->setTabStop(false);
|
|
||||||
caption->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
|
||||||
caption->setOverrideFont(titlefont);
|
|
||||||
caption->setOverrideColor(video::SColor(255,255,255,255));
|
|
||||||
|
|
||||||
// ---- Back button
|
ButtonWidget* back_btn = (ButtonWidget*)Screen::getWidget("backbtn", &m_children);
|
||||||
IconButtonWidget* back_btn = new IconButtonWidget();
|
|
||||||
back_btn->m_properties[PROP_ID] = "backbtn";
|
|
||||||
back_btn->m_properties[PROP_ICON] = "gui/back.png";
|
|
||||||
//I18N: In the 'paused' screen
|
|
||||||
back_btn->m_text = _("Back to Race");
|
|
||||||
back_btn->m_x = m_area.getWidth() / 2 - icon_size;
|
|
||||||
back_btn->m_y = text_height*2;
|
|
||||||
back_btn->m_w = icon_size*2; // width larger to leave room for text
|
|
||||||
back_btn->m_h = icon_size;
|
|
||||||
back_btn->setParent(m_irrlicht_window);
|
|
||||||
m_children.push_back(back_btn);
|
|
||||||
back_btn->add();
|
|
||||||
|
|
||||||
back_btn->setFocusForPlayer( PLAYER_ID_GAME_MASTER );
|
back_btn->setFocusForPlayer( PLAYER_ID_GAME_MASTER );
|
||||||
|
|
||||||
// ---- Choice ribbon
|
|
||||||
m_choice_ribbon = new RibbonWidget(RIBBON_TOOLBAR);
|
|
||||||
m_choice_ribbon->m_properties[PROP_ID] = "choiceribbon";
|
|
||||||
|
|
||||||
m_choice_ribbon->m_x = 0;
|
|
||||||
m_choice_ribbon->m_y = text_height*2 + icon_size + 50;
|
|
||||||
m_choice_ribbon->m_w = m_area.getWidth();
|
|
||||||
m_choice_ribbon->m_h = icon_size + text_height;
|
|
||||||
m_choice_ribbon->setParent(m_irrlicht_window);
|
|
||||||
|
|
||||||
if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_SINGLE)
|
|
||||||
{
|
|
||||||
//I18N: In the 'paused' screen
|
|
||||||
m_choice_ribbon->addIconChild(_("Setup New Race"), "newrace",
|
|
||||||
128, 128, "gui/main_race.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_SINGLE)
|
|
||||||
{
|
|
||||||
//I18N: In the 'paused' screen
|
|
||||||
m_choice_ribbon->addIconChild(_("Restart Race"), "restart",
|
|
||||||
128, 128, "gui/restart.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
//I18N: In the 'paused' screen
|
|
||||||
m_choice_ribbon->addIconChild(_("Options"), "options",
|
|
||||||
128, 128, "gui/main_options.png");
|
|
||||||
|
|
||||||
//I18N: In the 'paused' screen
|
|
||||||
m_choice_ribbon->addIconChild(_("Help"), "help", 128, 128,
|
|
||||||
"gui/main_help.png");
|
|
||||||
|
|
||||||
//I18N: In the 'paused' screen
|
|
||||||
m_choice_ribbon->addIconChild(_("Exit Race"), "exit", 128, 128,
|
|
||||||
"gui/main_quit.png");
|
|
||||||
|
|
||||||
m_children.push_back(m_choice_ribbon);
|
|
||||||
m_choice_ribbon->add();
|
|
||||||
} // RacePausedDialog
|
} // RacePausedDialog
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -130,17 +59,43 @@ RacePausedDialog::~RacePausedDialog()
|
|||||||
} // ~RacePausedDialog
|
} // ~RacePausedDialog
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void RacePausedDialog::loadedFromFile()
|
||||||
|
{
|
||||||
|
printf("==== RacePausedDialog::loadedFromFile() ====\n");
|
||||||
|
|
||||||
|
// disable the "restart" button in GPs
|
||||||
|
if (race_manager->getMajorMode() != RaceManager::MAJOR_MODE_SINGLE)
|
||||||
|
{
|
||||||
|
printf("==== REMOVING restart button ====\n");
|
||||||
|
GUIEngine::RibbonWidget* choice_ribbon = (GUIEngine::RibbonWidget*)
|
||||||
|
Screen::getWidget("choiceribbon", &m_children);
|
||||||
|
|
||||||
|
|
||||||
|
const bool success = choice_ribbon->deleteChild("restart");
|
||||||
|
assert(success);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void RacePausedDialog::onEnterPressedInternal()
|
void RacePausedDialog::onEnterPressedInternal()
|
||||||
{
|
{
|
||||||
} // onEnterPressedInternal
|
} // onEnterPressedInternal
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
GUIEngine::EventPropagation
|
GUIEngine::EventPropagation
|
||||||
RacePausedDialog::processEvent(const std::string& eventSource)
|
RacePausedDialog::processEvent(const std::string& eventSource)
|
||||||
{
|
{
|
||||||
if(UserConfigParams::m_verbosity>=5)
|
GUIEngine::RibbonWidget* chocie_ribbon = (GUIEngine::RibbonWidget*)
|
||||||
|
Screen::getWidget("choiceribbon", &m_children);
|
||||||
|
|
||||||
|
if (UserConfigParams::m_verbosity>=5)
|
||||||
|
{
|
||||||
std::cout << "RacePausedDialog::processEvent("
|
std::cout << "RacePausedDialog::processEvent("
|
||||||
<< eventSource.c_str() << ")\n";
|
<< eventSource.c_str() << ")\n";
|
||||||
|
}
|
||||||
|
|
||||||
if (eventSource == "backbtn")
|
if (eventSource == "backbtn")
|
||||||
{
|
{
|
||||||
@ -151,7 +106,7 @@ GUIEngine::EventPropagation
|
|||||||
else if (eventSource == "choiceribbon")
|
else if (eventSource == "choiceribbon")
|
||||||
{
|
{
|
||||||
const std::string& selection =
|
const std::string& selection =
|
||||||
m_choice_ribbon->getSelectionIDString(PLAYER_ID_GAME_MASTER);
|
chocie_ribbon->getSelectionIDString(PLAYER_ID_GAME_MASTER);
|
||||||
|
|
||||||
if(UserConfigParams::m_verbosity>=5)
|
if(UserConfigParams::m_verbosity>=5)
|
||||||
std::cout << "RacePausedDialog::processEvent("
|
std::cout << "RacePausedDialog::processEvent("
|
||||||
|
@ -27,7 +27,11 @@ namespace GUIEngine
|
|||||||
|
|
||||||
class RacePausedDialog : public GUIEngine::ModalDialog
|
class RacePausedDialog : public GUIEngine::ModalDialog
|
||||||
{
|
{
|
||||||
GUIEngine::RibbonWidget* m_choice_ribbon;
|
//GUIEngine::RibbonWidget* m_choice_ribbon;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void loadedFromFile();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Creates a modal dialog with given percentage of screen width and height
|
* Creates a modal dialog with given percentage of screen width and height
|
||||||
|
@ -115,13 +115,13 @@ TYPE* remove(const int ID)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool contains( TYPE* instance ) const
|
bool contains( const TYPE* instance ) const
|
||||||
{
|
{
|
||||||
const unsigned int amount = contentsVector.size();
|
const unsigned int amount = contentsVector.size();
|
||||||
for(unsigned int n=0; n<amount; n++)
|
for (unsigned int n=0; n<amount; n++)
|
||||||
{
|
{
|
||||||
TYPE * pointer = contentsVector[n];
|
const TYPE * pointer = contentsVector[n];
|
||||||
if(pointer == instance) return true;
|
if (pointer == instance) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user