Display all votes in the RHS of tracks screen

This commit is contained in:
Benau 2018-03-19 15:08:38 +08:00
parent ee64a22349
commit cfd1de43bb
7 changed files with 102 additions and 15 deletions

View File

@ -2,7 +2,7 @@
<stkgui>
<icon-button id="back" x="0" y="0" height="8%" icon="gui/back.png"/>
<div x="1%" y="1%" width="98%" height="96%" layout="vertical-row" >
<div id="all-track" x="1%" y="1%" width="60%" height="96%" layout="vertical-row" >
<header width="80%" I18N="In the track selection screen" text="All Tracks"
align="center" text_align="center" />
@ -38,4 +38,11 @@
</div>
</box>
</div>
<div id="vote" x="63%" y="1%" width="37%" height="96%" layout="vertical-row">
<div width="95%" proportion="2" layout="horizontal-row">
<box proportion="2" height="100%" layout="vertical-row">
<label id="vote-text" word_wrap="true" id="text" proportion="3" width="100%" height="100%" text_valign="top"/>
</box>
</div>
</div>
</stkgui>

View File

@ -101,7 +101,7 @@ private:
public:
TextMessage(MessageQueue::MessageType mt, const core::stringw &message) :
Message(mt == MessageQueue::MT_NETWORK_MSG ? 1.0f : 5.0f)
Message(5.0f)
{
m_message_type = mt;
m_message = message;
@ -111,8 +111,7 @@ public:
m_render_type = "achievement-message::neutral";
else if (mt == MessageQueue::MT_ERROR)
m_render_type = "error-message::neutral";
else if (mt == MessageQueue::MT_GENERIC ||
mt == MessageQueue::MT_NETWORK_MSG)
else if (mt == MessageQueue::MT_GENERIC)
m_render_type = "generic-message::neutral";
else
m_render_type = "friend-message::neutral";

View File

@ -40,7 +40,6 @@ namespace MessageQueue
MT_ACHIEVEMENT,
MT_ERROR,
MT_GENERIC,
MT_NETWORK_MSG,
MT_PROGRESS
};

View File

@ -39,6 +39,7 @@
#include "states_screens/network_kart_selection.hpp"
#include "states_screens/race_result_gui.hpp"
#include "states_screens/state_manager.hpp"
#include "states_screens/tracks_screen.hpp"
#include "tracks/track.hpp"
#include "tracks/track_manager.hpp"
#include "utils/log.hpp"
@ -296,6 +297,7 @@ void ClientLobby::update(float dt)
{
// In case the user opened a user info dialog
GUIEngine::ModalDialog::dismiss();
TracksScreen::getInstance()->resetVote();
NetworkKartSelectionScreen* screen =
NetworkKartSelectionScreen::getInstance();
screen->setAvailableKartsFromServer(m_available_karts);
@ -325,9 +327,12 @@ void ClientLobby::displayPlayerVote(Event* event)
{
if (!checkDataSize(event, 4)) return;
// Get the player name who voted
core::stringw player_name;
NetworkString& data = event->data();
data.decodeStringW(&player_name);
float timeout = data.getFloat();
TracksScreen::getInstance()->setVoteTimeout(timeout);
std::string player_name;
data.decodeString(&player_name);
uint32_t host_id = data.getUInt32();
player_name += ": ";
std::string track_name;
data.decodeString(&track_name);
@ -337,14 +342,14 @@ void ClientLobby::displayPlayerVote(Event* event)
core::stringw track_readable = track->getName();
int lap = data.getUInt8();
int rev = data.getUInt8();
int t = data.getUInt8();
core::stringw yes = _("Yes");
core::stringw no = _("No");
//I18N: Vote message in network game from a player
core::stringw vote_msg = _("Track: %s, laps: %d, reversed: %s, "
"remaining time: %ds", track_readable, lap, rev == 1 ? yes : no, t);
vote_msg = player_name + vote_msg;
MessageQueue::add(MessageQueue::MT_NETWORK_MSG, vote_msg);
core::stringw vote_msg = _("Track: %s,\nlaps: %d, reversed: %s",
track_readable, lap, rev == 1 ? yes : no);
vote_msg = StringUtils::utf8ToWide(player_name) + vote_msg;
TracksScreen::getInstance()->addVoteMessage(player_name +
StringUtils::toString(host_id), vote_msg);
} // displayPlayerVote
//-----------------------------------------------------------------------------

View File

@ -1052,8 +1052,10 @@ void ServerLobby::playerVote(Event* event)
NetworkString& data = event->data();
NetworkString other = NetworkString(PROTOCOL_LOBBY_ROOM);
other.addUInt8(LE_VOTE).encodeString(event->getPeer()
std::string name = StringUtils::wideToUtf8(event->getPeer()
->getPlayerProfiles()[0]->getName());
other.addUInt8(LE_VOTE).addFloat(m_timeout).encodeString(name)
.addUInt32(event->getPeer()->getHostId());
other += data;
std::string track_name;
@ -1062,7 +1064,6 @@ void ServerLobby::playerVote(Event* event)
uint8_t reverse = data.getUInt8();
m_peers_votes[event->getPeerSP()] =
std::make_tuple(track_name, lap, reverse == 1);
other.addUInt8((uint8_t)remaining_time);
sendMessageToPeersChangingToken(&other);
} // playerVote

View File

@ -21,6 +21,7 @@
#include "config/player_manager.hpp"
#include "config/user_config.hpp"
#include "graphics/stk_tex_manager.hpp"
#include "guiengine/scalable_font.hpp"
#include "guiengine/widget.hpp"
#include "guiengine/widgets/check_box_widget.hpp"
#include "guiengine/widgets/dynamic_ribbon_widget.hpp"
@ -139,6 +140,7 @@ bool TracksScreen::onEscapePressed()
void TracksScreen::tearDown()
{
m_network_tracks = false;
m_vote_timeout = -1.0f;
} // tearDown
// -----------------------------------------------------------------------------
@ -146,6 +148,7 @@ void TracksScreen::loadedFromFile()
{
m_reversed = NULL;
m_laps = NULL;
m_votes = NULL;
} // loadedFromFile
// -----------------------------------------------------------------------------
@ -158,6 +161,7 @@ void TracksScreen::beforeAddingWidget()
if (m_bottom_box_height == -1)
m_bottom_box_height = rect_box->m_h;
m_votes = getWidget<LabelWidget>("vote-text");
if (m_network_tracks)
{
rect_box->setVisible(true);
@ -174,6 +178,9 @@ void TracksScreen::beforeAddingWidget()
m_reversed = getWidget<CheckBoxWidget>("reverse");
assert(m_reversed != NULL);
m_reversed->m_properties[GUIEngine::PROP_ALIGN] = "center";
getWidget("all-track")->m_properties[GUIEngine::PROP_WIDTH] = "60%";
getWidget("vote")->setVisible(true);
m_votes->setVisible(true);
calculateLayout();
}
else
@ -186,9 +193,11 @@ void TracksScreen::beforeAddingWidget()
getWidget("lap-spinner")->setVisible(false);
getWidget("reverse-text")->setVisible(false);
getWidget("reverse")->setVisible(false);
getWidget("all-track")->m_properties[GUIEngine::PROP_WIDTH] = "98%";
getWidget("vote")->setVisible(false);
m_votes->setVisible(false);
calculateLayout();
}
RibbonWidget* tabs = getWidget<RibbonWidget>("trackgroups");
tabs->clearAllChildren();
@ -346,3 +355,33 @@ void TracksScreen::setFocusOnTrack(const std::string& trackName)
// so it's safe to use 'PLAYER_ID_GAME_MASTER'
tracks_widget->setSelection(trackName, PLAYER_ID_GAME_MASTER, true);
} // setFocusOnTrack
// -----------------------------------------------------------------------------
void TracksScreen::onUpdate(float dt)
{
if (m_vote_timeout == -1.0f)
{
return;
}
assert(m_votes);
m_votes->setVisible(true);
int remaining_time = int(m_vote_timeout - float(StkTime::getRealTime()));
if (remaining_time < 0)
remaining_time = 0;
//I18N: In tracks screen, about voting of tracks in network
core::stringw message = _("Remaining time: %d\n", remaining_time);
unsigned height = GUIEngine::getFont()->getDimension(L"X").Height;
const unsigned total_height = m_votes->getDimension().Height;
m_vote_messages.lock();
for (auto& p : m_vote_messages.getData())
{
height += GUIEngine::getFont()->getDimension(L"X").Height * 2;
if (height > total_height)
break;
message += p.second;
message += L"\n";
}
m_vote_messages.unlock();
m_votes->setText(message, true);
} // onUpdate

View File

@ -19,11 +19,15 @@
#define HEADER_TRACKS_SCREEN_HPP
#include "guiengine/screen.hpp"
#include "utils/synchronised.hpp"
#include <deque>
#include <map>
#include <string>
namespace GUIEngine
{
class CheckBoxWidget;
class LabelWidget;
class SpinnerWidget;
}
@ -45,10 +49,16 @@ private:
GUIEngine::CheckBoxWidget* m_reversed;
GUIEngine::SpinnerWidget* m_laps;
GUIEngine::LabelWidget* m_votes;
bool m_network_tracks, m_reverse_checked;
int m_bottom_box_height = -1;
float m_vote_timeout = -1.0f;
Synchronised<std::map<std::string, core::stringw> > m_vote_messages;
/** adds the tracks from the current track group into the tracks ribbon */
void buildTrackList();
@ -76,9 +86,36 @@ public:
/** \brief implement callback from parent class GUIEngine::Screen */
virtual bool onEscapePressed() OVERRIDE;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void onUpdate(float dt) OVERRIDE;
void setFocusOnTrack(const std::string& trackName);
void setNetworkTracks() { m_network_tracks = true; }
void resetVote()
{
m_vote_messages.lock();
m_vote_messages.getData().clear();
m_vote_messages.unlock();
m_vote_timeout = -1.0f;
}
void setVoteTimeout(float timeout)
{
if (m_vote_timeout != -1.0f)
return;
m_vote_timeout = timeout;
}
void addVoteMessage(const std::string& user,
const irr::core::stringw& message)
{
m_vote_messages.lock();
m_vote_messages.getData()[user] = message;
m_vote_messages.unlock();
}
};
#endif