diff options
author | Patric Stout <truebrain@openttd.org> | 2021-03-13 12:26:06 +0100 |
---|---|---|
committer | Patric Stout <github@truebrain.nl> | 2021-03-14 11:04:14 +0100 |
commit | 22a9d921efa80f09b31afd860dae7ccd569cebf8 (patch) | |
tree | 49a773ca2e910848e7c4021cc327a2c1c07bc37f | |
parent | 13011e00c6330e6d745f319766574d2cd78a1162 (diff) | |
download | openttd-22a9d921efa80f09b31afd860dae7ccd569cebf8.tar.xz |
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.
-rw-r--r-- | src/bootstrap_gui.cpp | 66 | ||||
-rw-r--r-- | src/lang/english.txt | 4 | ||||
-rw-r--r-- | src/widgets/bootstrap_widget.h | 7 |
3 files changed, 77 insertions, 0 deletions
diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index 7ec391b47..ff5cb0a7c 100644 --- 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 index d4cf1e22e..1837e143e 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2339,6 +2339,10 @@ STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD 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 index 4870f62d5..16a36cc5b 100644 --- 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. |