implement dynamic track listing (thanks to unitraxx for the help with the updating)
This commit is contained in:
parent
aab6a1fcb6
commit
0d959a72aa
@ -36,7 +36,6 @@
|
|||||||
#include "tracks/track_manager.hpp"
|
#include "tracks/track_manager.hpp"
|
||||||
#include "utils/translation.hpp"
|
#include "utils/translation.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <IGUIEnvironment.h>
|
#include <IGUIEnvironment.h>
|
||||||
#include <IGUIStaticText.h>
|
#include <IGUIStaticText.h>
|
||||||
|
|
||||||
@ -65,6 +64,7 @@ GPInfoDialog::GPInfoDialog(const std::string& gp_ident) :
|
|||||||
title->setTabStop(false);
|
title->setTabStop(false);
|
||||||
title->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
title->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
||||||
|
|
||||||
|
displayTracks(m_area.getHeight()/7, m_area.getHeight()*6/7);
|
||||||
InitAfterDrawingTheHeader(m_area.getHeight()/7, m_area.getHeight()*6/7, gp_ident);
|
InitAfterDrawingTheHeader(m_area.getHeight()/7, m_area.getHeight()*6/7, gp_ident);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,40 +82,85 @@ GPInfoDialog::~GPInfoDialog()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void GPInfoDialog::displayTracks(const int upper_bound,
|
||||||
|
const int lower_bound)
|
||||||
|
{
|
||||||
|
const std::vector<std::string> tracks = m_gp->getTrackNames();
|
||||||
|
const unsigned int track_amount = tracks.size();
|
||||||
|
|
||||||
|
int height_of_one_line = std::min((lower_bound - upper_bound)/(track_amount+1),
|
||||||
|
(unsigned int)(GUIEngine::getFontHeight()*1.5f));
|
||||||
|
|
||||||
|
// Count the number of label already existing labels representing a track
|
||||||
|
unsigned int existing = 0;
|
||||||
|
for (unsigned int i = 0; i < m_widgets.size(); i++)
|
||||||
|
{
|
||||||
|
if (m_widgets.get(i)->m_properties[PROP_ID] == "Track label")
|
||||||
|
existing++;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int reuse = std::min(existing, track_amount);
|
||||||
|
// m_widgets has the type PtrVector<Widget, HOLD>
|
||||||
|
unsigned int widgets_iter = 0;
|
||||||
|
for (unsigned int i = 0; i < reuse; i++)
|
||||||
|
{
|
||||||
|
Track* track = track_manager->getTrack(tracks[i]);
|
||||||
|
|
||||||
|
// Find the next widget that is a track label
|
||||||
|
while (m_widgets.get(widgets_iter)->m_properties[PROP_ID] != "Track label")
|
||||||
|
widgets_iter++;
|
||||||
|
|
||||||
|
LabelWidget* widget = dynamic_cast<LabelWidget*>(m_widgets.get(widgets_iter));
|
||||||
|
widget->setText(translations->fribidize(track->getName()), false);
|
||||||
|
widget->move(20, upper_bound + height_of_one_line*(i+1),
|
||||||
|
m_area.getWidth()/2 - 20, height_of_one_line);
|
||||||
|
|
||||||
|
widgets_iter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existing < track_amount)
|
||||||
|
{
|
||||||
|
// There are not enough labels for all the track names, so we have to
|
||||||
|
// add some more
|
||||||
|
for (unsigned int i = reuse; i < track_amount; i++)
|
||||||
|
{
|
||||||
|
Track* track = track_manager->getTrack(tracks[i]);
|
||||||
|
assert(track != NULL);
|
||||||
|
|
||||||
|
LabelWidget* widget = new LabelWidget();
|
||||||
|
widget->m_properties[PROP_ID] = "Track label";
|
||||||
|
widget->setText(translations->fribidize(track->getName()), false);
|
||||||
|
widget->setParent(m_irrlicht_window);
|
||||||
|
m_widgets.push_back(widget);
|
||||||
|
widget->add();
|
||||||
|
|
||||||
|
widget->move(20, upper_bound + height_of_one_line*(i+1),
|
||||||
|
m_area.getWidth()/2 - 20, height_of_one_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (existing > track_amount)
|
||||||
|
{
|
||||||
|
// There are label which are not necessary anymore so they're deleted
|
||||||
|
for (unsigned int i = widgets_iter; i < m_widgets.size(); i++)
|
||||||
|
{
|
||||||
|
if (m_widgets.get(i)->m_properties[PROP_ID] == "Track label")
|
||||||
|
{
|
||||||
|
m_irrlicht_window->removeChild(m_widgets.get(i)->getIrrlichtElement());
|
||||||
|
m_widgets.remove(i);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void GPInfoDialog::InitAfterDrawingTheHeader(const int upper_bound,
|
void GPInfoDialog::InitAfterDrawingTheHeader(const int upper_bound,
|
||||||
const int lower_bound,
|
const int lower_bound,
|
||||||
const std::string& gp_ident)
|
const std::string& gp_ident)
|
||||||
{
|
{
|
||||||
// ---- Track listings
|
|
||||||
const std::vector<std::string> tracks = m_gp->getTrackNames();
|
const std::vector<std::string> tracks = m_gp->getTrackNames();
|
||||||
const int trackAmount = tracks.size();
|
|
||||||
|
|
||||||
int height_of_one_line = (lower_bound - upper_bound)/(trackAmount+1);
|
|
||||||
const int textHeight = GUIEngine::getFontHeight();
|
|
||||||
if (height_of_one_line > (int)(textHeight*1.5f))
|
|
||||||
height_of_one_line = (int)(textHeight*1.5f);
|
|
||||||
|
|
||||||
bool gp_ok = true;
|
|
||||||
|
|
||||||
for (int t=0; t<trackAmount; t++)
|
|
||||||
{
|
|
||||||
Track* track = track_manager->getTrack(tracks[t]);
|
|
||||||
assert(track != NULL);
|
|
||||||
stringw lineText = track->getName();
|
|
||||||
|
|
||||||
LabelWidget* widget = new LabelWidget();
|
|
||||||
widget->setText(translations->fribidize(lineText), false);
|
|
||||||
widget->m_x = 20;
|
|
||||||
widget->m_y = upper_bound + height_of_one_line*(t+1);
|
|
||||||
widget->m_w = m_area.getWidth()/2 - 20;
|
|
||||||
widget->m_h = height_of_one_line;
|
|
||||||
widget->setParent(m_irrlicht_window);
|
|
||||||
|
|
||||||
m_widgets.push_back(widget);
|
|
||||||
widget->add();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---- Track screenshot
|
// ---- Track screenshot
|
||||||
m_screenshot_widget = new IconButtonWidget(IconButtonWidget::SCALE_MODE_KEEP_CUSTOM_ASPECT_RATIO,
|
m_screenshot_widget = new IconButtonWidget(IconButtonWidget::SCALE_MODE_KEEP_CUSTOM_ASPECT_RATIO,
|
||||||
@ -165,7 +210,7 @@ void GPInfoDialog::InitAfterDrawingTheHeader(const int upper_bound,
|
|||||||
okBtn->m_properties[PROP_ID] = "cannot_start";
|
okBtn->m_properties[PROP_ID] = "cannot_start";
|
||||||
okBtn->setText(_("Sorry, no tracks available"));
|
okBtn->setText(_("Sorry, no tracks available"));
|
||||||
}
|
}
|
||||||
else if (gp_ok)
|
else
|
||||||
{
|
{
|
||||||
okBtn->m_properties[PROP_ID] = "start";
|
okBtn->m_properties[PROP_ID] = "start";
|
||||||
okBtn->setText(_("Start Grand Prix"));
|
okBtn->setText(_("Start Grand Prix"));
|
||||||
@ -173,14 +218,8 @@ void GPInfoDialog::InitAfterDrawingTheHeader(const int upper_bound,
|
|||||||
continueBtn->m_properties[PROP_ID] = "continue";
|
continueBtn->m_properties[PROP_ID] = "continue";
|
||||||
continueBtn->setText(_("Continue"));
|
continueBtn->setText(_("Continue"));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
okBtn->m_properties[PROP_ID] = "cannot_start";
|
|
||||||
okBtn->setText(_("This Grand Prix is broken!"));
|
|
||||||
okBtn->setBadge(BAD_BADGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (saved_gp && gp_ok)
|
if (saved_gp)
|
||||||
{
|
{
|
||||||
continueBtn->m_x = m_area.getWidth()/2 + 110;
|
continueBtn->m_x = m_area.getWidth()/2 + 110;
|
||||||
continueBtn->m_y = lower_bound;
|
continueBtn->m_y = lower_bound;
|
||||||
|
@ -53,6 +53,13 @@ public:
|
|||||||
void InitAfterDrawingTheHeader(const int y1, const int y2,
|
void InitAfterDrawingTheHeader(const int y1, const int y2,
|
||||||
const std::string& gp_ident);
|
const std::string& gp_ident);
|
||||||
|
|
||||||
|
/** \brief display all the tracks according to the current gp
|
||||||
|
* For a normal gp info dialog, it just creates a label with the name for
|
||||||
|
* every track. But in a random gp info dialog, it tries to reuse as many
|
||||||
|
* labels as possible by just changing their labels. If there are less than
|
||||||
|
* need, some are added, if there are to many, some become deleted. */
|
||||||
|
void displayTracks(const int y1, const int y2);
|
||||||
|
|
||||||
void onEnterPressedInternal();
|
void onEnterPressedInternal();
|
||||||
GUIEngine::EventPropagation processEvent(const std::string& eventSource);
|
GUIEngine::EventPropagation processEvent(const std::string& eventSource);
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "guiengine/engine.hpp"
|
#include "guiengine/engine.hpp"
|
||||||
#include "guiengine/widgets/spinner_widget.hpp"
|
#include "guiengine/widgets/spinner_widget.hpp"
|
||||||
|
#include "guiengine/widget.hpp"
|
||||||
#include "race/grand_prix_manager.hpp"
|
#include "race/grand_prix_manager.hpp"
|
||||||
#include "states_screens/dialogs/random_gp_dialog.hpp"
|
#include "states_screens/dialogs/random_gp_dialog.hpp"
|
||||||
#include "tracks/track_manager.hpp"
|
#include "tracks/track_manager.hpp"
|
||||||
@ -53,30 +54,31 @@ randomGPInfoDialog::randomGPInfoDialog()
|
|||||||
title->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
title->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
||||||
|
|
||||||
// ---- Spinners
|
// ---- Spinners
|
||||||
// Number of laps chooser
|
|
||||||
GUIEngine::SpinnerWidget* spinner = new GUIEngine::SpinnerWidget(false);
|
|
||||||
spinner->setValue(m_number_of_tracks);
|
|
||||||
spinner->setMin(1);
|
|
||||||
spinner->setMax(track_manager->getTracksInGroup(m_trackgroup).size());
|
|
||||||
spinner->setParent(m_irrlicht_window);
|
|
||||||
spinner->m_properties[PROP_ID] = "Number of tracks";
|
|
||||||
m_widgets.push_back(spinner);
|
|
||||||
spinner->add();
|
|
||||||
spinner->move(10, m_area.getHeight()/7, 300, 40);
|
|
||||||
|
|
||||||
// Trackgroup chooser
|
// Trackgroup chooser
|
||||||
spinner = new GUIEngine::SpinnerWidget(false);
|
GUIEngine::SpinnerWidget* spinner = new GUIEngine::SpinnerWidget(false);
|
||||||
spinner->m_properties[PROP_ID] = "Trackgroup";
|
spinner->m_properties[PROP_ID] = "Trackgroup";
|
||||||
spinner->setParent(m_irrlicht_window);
|
spinner->setParent(m_irrlicht_window);
|
||||||
m_widgets.push_back(spinner);
|
m_widgets.push_back(spinner);
|
||||||
spinner->add();
|
spinner->add();
|
||||||
spinner->move(310, m_area.getHeight()/7, 300, 40);
|
spinner->move(10, m_area.getHeight()/7, 300, 40);
|
||||||
// Fill it with with all the track group names
|
// Fill it with with all the track group names
|
||||||
spinner->addLabel("all");
|
spinner->addLabel("all");
|
||||||
const std::vector<std::string>& groups = track_manager->getAllTrackGroups();
|
const std::vector<std::string>& groups = track_manager->getAllTrackGroups();
|
||||||
for (unsigned int i = 1; i < groups.size() + 1; i++)
|
for (unsigned int i = 1; i < groups.size() + 1; i++)
|
||||||
spinner->addLabel(stringw(groups[i].c_str()));
|
spinner->addLabel(stringw(groups[i].c_str()));
|
||||||
|
|
||||||
|
// Number of laps chooser
|
||||||
|
spinner = new GUIEngine::SpinnerWidget(false);
|
||||||
|
spinner->setValue(m_number_of_tracks);
|
||||||
|
spinner->setMin(1);
|
||||||
|
spinner->setMax(track_manager->getNumberOfTracks()); // default is "all"
|
||||||
|
spinner->setParent(m_irrlicht_window);
|
||||||
|
spinner->m_properties[PROP_ID] = "Number of tracks";
|
||||||
|
m_widgets.push_back(spinner);
|
||||||
|
spinner->add();
|
||||||
|
spinner->move(310, m_area.getHeight()/7, 200, 40);
|
||||||
|
|
||||||
|
displayTracks(m_area.getHeight()/7 + 50, m_area.getHeight()*6/7);
|
||||||
InitAfterDrawingTheHeader(m_area.getHeight()/7 + 50,
|
InitAfterDrawingTheHeader(m_area.getHeight()/7 + 50,
|
||||||
m_area.getHeight()*6/7,
|
m_area.getHeight()*6/7,
|
||||||
"random");
|
"random");
|
||||||
@ -85,7 +87,7 @@ randomGPInfoDialog::randomGPInfoDialog()
|
|||||||
GUIEngine::EventPropagation randomGPInfoDialog::processEvent(
|
GUIEngine::EventPropagation randomGPInfoDialog::processEvent(
|
||||||
const std::string& eventSource)
|
const std::string& eventSource)
|
||||||
{
|
{
|
||||||
if (eventSource == "Number of laps")
|
if (eventSource == "Number of tracks")
|
||||||
{
|
{
|
||||||
m_number_of_tracks = getWidget<GUIEngine::SpinnerWidget>("Number of tracks")->getValue();
|
m_number_of_tracks = getWidget<GUIEngine::SpinnerWidget>("Number of tracks")->getValue();
|
||||||
updateGP();
|
updateGP();
|
||||||
@ -94,7 +96,13 @@ GUIEngine::EventPropagation randomGPInfoDialog::processEvent(
|
|||||||
{
|
{
|
||||||
GUIEngine::SpinnerWidget* t = getWidget<GUIEngine::SpinnerWidget>("Trackgroup");
|
GUIEngine::SpinnerWidget* t = getWidget<GUIEngine::SpinnerWidget>("Trackgroup");
|
||||||
GUIEngine::SpinnerWidget* s = getWidget<GUIEngine::SpinnerWidget>("Number of tracks");
|
GUIEngine::SpinnerWidget* s = getWidget<GUIEngine::SpinnerWidget>("Number of tracks");
|
||||||
|
|
||||||
m_trackgroup = stringc(t->getStringValue()).c_str();
|
m_trackgroup = stringc(t->getStringValue()).c_str();
|
||||||
|
|
||||||
|
// Update the maximum for the number of tracks since it's depending on
|
||||||
|
// the current track. The current value in the Number-of-tracks-spinner
|
||||||
|
// has to be updated, since otherwise the displayed (and used) value
|
||||||
|
// can be bigger than the maximum. (Might be a TODO to fix this)
|
||||||
unsigned int max = (m_trackgroup == "all") ?
|
unsigned int max = (m_trackgroup == "all") ?
|
||||||
track_manager->getNumberOfTracks() :
|
track_manager->getNumberOfTracks() :
|
||||||
track_manager->getTracksInGroup(m_trackgroup).size();
|
track_manager->getTracksInGroup(m_trackgroup).size();
|
||||||
@ -115,5 +123,6 @@ void randomGPInfoDialog::updateGP()
|
|||||||
delete m_gp;
|
delete m_gp;
|
||||||
|
|
||||||
m_gp = new GrandPrixData(m_number_of_tracks, m_trackgroup, m_use_reverse);
|
m_gp = new GrandPrixData(m_number_of_tracks, m_trackgroup, m_use_reverse);
|
||||||
|
displayTracks(m_area.getHeight()/7, m_area.getHeight()*6/7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user