diff --git a/src/gui/dialogs/game_load.cpp b/src/gui/dialogs/game_load.cpp index de8194a30ca3..236ad8755de3 100644 --- a/src/gui/dialogs/game_load.cpp +++ b/src/gui/dialogs/game_load.cpp @@ -45,6 +45,12 @@ #include #include "utils/functional.hpp" +static lg::log_domain log_gameloaddlg{"gui/dialogs/game_load_dialog"}; +#define ERR_GAMELOADDLG LOG_STREAM(err, log_gameloaddlg) +#define WRN_GAMELOADDLG LOG_STREAM(warn, log_gameloaddlg) +#define LOG_GAMELOADDLG LOG_STREAM(info, log_gameloaddlg) +#define DBG_GAMELOADDLG LOG_STREAM(debug, log_gameloaddlg) + namespace gui2 { namespace dialogs @@ -153,7 +159,7 @@ void game_load::pre_show(window& window) display_savegame(window); } -void game_load::display_savegame(window& window) +void game_load::display_savegame_internal(window& window) { const int selected_row = find_widget(&window, "savegame_list", false).get_selected_row(); @@ -247,6 +253,36 @@ void game_load::display_savegame(window& window) change_difficulty_toggle.set_active(!is_replay && is_scenario_start); } +// This is a wrapper that prevents a corrupted save file (if it happens to be +// the first in the list) from making the dialog fail to open. +void game_load::display_savegame(window& window) +{ + try { + game_load::display_savegame_internal(window); + } catch(const config::error& e) { + // Clear the UI widgets, show an error message. + const std::string preamble = _("The selected file is corrupt: "); + const std::string message = e.message.empty() ? "(no details)" : e.message; + ERR_GAMELOADDLG << preamble << message << "\n"; + find_widget(&window, "minimap", false).set_map_data(""); + find_widget