From ef315635be7184a5f390f34abcac294d63921269 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Tue, 6 Oct 2020 13:30:18 +1100 Subject: [PATCH] Tweaks and improvements --- src/about.cpp | 9 ++++++++- src/about.hpp | 12 ++++++------ src/gui/dialogs/outro.cpp | 19 ++++++++++++------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/about.cpp b/src/about.cpp index e611c6c41a58..0e855912ede1 100644 --- a/src/about.cpp +++ b/src/about.cpp @@ -15,6 +15,7 @@ #include "about.hpp" #include "config.hpp" +#include "font/pango/escape.hpp" #include "game_config_view.hpp" #include "gettext.hpp" #include "serialization/string_utils.hpp" @@ -81,7 +82,7 @@ credits_group::about_group::about_group(const config& cfg) names.reserve(cfg.child_count("entry")); for(const config& entry : cfg.child_range("entry")) { - names.emplace_back(entry["name"].str(), entry["comment"].str()); + names.emplace_back(font::escape_text(entry["name"].str()), font::escape_text(entry["comment"].str())); } } @@ -95,6 +96,12 @@ const credits_data& get_credits_data() return parsed_credits_data; } +credits_data::const_iterator get_campaign_credits(const std::string& campaign) +{ + return std::find_if(parsed_credits_data.begin(), parsed_credits_data.end(), + [&campaign](const credits_group& group) { return group.id == campaign; }); +} + std::vector get_background_images(const std::string& campaign) { if(!campaign.empty() && !images_campaigns[campaign].empty()) { diff --git a/src/about.hpp b/src/about.hpp index 07131a10f4c1..ea670d4ba4ec 100644 --- a/src/about.hpp +++ b/src/about.hpp @@ -53,16 +53,16 @@ struct credits_group using credits_data = std::vector; -/** - * General getter methods for the credits config and image lists by campaign id - */ +/** Gets all credits data. */ const credits_data& get_credits_data(); +/** Gets credits for a given campaign. */ +credits_data::const_iterator get_campaign_credits(const std::string& campaign); + +/** Gets credit background images for a given campaaign. */ std::vector get_background_images(const std::string& campaign); -/** - * Regenerates the credits config - */ +/** Regenerates the credits data. */ void set_about(const game_config_view& cfg); } // namespace about diff --git a/src/gui/dialogs/outro.cpp b/src/gui/dialogs/outro.cpp index 5cbcc34c8221..7e89f92b5b63 100644 --- a/src/gui/dialogs/outro.cpp +++ b/src/gui/dialogs/outro.cpp @@ -50,13 +50,14 @@ outro::outro(const game_classification& info) // We only show the end text and the title if credits were turned off if(info.end_credits) { - const auto& credits = about::get_credits_data(); - const auto campaign_credits = std::find_if(credits.begin(), credits.end(), - [&info](const about::credits_group& group) { return group.id == info.campaign; }); + for(const auto& about : about::get_campaign_credits(info.campaign)->sections) { + if(about.names.empty()) { + continue; + } - for(const about::credits_group::about_group& about : campaign_credits->sections) { // Split the names into chunks of 5 static const unsigned chunk_size = 5; + const unsigned num_names = about.names.size(); const unsigned num_chunks = std::max(1, std::ceil(num_names / chunk_size)); @@ -65,14 +66,18 @@ outro::outro(const game_classification& info) // Only include section title on first chunk if(i == 0) { - ss << about.title << "\n"; + ss << about.title << "\n\n"; } for(std::size_t k = i * chunk_size; k < std::min((i + 1) * chunk_size, num_names); ++k) { - ss << "\n" << about.names[k].first << ""; + ss << "" << about.names[k].first << "\n"; } - text_.push_back(ss.str()); + // Clean up the trailing newline + std::string section_text = ss.str(); + section_text.pop_back(); + + text_.push_back(std::move(section_text)); } } }