Changeset - r25048:6f455c5f92c6
[Not reviewed]
master
0 3 0
Patric Stout - 3 years ago 2021-03-13 11:26:06
truebrain@openttd.org
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.
3 files changed with 77 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/bootstrap_gui.cpp
Show inline comments
 
@@ -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. */
src/lang/english.txt
Show inline comments
 
@@ -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
src/widgets/bootstrap_widget.h
Show inline comments
 
@@ -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.
0 comments (0 inline, 0 general)