# HG changeset patch # User Patric Stout # Date 2021-03-13 11:26:06 # Node ID 6f455c5f92c6da79c064c407c021267636c2555f # Parent a8e131d1e25b80a3e797b10ae5a729e137251f1b Fix: if bootstrap failed, it could end with an empty screen instead of error There are various of ways bootstrap can fail: - Failing network connection - Incomplete download - No write permissions - Disk full - (others I forgot) They all result in a screen with no windows. To ensure we at least always show something when anything bad happens, if the bootstrap is not successful, show a screen what the next step for the human should be. diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -14,6 +14,7 @@ #if defined(WITH_FREETYPE) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA) #include "core/geometry_func.hpp" +#include "error.h" #include "fontcache.h" #include "gfx_func.h" #include "network/network.h" @@ -61,6 +62,63 @@ public: } }; +/** Nested widgets for the error window. */ +static const NWidgetPart _nested_bootstrap_errmsg_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CAPTION, COLOUR_GREY, WID_BEM_CAPTION), SetDataTip(STR_MISSING_GRAPHICS_ERROR_TITLE, STR_NULL), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BEM_MESSAGE), EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BEM_QUIT), SetDataTip(STR_MISSING_GRAPHICS_ERROR_QUIT, STR_NULL), SetFill(1, 0), + EndContainer(), + EndContainer(), +}; + +/** Window description for the error window. */ +static WindowDesc _bootstrap_errmsg_desc( + WDP_CENTER, nullptr, 0, 0, + WC_BOOTSTRAP, WC_NONE, + WDF_MODAL, + _nested_bootstrap_errmsg_widgets, lengthof(_nested_bootstrap_errmsg_widgets) +); + +/** The window for a failed bootstrap. */ +class BootstrapErrorWindow : public Window { +public: + BootstrapErrorWindow() : Window(&_bootstrap_errmsg_desc) + { + this->InitNested(1); + } + + ~BootstrapErrorWindow() + { + _exit_game = true; + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget == WID_BEM_MESSAGE) { + *size = GetStringBoundingBox(STR_MISSING_GRAPHICS_ERROR); + size->height = GetStringHeight(STR_MISSING_GRAPHICS_ERROR, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT) + WD_FRAMETEXT_BOTTOM + WD_FRAMETEXT_TOP; + } + } + + void DrawWidget(const Rect &r, int widget) const override + { + if (widget == WID_BEM_MESSAGE) { + DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMETEXT_BOTTOM, STR_MISSING_GRAPHICS_ERROR, TC_FROMSTRING, SA_CENTER); + } + } + + void OnClick(Point pt, int widget, int click_count) override + { + if (widget == WID_BEM_QUIT) { + _exit_game = true; + } + } +}; + /** Nested widgets for the download window. */ static const NWidgetPart _nested_boostrap_download_status_window_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -86,6 +144,14 @@ public: { } + ~BootstrapContentDownloadStatusWindow() + { + /* If we are not set to exit the game, it means the bootstrap failed. */ + if (!_exit_game) { + new BootstrapErrorWindow(); + } + } + void OnDownloadComplete(ContentID cid) override { /* We have completed downloading. We can trigger finding the right set now. */ diff --git a/src/lang/english.txt b/src/lang/english.txt --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2339,6 +2339,10 @@ STR_MISSING_GRAPHICS_SET_MESSAGE STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Yes, download the graphics STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, exit OpenTTD +STR_MISSING_GRAPHICS_ERROR_TITLE :{WHITE}Downloading failed +STR_MISSING_GRAPHICS_ERROR :{BLACK}Downloading graphics failed.{}Please download graphics manually. +STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Exit OpenTTD + # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Transparency Options STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Toggle transparency for signs. Ctrl+Click to lock diff --git a/src/widgets/bootstrap_widget.h b/src/widgets/bootstrap_widget.h --- a/src/widgets/bootstrap_widget.h +++ b/src/widgets/bootstrap_widget.h @@ -15,6 +15,13 @@ enum BootstrapBackgroundWidgets { WID_BB_BACKGROUND, ///< Background of the window. }; +/** Widgets of the #BootstrapErrmsgWindow class. */ +enum BootstrapErrorMessageWidgets { + WID_BEM_CAPTION, ///< Caption of the window. + WID_BEM_MESSAGE, ///< Error message. + WID_BEM_QUIT, ///< Quit button. +}; + /** Widgets of the #BootstrapContentDownloadStatusWindow class. */ enum BootstrapAskForDownloadWidgets { WID_BAFD_QUESTION, ///< The question whether to download.