Apply patch by Marc Coll to have better progress reports during long GPs, thanks!

This commit is contained in:
Marianne Gagnon 2014-03-26 20:14:29 -04:00
parent 1740407e1e
commit 348a20288f
4 changed files with 207 additions and 71 deletions

BIN
data/gui/scroll_down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
data/gui/scroll_up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -30,6 +30,7 @@
#include "guiengine/scalable_font.hpp"
#include "guiengine/widget.hpp"
#include "guiengine/widgets/icon_button_widget.hpp"
#include "guiengine/widgets/label_widget.hpp"
#include "io/file_manager.hpp"
#include "karts/abstract_kart.hpp"
#include "karts/controller/controller.hpp"
@ -81,6 +82,38 @@ void RaceResultGUI::init()
music_manager->stopMusic();
m_finish_sound = sfx_manager->quickSound("race_finish");
// Calculate how many track screenshots can fit into the "result-table" widget
GUIEngine::Widget* result_table = getWidget("result-table");
assert(result_table != NULL);
m_sshot_height = (int)(UserConfigParams::m_height*0.1275);
m_max_tracks = std::max (1, ((result_table->m_h - getFontHeight () * 5) /
(m_sshot_height + SSHOT_SEPARATION))); //Show at least one
// Calculate screenshot scrolling parameters
const std::vector<std::string>& tracks =
race_manager->getGrandPrix()->getTrackNames();
int currentTrack = race_manager->getTrackNumber();
m_start_track = currentTrack;
m_end_track = tracks.size();
if (m_end_track > m_max_tracks)
{
if (currentTrack == 0)
{
m_start_track = 0;
m_end_track = m_max_tracks;
}
else if (currentTrack + m_max_tracks - 1 > (int)tracks.size())
{
m_start_track = (tracks.size() - m_max_tracks);
m_end_track = tracks.size();
}
else
{
m_start_track = currentTrack - 1;
m_end_track = currentTrack + m_max_tracks - 1;
}
}
} // init
//-----------------------------------------------------------------------------
@ -183,6 +216,20 @@ void RaceResultGUI::enableAllButtons()
void RaceResultGUI::eventCallback(GUIEngine::Widget* widget,
const std::string& name, const int playerID)
{
int n_tracks = race_manager->getGrandPrix()->getNumberOfTracks();
if (name == "up_button" && n_tracks > m_max_tracks && m_start_track > 0)
{
m_start_track--;
m_end_track--;
displayScreenShots();
}
else if (name == "down_button" && n_tracks > m_max_tracks &&
m_start_track < (n_tracks - m_max_tracks))
{
m_start_track++;
m_end_track++;
displayScreenShots();
}
// If something was unlocked, the 'continue' button was
// actually used to display "Show unlocked feature(s)" text.
@ -462,7 +509,7 @@ void RaceResultGUI::determineTableLayout()
? 27
: (int)(40*(table_area->m_w/800.0f));
m_width_column_space = 20;
m_width_column_space = 10;
// Determine width of new points column
@ -489,8 +536,6 @@ void RaceResultGUI::determineTableLayout()
+ 2 * m_width_column_space;
m_leftmost_column = table_area->m_x;
m_gp_progress_x = (int)(UserConfigParams::m_width*0.65);
} // determineTableLayout
//-----------------------------------------------------------------------------
@ -1045,83 +1090,127 @@ void RaceResultGUI::enableGPProgress()
{
if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)
{
const std::vector<std::string>& tracks =
race_manager->getGrandPrix()->getTrackNames();
size_t currentTrack = race_manager->getTrackNumber();
GUIEngine::Widget* result_table = getWidget("result-table");
assert(result_table != NULL);
// Assume 5 is the max amount we can render in any given height
size_t startTrack = 0;
size_t endTrack = tracks.size();
if (tracks.size() > 5)
{
if (currentTrack == 0)
{
startTrack = 0;
endTrack = 5;
}
else if (currentTrack + 4 > tracks.size())
{
startTrack = tracks.size() - 5;
endTrack = tracks.size();
}
else {
startTrack = currentTrack - 1;
endTrack = currentTrack + 4;
}
}
int currentTrack = race_manager->getTrackNumber();
int font_height = getFontHeight ();
int w = (int)(UserConfigParams::m_width*0.17);
int x = (int)(result_table->m_x + result_table->m_w - w - 15);
int y = (m_top + font_height + 5);
for(size_t i=startTrack; i<endTrack; i++)
//Current progress
GUIEngine::LabelWidget* status_label = new GUIEngine::LabelWidget();
status_label->m_properties[GUIEngine::PROP_ID] = "status_label";
status_label->m_properties[GUIEngine::PROP_TEXT_ALIGN] = "center";
status_label->m_x = x;
status_label->m_y = y;
status_label->m_w = w;
status_label->m_h = font_height;
status_label->add();
status_label->setText(_("Track %i/%i", currentTrack + 1,
race_manager->getGrandPrix()->getNumberOfTracks()), true);
addGPProgressWidget(status_label);
y = (status_label->m_y + status_label->m_h + 5);
//Scroll up button
GUIEngine::IconButtonWidget* up_button = new GUIEngine::IconButtonWidget(
GUIEngine::IconButtonWidget::SCALE_MODE_KEEP_CUSTOM_ASPECT_RATIO,
false, false, GUIEngine::IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE);
up_button->m_properties[GUIEngine::PROP_ID] = "up_button";
up_button->m_x = x;
up_button->m_y = y;
up_button->m_w = w;
up_button->m_h = font_height;
up_button->add();
up_button->setImage(file_manager->getAsset(FileManager::GUI,"scroll_up.png"));
addGPProgressWidget(up_button);
y = (up_button->m_y + up_button->m_h + SSHOT_SEPARATION);
//Track screenshots and labels
int n_sshot = 1;
for(int i=m_start_track; i<m_end_track; i++)
{
Track* track = track_manager->getTrack(tracks[i]);
GUIEngine::IconButtonWidget* m_screenshot_widget =
new GUIEngine::IconButtonWidget(GUIEngine::IconButtonWidget::
//Screenshot
GUIEngine::IconButtonWidget* screenshot_widget =
new GUIEngine::IconButtonWidget(
GUIEngine::IconButtonWidget::
SCALE_MODE_KEEP_CUSTOM_ASPECT_RATIO,
false, false,
GUIEngine::IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE);
m_screenshot_widget->setCustomAspectRatio(4.0f / 3.0f);
m_screenshot_widget->m_x = (int)(UserConfigParams::m_width*0.67);
m_screenshot_widget->m_y =
(int)(UserConfigParams::m_height
* (0.10+(i-startTrack)*0.135));
m_screenshot_widget->m_w = (int)(UserConfigParams::m_width*0.17);
m_screenshot_widget->m_h =
(int)(UserConfigParams::m_height*0.1275);
screenshot_widget->setCustomAspectRatio(4.0f / 3.0f);
screenshot_widget->m_x = x;
screenshot_widget->m_y = y;
screenshot_widget->m_w = w;
screenshot_widget->m_h = m_sshot_height;
screenshot_widget->m_properties[GUIEngine::PROP_ID] =
("sshot_" + StringUtils::toString(n_sshot));
screenshot_widget->add();
addGPProgressWidget(screenshot_widget);
m_screenshot_widget->m_properties[GUIEngine::PROP_ICON] =
(track ? track->getScreenshotFile()
: file_manager->getAsset(FileManager::GUI,"main_help.png"));
m_screenshot_widget->m_properties[GUIEngine::PROP_ID] = tracks[i];
//Label
GUIEngine::LabelWidget* sshot_label = new GUIEngine::LabelWidget();
sshot_label->m_properties[GUIEngine::PROP_ID] =
("sshot_label_" + StringUtils::toString(n_sshot));
sshot_label->m_properties[GUIEngine::PROP_TEXT_ALIGN] = "left";
sshot_label->m_x = (x + w + 5);
sshot_label->m_y = (y + (m_sshot_height / 2) - (font_height / 2));
sshot_label->m_w = (w / 2);
sshot_label->m_h = font_height;
sshot_label->add();
addGPProgressWidget(sshot_label);
if(i <= currentTrack)
m_screenshot_widget->setBadge(GUIEngine::OK_BADGE);
m_screenshot_widget->add();
m_widgets.push_back(m_screenshot_widget);
y += (m_sshot_height + SSHOT_SEPARATION);
n_sshot++;
} // for
displayScreenShots();
//Scroll down button
GUIEngine::IconButtonWidget* down_button = new GUIEngine::IconButtonWidget(
GUIEngine::IconButtonWidget::SCALE_MODE_KEEP_CUSTOM_ASPECT_RATIO,
false, false, GUIEngine::IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE);
down_button->m_properties[GUIEngine::PROP_ID] = "down_button";
down_button->m_x = x;
down_button->m_y = y;
down_button->m_w = w;
down_button->m_h = font_height;
down_button->add();
down_button->setImage(file_manager->getAsset(FileManager::GUI,"scroll_down.png"));
addGPProgressWidget(down_button);
} // if MAJOR_MODE_GRAND_PRIX)
} // enableGPProgress
// ----------------------------------------------------------------------------
void RaceResultGUI::addGPProgressWidget(GUIEngine::Widget* widget)
{
m_widgets.push_back(widget);
m_gp_progress_widgets.push_back(widget);
}
// ----------------------------------------------------------------------------
void RaceResultGUI::displayGPProgress()
{
video::SColor color = video::SColor(255,255,0,0);
core::recti dest_rect(m_gp_progress_x, m_top, 0, 0);
const wchar_t* msg = _("Grand Prix progress:");
m_font->draw(_("Grand Prix progress:"), dest_rect, color, false, false, NULL, true);
GUIEngine::Widget* result_table = getWidget("result-table");
assert(result_table != NULL);
video::SColor color = video::SColor(255,255,0,0);
core::recti dest_rect(
result_table->m_x + result_table->m_w - m_font->getDimension(msg).Width - 5,
m_top, 0, 0);
m_font->draw(msg, dest_rect, color, false, false, NULL, true);
} // displayGPProgress
// ----------------------------------------------------------------------------
void RaceResultGUI::cleanupGPProgress()
{
const std::vector<std::string>& tracks =
race_manager->getGrandPrix()->getTrackNames();
for(size_t i=0; i<tracks.size(); i++)
{
GUIEngine::Widget *trackWidget = getWidget(tracks[i].c_str());
m_widgets.remove(trackWidget);
delete trackWidget;
}
for (size_t i = 0; i < m_gp_progress_widgets.size(); i++)
m_widgets.remove(m_gp_progress_widgets.get(i));
m_gp_progress_widgets.clearAndDeleteAll();
} // cleanupGPProgress
// ----------------------------------------------------------------------------
@ -1137,7 +1226,7 @@ void RaceResultGUI::displayHighScores()
{
video::SColor white_color = video::SColor(255,255,255,255);
int x = (int)(UserConfigParams::m_width*0.55f);
int x = (int)(UserConfigParams::m_width*0.65f);
int y = m_top;
// First draw title
@ -1210,3 +1299,39 @@ void RaceResultGUI::displayHighScores()
}
}
}
// ----------------------------------------------------------------------------
void RaceResultGUI::displayScreenShots()
{
const std::vector<std::string>& tracks =
race_manager->getGrandPrix()->getTrackNames();
int currentTrack = race_manager->getTrackNumber();
int n_sshot = 1;
for(int i = m_start_track; i < m_end_track; i++)
{
Track* track = track_manager->getTrack(tracks[i]);
GUIEngine::IconButtonWidget* sshot = getWidget<GUIEngine::IconButtonWidget>(
("sshot_" + StringUtils::toString(n_sshot)).c_str());
GUIEngine::LabelWidget* label = getWidget<GUIEngine::LabelWidget>(
("sshot_label_" + StringUtils::toString(n_sshot)).c_str());
assert(track != NULL && sshot != NULL && label != NULL);
sshot->setImage(track->getScreenshotFile());
if (i <= currentTrack)
sshot->setBadge(GUIEngine::OK_BADGE);
else
sshot->resetAllBadges();
label->setText(StringUtils::toWString(i + 1), true);
n_sshot++;
}
}
// ----------------------------------------------------------------------------
int RaceResultGUI::getFontHeight () const
{
assert(m_font != NULL);
return m_font->getDimension(L"A").Height; //Could be any capital letter
}

View File

@ -158,9 +158,6 @@ private:
/** The overall width of the table. */
unsigned int m_table_width;
/** GP Progress text */
unsigned int m_gp_progress_x;
/** The font to use. */
gui::ScalableFont *m_font;
@ -187,16 +184,30 @@ private:
unsigned int m_width_all_points;
int m_max_tracks;
int m_start_track;
int m_end_track;
int m_sshot_height;
PtrVector<GUIEngine::Widget, HOLD> m_gp_progress_widgets;
static const int SSHOT_SEPARATION = 10;
void displayOneEntry(unsigned int x, unsigned int y,
unsigned int n, bool display_points);
void determineTableLayout();
void determineGPLayout();
void enableAllButtons();
void enableGPProgress();
void addGPProgressWidget(GUIEngine::Widget* widget);
void displayGPProgress();
void cleanupGPProgress();
void displayHighScores();
void displaySoccerResults();
void displayScreenShots();
int getFontHeight () const;
public:
RaceResultGUI();