summaryrefslogtreecommitdiff
path: root/src/bootstrap_gui.cpp
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-03-13 12:26:06 +0100
committerPatric Stout <github@truebrain.nl>2021-03-14 11:04:14 +0100
commit22a9d921efa80f09b31afd860dae7ccd569cebf8 (patch)
tree49a773ca2e910848e7c4021cc327a2c1c07bc37f /src/bootstrap_gui.cpp
parent13011e00c6330e6d745f319766574d2cd78a1162 (diff)
downloadopenttd-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.
Diffstat (limited to 'src/bootstrap_gui.cpp')
-rw-r--r--src/bootstrap_gui.cpp66
1 files changed, 66 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. */