diff --git a/src/config/player_profile.cpp b/src/config/player_profile.cpp
index f84382bbb8b..d0f4a2240c8 100644
--- a/src/config/player_profile.cpp
+++ b/src/config/player_profile.cpp
@@ -144,7 +144,7 @@ void PlayerProfile::loadRemainingData(const XMLNode *node)
// Fix up any potentially missing icons.
addIcon();
-} // initRemainingData
+} // loadRemainingData
//------------------------------------------------------------------------------
/** Initialises the story- and achievement data structure in case of the first
@@ -158,6 +158,10 @@ void PlayerProfile::initRemainingData()
addIcon();
} // initRemainingData
+//------------------------------------------------------------------------------
+/** Update the group of favorite tracks handled by the Track Manager.
+ * To be used only if this player profile is the current player.
+ */
void PlayerProfile::setFavoriteTracks()
{
// Update the group data from the Track Manager
@@ -168,6 +172,38 @@ void PlayerProfile::setFavoriteTracks()
}
} // setFavoriteTracks
+//------------------------------------------------------------------------------
+/** Adds a new favorite track to this player profile and to the group
+ * of favorite tracks of the Track Manager.
+ * To be used only if this player profile is the current player.
+ */
+void PlayerProfile::addFavoriteTrack(std::string ident)
+{
+ m_favorite_tracks.push_back(ident);
+ printf("Ident %s added to favorite tracks.\n", ident.c_str());
+ track_manager->addFavoriteTrack(ident);
+} // addFavoriteTrack
+
+//------------------------------------------------------------------------------
+/** Removes a favorite track from this player profile and from the group
+ * of favorite tracks of the Track Manager.
+ * To be used only if this player profile is the current player.
+ */
+void PlayerProfile::removeFavoriteTrack(std::string ident)
+{
+ auto it = std::find(m_favorite_tracks.begin(), m_favorite_tracks.end(), ident);
+ if (it != m_favorite_tracks.end()) // the track to remove has been found
+ {
+ m_favorite_tracks.erase(it);
+ printf("Ident %s removed from favorite tracks.\n", ident.c_str());
+ setFavoriteTracks();
+ }
+ else
+ {
+ printf("Favorite track to remove not found.\n");
+ }
+} // removeFavoriteTrack
+
//------------------------------------------------------------------------------
/** Creates an icon for a player if non exist so far. It takes the unique
* player id modulo the number of karts to pick an icon from the karts. It
@@ -230,8 +266,6 @@ const std::string PlayerProfile::getIconFilename() const
*/
void PlayerProfile::save(UTFWriter &out)
{
- //m_favorite_tracks.push_back("cornfield_crossing");
-
out << " setTrack(track);
- TrackInfoScreen::getInstance()->push();
+ // In favorite edit mode, switch the status of the selected track
+ if (getWidget("favorite")->getState())
+ {
+ if(track->isInGroup("Favorites"))
+ PlayerManager::getCurrentPlayer()->removeFavoriteTrack(track->getIdent());
+ else
+ PlayerManager::getCurrentPlayer()->addFavoriteTrack(track->getIdent());
+ }
+ else // Normal mode
+ {
+ TrackInfoScreen::getInstance()->setTrack(track);
+ TrackInfoScreen::getInstance()->push();
+ }
} // if clicked_track
} // name=="tracks"
@@ -132,6 +144,7 @@ void TracksAndGPScreen::eventCallback(Widget* widget, const std::string& name,
{
StateManager::get()->escapePressed();
}
+ // The favorite track checkbox does not need any specific additional handling
} // eventCallback
// -----------------------------------------------------------------------------
@@ -142,6 +155,10 @@ void TracksAndGPScreen::beforeAddingWidget()
RibbonWidget* tabs = getWidget("trackgroups");
tabs->clearAllChildren();
+ CheckBoxWidget* favorite_cb = getWidget("favorite");
+ assert( favorite_cb != NULL );
+ favorite_cb->setState(false);
+
const std::vector& groups = track_manager->getAllTrackGroups();
const int group_amount = (int)groups.size();