OpenTTD
bootstrap_gui.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 #include "base_media_base.h"
12 #include "blitter/factory.hpp"
13 
14 #if defined(WITH_FREETYPE)
15 
16 #include "core/geometry_func.hpp"
17 #include "fontcache.h"
18 #include "gfx_func.h"
19 #include "network/network.h"
21 #include "openttd.h"
22 #include "strings_func.h"
23 #include "video/video_driver.hpp"
24 #include "window_func.h"
25 
27 
28 #include "table/strings.h"
29 
30 #include "safeguards.h"
31 
33 static const struct NWidgetPart _background_widgets[] = {
34  NWidget(WWT_PANEL, COLOUR_DARK_BLUE, WID_BB_BACKGROUND), SetResize(1, 1),
35 };
36 
41  WDP_MANUAL, nullptr, 0, 0,
43  0,
44  _background_widgets, lengthof(_background_widgets)
45 );
46 
48 class BootstrapBackground : public Window {
49 public:
50  BootstrapBackground() : Window(&_background_desc)
51  {
52  this->InitNested(0);
54  ResizeWindow(this, _screen.width, _screen.height);
55  }
56 
57  void DrawWidget(const Rect &r, int widget) const override
58  {
59  GfxFillRect(r.left, r.top, r.right, r.bottom, 4, FILLRECT_OPAQUE);
60  GfxFillRect(r.left, r.top, r.right, r.bottom, 0, FILLRECT_CHECKER);
61  }
62 };
63 
66  NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
67  NWidget(WWT_PANEL, COLOUR_GREY, WID_NCDS_BACKGROUND),
69  EndContainer(),
70 };
71 
74  WDP_CENTER, nullptr, 0, 0,
76  WDF_MODAL,
77  _nested_boostrap_download_status_window_widgets, lengthof(_nested_boostrap_download_status_window_widgets)
78 );
79 
80 
83 public:
86  {
87  }
88 
89  void OnDownloadComplete(ContentID cid) override
90  {
91  /* We have completed downloading. We can trigger finding the right set now. */
93 
94  /* And continue going into the menu. */
95  _game_mode = GM_MENU;
96 
97  /* _exit_game is used to break out of the outer video driver's MainLoop. */
98  _exit_game = true;
99  delete this;
100  }
101 };
102 
106  NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_MISSING_GRAPHICS_SET_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
107  EndContainer(),
108  NWidget(WWT_PANEL, COLOUR_GREY),
111  NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BAFD_YES), SetDataTip(STR_MISSING_GRAPHICS_YES_DOWNLOAD, STR_NULL),
112  NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BAFD_NO), SetDataTip(STR_MISSING_GRAPHICS_NO_QUIT, STR_NULL),
113  EndContainer(),
114  EndContainer(),
115 };
116 
119  WDP_CENTER, nullptr, 0, 0,
121  0,
122  _bootstrap_query_widgets, lengthof(_bootstrap_query_widgets)
123 );
124 
128 
129 public:
131  BootstrapAskForDownloadWindow() : Window(&_bootstrap_query_desc)
132  {
135  }
136 
139  {
141  }
142 
143  void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
144  {
145  /* We cache the button size. This is safe as no reinit can happen here. */
146  if (this->button_size.width == 0) {
147  this->button_size = maxdim(GetStringBoundingBox(STR_MISSING_GRAPHICS_YES_DOWNLOAD), GetStringBoundingBox(STR_MISSING_GRAPHICS_NO_QUIT));
148  this->button_size.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT;
149  this->button_size.height += WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM;
150  }
151 
152  switch (widget) {
153  case WID_BAFD_QUESTION:
154  /* The question is twice as wide as the buttons, and determine the height based on the width. */
155  size->width = this->button_size.width * 2;
156  size->height = GetStringHeight(STR_MISSING_GRAPHICS_SET_MESSAGE, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT) + WD_FRAMETEXT_BOTTOM + WD_FRAMETEXT_TOP;
157  break;
158 
159  case WID_BAFD_YES:
160  case WID_BAFD_NO:
161  *size = this->button_size;
162  break;
163  }
164  }
165 
166  void DrawWidget(const Rect &r, int widget) const override
167  {
168  if (widget != 0) return;
169 
170  DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMETEXT_BOTTOM, STR_MISSING_GRAPHICS_SET_MESSAGE, TC_FROMSTRING, SA_CENTER);
171  }
172 
173  void OnClick(Point pt, int widget, int click_count) override
174  {
175  switch (widget) {
176  case WID_BAFD_YES:
177  /* We got permission to connect! Yay! */
179  break;
180 
181  case WID_BAFD_NO:
182  _exit_game = true;
183  break;
184 
185  default:
186  break;
187  }
188  }
189 
190  void OnConnect(bool success) override
191  {
192  /* Once connected, request the metadata. */
194  }
195 
196  void OnReceiveContentInfo(const ContentInfo *ci) override
197  {
198  /* And once the meta data is received, start downloading it. */
201  delete this;
202  }
203 };
204 
205 #endif /* defined(WITH_FREETYPE) */
206 
214 {
215  if (BaseGraphics::GetUsedSet() != nullptr) return true;
216 
217  /* No user interface, bail out with an error. */
218  if (BlitterFactory::GetCurrentBlitter()->GetScreenDepth() == 0) goto failure;
219 
220  /* If there is no network or no freetype, then there is nothing we can do. Go straight to failure. */
221 #if defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(_WIN32) || defined(__APPLE__))
222  if (!_network_available) goto failure;
223 
224  /* First tell the game we're bootstrapping. */
225  _game_mode = GM_BOOTSTRAP;
226 
227  /* Initialise the freetype font code. */
229  /* Next "force" finding a suitable freetype font as the local font is missing. */
230  CheckForMissingGlyphs(false);
231 
232  /* Initialise the palette. The biggest step is 'faking' some recolour sprites.
233  * This way the mauve and gray colours work and we can show the user interface. */
234  GfxInitPalettes();
235  static const int offsets[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0, 0, 0x04, 0x08 };
236  for (uint i = 0; i != 16; i++) {
237  for (int j = 0; j < 8; j++) {
238  _colour_gradient[i][j] = offsets[i] + j;
239  }
240  }
241 
242  /* Finally ask the question. */
243  new BootstrapBackground();
245 
246  /* Process the user events. */
248 
249  /* _exit_game is used to get out of the video driver's main loop.
250  * In case GM_BOOTSTRAP is still set we did not exit it via the
251  * "download complete" event, so it was a manual exit. Obey it. */
252  _exit_game = _game_mode == GM_BOOTSTRAP;
253  if (_exit_game) return false;
254 
255  /* Try to probe the graphics. Should work this time. */
256  if (!BaseGraphics::SetSet(nullptr)) goto failure;
257 
258  /* Finally we can continue heading for the menu. */
259  _game_mode = GM_MENU;
260  return true;
261 #endif
262 
263  /* Failure to get enough working to get a graphics set. */
264 failure:
265  usererror("Failed to find a graphics set. Please acquire a graphics set for OpenTTD. See section 4.1 of README.md.");
266  return false;
267 }
Functions related to OTTD&#39;s strings.
The content consists of base graphics.
Definition: tcp_content.h:23
void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher)
Check whether the currently loaded language pack uses characters that the currently loaded font does ...
Definition: strings.cpp:2097
Base of all video drivers.
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
ResizeInfo resize
Resize information.
Definition: window_gui.h:322
static NWidgetPart SetResize(int16 dx, int16 dy)
Widget part function for setting the resize step.
Definition: widget_type.h:928
Window(WindowDesc *desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition: window.cpp:1867
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen...
Definition: gfx.cpp:110
bool HandleBootstrap()
Handle all procedures for bootstrapping OpenTTD without a base graphics set.
High level window description.
Definition: window_gui.h:166
Bootstrap; Window numbers:
Definition: window_type.h:637
WindowFlags flags
Window flags.
Definition: window_gui.h:310
static uint FindSets()
Do the scan for files.
Offset at top to draw the frame rectangular area.
Definition: window_gui.h:62
Horizontal container.
Definition: widget_type.h:73
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
Definition: gfx.cpp:52
Callbacks for notifying others about incoming data.
void Connect()
Connect with the content server.
BootstrapAskForDownloadWindow()
Start listening to the content client events.
Generic functions for replacing base data (graphics, sounds).
BootstrapContentDownloadStatusWindow()
Simple call the constructor of the superclass.
static const NWidgetPart _bootstrap_query_widgets[]
The widgets for the query.
int GetStringHeight(const char *str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Definition: gfx.cpp:547
static NWidgetPart SetMinimalTextLines(uint8 lines, uint8 spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
Definition: widget_type.h:963
Dimension button_size
The dimension of the button.
Background of the window.
#define CLRBITS(x, y)
Clears several bits in a variable.
static bool SetSet(const char *name)
Set the set to be used.
ContentID
Unique identifier for the content.
Definition: tcp_content.h:49
static void InitializeUnicodeGlyphMap()
Initialize the glyph map.
Definition: fontcache.h:179
The window for the query.
The question whether to download.
bool _network_available
is network mode available?
Definition: network.cpp:54
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:908
Data structure for an opened window.
Definition: window_gui.h:276
void OnDownloadComplete(ContentID cid) override
We have finished downloading a file.
The background for the game.
Functions to read fonts from files and cache them.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1857
Bottom offset of the text of the frame.
Definition: window_gui.h:73
void AddCallback(ContentCallback *cb)
Add a callback to this class.
Invisible widget that takes some space.
Definition: widget_type.h:77
Fill rectangle with a single colour.
Definition: gfx_type.h:282
static NWidgetPart SetDataTip(uint32 data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1012
Functions related to the gfx engine.
static WindowDesc _background_desc(WDP_MANUAL, nullptr, 0, 0, WC_BOOTSTRAP, WC_NONE, 0, _background_widgets, lengthof(_background_widgets))
Window description for the background window to prevent smearing.
static NWidgetPart SetMinimalSize(int16 x, int16 y)
Widget part function for setting the minimal size.
Definition: widget_type.h:945
Definition of base types and functions in a cross-platform compatible way.
Center both horizontally and vertically.
Definition: gfx_func.h:104
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
static WindowDesc _bootstrap_download_status_window_desc(WDP_CENTER, nullptr, 0, 0, WC_NETWORK_STATUS_WINDOW, WC_NONE, WDF_MODAL, _nested_boostrap_download_status_window_widgets, lengthof(_nested_boostrap_download_status_window_widgets))
Window description for the download window.
void CDECL usererror(const char *s,...)
Error handling for fatal user errors.
Definition: openttd.cpp:92
A number of safeguards to prevent using unsafe methods.
ContentID id
Unique (server side) ID for the content.
Definition: tcp_content.h:66
Normal push-button (no toggle button) with text caption.
Definition: widget_type.h:102
Geometry functions.
Query popup confirm for bootstrap.
Definition: window_type.h:25
Simple depressed panel.
Definition: widget_type.h:48
void RequestContentList(ContentType type)
Request the content list for the given type.
Background of the window.
Center the window.
Definition: window_gui.h:155
static NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx=-1)
Widget part function for starting a new &#39;real&#39; widget.
Definition: widget_type.h:1112
Offset at bottom to draw the frame rectangular area.
Definition: window_gui.h:63
Types related to the bootstrap widgets.
Some generic types.
Basic functions/variables used all over the place.
Right offset of the text of the frame.
Definition: window_gui.h:71
#define lengthof(x)
Return the length of an fixed size array.
Definition: depend.cpp:40
static Blitter * GetCurrentBlitter()
Get the current active blitter (always set by calling SelectBlitter).
Definition: factory.hpp:145
Top offset of the text of the frame.
Definition: window_gui.h:72
Left offset of the text of the frame.
Definition: window_gui.h:70
static const NWidgetPart _nested_boostrap_download_status_window_widgets[]
Nested widgets for the download window.
The window is a modal child of some other window, meaning the parent is &#39;inactive&#39;.
Definition: window_gui.h:209
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition: gfx.cpp:700
Network status window; Window numbers:
Definition: window_type.h:485
An affirmative answer to the question.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Draw only every second pixel, used for greying-out.
Definition: gfx_type.h:283
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:38
void Select(ContentID cid)
Select a specific content id.
User interface for downloading files.
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:59
void RemoveCallback(ContentCallback *cb)
Remove a callback.
void OnConnect(bool success) override
Callback for when the connection has finished.
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
static NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME, WWT_INSET, or WWT_PANEL).
Definition: widget_type.h:997
virtual void MainLoop()=0
Perform the actual drawing.
Window for showing the download status of content.
Coordinates of a point in 2D.
static WindowDesc _bootstrap_query_desc(WDP_CENTER, nullptr, 0, 0, WC_CONFIRM_POPUP_QUERY, WC_NONE, 0, _bootstrap_query_widgets, lengthof(_bootstrap_query_widgets))
The window description for the query.
An negative answer to the question.
Popup with confirm question; Window numbers:
Definition: window_type.h:123
~BootstrapAskForDownloadWindow()
Stop listening to the content client events.
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
Specification of a rectangle with absolute coordinates of all edges.
Window functions not directly related to making/drawing windows.
Base window for showing the download status of content.
Manually align the window (so no automatic location finding)
Definition: window_gui.h:153
static const struct NWidgetPart _background_widgets[]
Widgets for the background window to prevent smearing.
void OnReceiveContentInfo(const ContentInfo *ci) override
We received a content info.
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen)
Resize the window.
Definition: window.cpp:2142
Window white border counter bit mask.
Definition: window_gui.h:240
Dimensions (a width and height) of a rectangle in 2D.
Container for all important information about a piece of content.
Definition: tcp_content.h:54
Factory to &#39;query&#39; all available blitters.
static const GraphicsSet * GetUsedSet()
Return the used set.
ClientNetworkContentSocketHandler _network_content_client
The client we use to connect to the server.
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition: gfx.cpp:621