mirror of https://github.com/OpenTTD/OpenTTD
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.pull/8862/head
parent
13011e00c6
commit
22a9d921ef
|
@ -14,6 +14,7 @@
|
||||||
#if defined(WITH_FREETYPE) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA)
|
#if defined(WITH_FREETYPE) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA)
|
||||||
|
|
||||||
#include "core/geometry_func.hpp"
|
#include "core/geometry_func.hpp"
|
||||||
|
#include "error.h"
|
||||||
#include "fontcache.h"
|
#include "fontcache.h"
|
||||||
#include "gfx_func.h"
|
#include "gfx_func.h"
|
||||||
#include "network/network.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. */
|
/** Nested widgets for the download window. */
|
||||||
static const NWidgetPart _nested_boostrap_download_status_window_widgets[] = {
|
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),
|
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
|
void OnDownloadComplete(ContentID cid) override
|
||||||
{
|
{
|
||||||
/* We have completed downloading. We can trigger finding the right set now. */
|
/* We have completed downloading. We can trigger finding the right set now. */
|
||||||
|
|
|
@ -2339,6 +2339,10 @@ STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD
|
||||||
STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Yes, download the graphics
|
STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Yes, download the graphics
|
||||||
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, exit OpenTTD
|
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
|
# Transparency settings window
|
||||||
STR_TRANSPARENCY_CAPTION :{WHITE}Transparency Options
|
STR_TRANSPARENCY_CAPTION :{WHITE}Transparency Options
|
||||||
STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Toggle transparency for signs. Ctrl+Click to lock
|
STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Toggle transparency for signs. Ctrl+Click to lock
|
||||||
|
|
|
@ -15,6 +15,13 @@ enum BootstrapBackgroundWidgets {
|
||||||
WID_BB_BACKGROUND, ///< Background of the window.
|
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. */
|
/** Widgets of the #BootstrapContentDownloadStatusWindow class. */
|
||||||
enum BootstrapAskForDownloadWidgets {
|
enum BootstrapAskForDownloadWidgets {
|
||||||
WID_BAFD_QUESTION, ///< The question whether to download.
|
WID_BAFD_QUESTION, ///< The question whether to download.
|
||||||
|
|
Loading…
Reference in New Issue