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:
parent
5eb4aaf4ef
commit
ddc2a3dab2
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user