May now confirm kart selection by pressing fire on player name (in case someone selects a kart first, their identity second, this is more natural)

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@6192 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2010-10-02 00:39:24 +00:00
parent 5eb4aaf4ef
commit ddc2a3dab2
5 changed files with 122 additions and 65 deletions

View File

@ -508,9 +508,12 @@ EventPropagation EventHandler::onWidgetActivated(GUIEngine::Widget* w, const int
}
}
else
{
if (w->transmitEvent(w, w->m_properties[PROP_ID], playerID) == EVENT_LET)
{
sendEventToUser(w, w->m_properties[PROP_ID], playerID);
}
}
return EVENT_BLOCK;
}

View File

@ -34,6 +34,8 @@ SpinnerWidget::SpinnerWidget(const bool gauge) : Widget(WTYPE_SPINNER)
{
m_gauge = gauge;
m_listener = NULL;
m_check_inside_me = true; //FIXME: not sure this is necessary
m_supports_multiplayer = true;
@ -135,6 +137,7 @@ void SpinnerWidget::add()
m_children[1].m_element = subbtn;
m_children[1].m_id = subbtn->getID();
m_children[1].m_event_handler = this;
m_children[1].m_properties[PROP_ID] = "spinnerbody";
subbtn->setUseAlphaChannel(true);
subbtn->setImage(texture);
@ -149,6 +152,7 @@ void SpinnerWidget::add()
m_children[1].m_element = label;
m_children[1].m_event_handler = this;
m_children[1].m_id = label->getID();
m_children[1].m_properties[PROP_ID] = "spinnerbody";
label->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
label->setTabStop(false);
label->setNotClipped(true);
@ -261,8 +265,22 @@ EventPropagation SpinnerWidget::transmitEvent(Widget* w, std::string& originator
// if widget is deactivated, do nothing
if (m_deactivated) return EVENT_BLOCK;
if (originator == "left") leftPressed(playerID);
else if (originator == "right") rightPressed(playerID);
if (originator == "left")
{
leftPressed(playerID);
}
else if (originator == "right")
{
rightPressed(playerID);
}
else if (originator == "spinnerbody" || originator == m_properties[PROP_ID])
{
if (m_listener != NULL)
{
m_listener->onSpinnerConfirmed();
}
}
this->setFocusForPlayer( playerID );
return EVENT_LET;

View File

@ -27,11 +27,26 @@
namespace GUIEngine
{
/** \brief A spinner or gauge widget (to select numbers / percentages).
* \ingroup widgets
*/
class SpinnerWidget : public Widget
{
public:
class ISpinnerConfirmListener
{
public:
virtual ~ISpinnerConfirmListener() {}
/** \brief Invoked when the spinner is selected and "fire" is pressed */
virtual void onSpinnerConfirmed() = 0;
};
protected:
ISpinnerConfirmListener* m_listener;
int m_value, m_min, m_max;
/** If each value the spinner can take has an associated text, this vector will be non-empty */
@ -78,6 +93,7 @@ namespace GUIEngine
void addLabel(irr::core::stringw label);
void clearLabels();
void setListener(ISpinnerConfirmListener* listener) { m_listener = listener; }
/** \brief implement method from base class Widget */
virtual void add();

View File

@ -173,7 +173,7 @@ public:
// -----------------------------------------------------------------------------
/** A widget representing the kart selection for a player (i.e. the player's number, name, the kart view, the kart's name) */
class PlayerKartWidget : public Widget
class PlayerKartWidget : public Widget, public SpinnerWidget::ISpinnerConfirmListener
{
/** Whether this player confirmed their selection */
bool m_ready;
@ -364,7 +364,10 @@ public:
m_player_ID_label->getIrrlichtElement()->remove();
if (m_player_ident_spinner != NULL && m_player_ident_spinner->getIrrlichtElement() != NULL)
{
m_player_ident_spinner->setListener(NULL);
m_player_ident_spinner->getIrrlichtElement()->remove();
}
if (m_model_view->getIrrlichtElement() != NULL)
m_model_view->getIrrlichtElement()->remove();
@ -446,6 +449,7 @@ public:
m_player_ident_spinner->add();
m_player_ident_spinner->getIrrlichtElement()->setTabStop(false);
m_player_ident_spinner->setListener(this);
m_model_view->add();
m_kart_name->add();
@ -699,6 +703,15 @@ public:
assert(m_magic_number == 0x33445566);
return m_kartInternalName;
}
// -------------------------------------------------------------------------
/** \brief Event callback from ISpinnerConfirmListener */
virtual void onSpinnerConfirmed()
{
printf("onSpinnerConfirmed\n");
KartSelectionScreen::getInstance()->playerConfirm(m_playerID);
}
};
/** Small utility function that returns whether the two given players chose the same kart.
@ -1187,62 +1200,7 @@ void KartSelectionScreen::onUpdate(float delta, irr::video::IVideoDriver*)
}
}
// -----------------------------------------------------------------------------
/**
* Callback handling events from the kart selection menu
*/
void KartSelectionScreen::eventCallback(Widget* widget, const std::string& name, const int playerID)
{
if (name == "kartgroups" && !m_player_confirmed) // don't allow changing group after someone confirmed
{
RibbonWidget* tabs = getWidget<RibbonWidget>("kartgroups");
assert(tabs != NULL);
DynamicRibbonWidget* w = getWidget<DynamicRibbonWidget>("karts");
assert(w != NULL);
setKartsFromCurrentGroup();
const std::string selected_kart_group = tabs->getSelectionIDString(PLAYER_ID_GAME_MASTER);
RandomGenerator random;
// update players selections (FIXME: don't hardcode player 0 below)
const int num_players = m_kart_widgets.size();
for (int n=0; n<num_players; n++)
{
// player 0 is the one that can change the groups, leave his focus on the tabs
// for others, remove focus from kart that might no more exist in this tab.
if (n > 0) GUIEngine::focusNothingForPlayer(n);
// try to preserve the same kart for each player (except for player 0, since it's the one
// that can change the groups, so focus for player 0 must remain on the tabs)
const std::string& selected_kart = m_kart_widgets[n].getKartInternalName();
if (!w->setSelection( selected_kart, n, n>0 ))
{
// if we get here, it means one player "lost" his kart in the tab switch
std::cout << "Player " << n << " lost their selection when switching tabs!!!\n";
// Select a random kart in this case
const int count = w->getItems().size();
if (count > 0)
{
// FIXME: two players may be given the same kart by the use of random
const int randomID = random.get( count );
// select kart for players > 0 (player 0 is the one that can change the groups,
// so focus for player 0 must remain on the tabs)
const bool success = w->setSelection( randomID, n, n>0 );
if (!success) std::cerr << " WARNING: setting kart of player " << n << " failed :(\n";
}
else
{
std::cerr << "WARNING : kart selection screen has 0 items in the ribbon\n";
}
}
} // end for
}
else if (name == "karts")
void KartSelectionScreen::playerConfirm(const int playerID)
{
DynamicRibbonWidget* w = getWidget<DynamicRibbonWidget>("karts");
assert(w != NULL);
@ -1304,6 +1262,66 @@ void KartSelectionScreen::eventCallback(Widget* widget, const std::string& name,
if (allPlayersReady) allPlayersDone();
}
// -----------------------------------------------------------------------------
/**
* Callback handling events from the kart selection menu
*/
void KartSelectionScreen::eventCallback(Widget* widget, const std::string& name, const int playerID)
{
if (name == "kartgroups" && !m_player_confirmed) // don't allow changing group after someone confirmed
{
RibbonWidget* tabs = getWidget<RibbonWidget>("kartgroups");
assert(tabs != NULL);
DynamicRibbonWidget* w = getWidget<DynamicRibbonWidget>("karts");
assert(w != NULL);
setKartsFromCurrentGroup();
const std::string selected_kart_group = tabs->getSelectionIDString(PLAYER_ID_GAME_MASTER);
RandomGenerator random;
// update players selections (FIXME: don't hardcode player 0 below)
const int num_players = m_kart_widgets.size();
for (int n=0; n<num_players; n++)
{
// player 0 is the one that can change the groups, leave his focus on the tabs
// for others, remove focus from kart that might no more exist in this tab.
if (n > 0) GUIEngine::focusNothingForPlayer(n);
// try to preserve the same kart for each player (except for player 0, since it's the one
// that can change the groups, so focus for player 0 must remain on the tabs)
const std::string& selected_kart = m_kart_widgets[n].getKartInternalName();
if (!w->setSelection( selected_kart, n, n>0 ))
{
// if we get here, it means one player "lost" his kart in the tab switch
std::cout << "Player " << n << " lost their selection when switching tabs!!!\n";
// Select a random kart in this case
const int count = w->getItems().size();
if (count > 0)
{
// FIXME: two players may be given the same kart by the use of random
const int randomID = random.get( count );
// select kart for players > 0 (player 0 is the one that can change the groups,
// so focus for player 0 must remain on the tabs)
const bool success = w->setSelection( randomID, n, n>0 );
if (!success) std::cerr << " WARNING: setting kart of player " << n << " failed :(\n";
}
else
{
std::cerr << "WARNING : kart selection screen has 0 items in the ribbon\n";
}
}
} // end for
}
else if (name == "karts")
{
playerConfirm(playerID);
}
else
{
// Transmit to all subwindows, maybe *they* care about this event

View File

@ -75,6 +75,8 @@ class KartSelectionScreen : public GUIEngine::Screen, public GUIEngine::ScreenSi
/** Fill the ribbon with the karts from the currently selected group */
void setKartsFromCurrentGroup();
void playerConfirm(const int playerID);
public:
/** \brief implement callback from parent class GUIEngine::Screen */