Go to the documentation of this file.
20 #include "table/strings.h"
22 #if defined(WITH_ZLIB)
26 #if defined(WITH_LIBLZMA)
63 this->CreateNestedTree();
66 this->FinishInitNested(file_type);
67 this->GetWidget<NWidgetCore>(
WID_TF_CAPTION)->SetDataTip(STR_TEXTFILE_README_CAPTION + file_type, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
69 this->hscroll->SetStepSize(10);
72 TextfileWindow::~TextfileWindow()
85 for (
auto &line : this->
lines) {
92 for (
auto &line : this->
lines) {
102 uint TextfileWindow::GetContentHeight()
104 if (this->
lines.size() == 0)
return 0;
105 return this->
lines.back().bottom;
115 size->width = std::max(200u, size->width);
164 for (
auto &line : this->
lines) {
165 if (line.bottom < pos)
continue;
166 if (line.top > pos + cap)
break;
168 int y_offset = (line.top - pos) * line_height;
189 if (!gui_scope)
return;
218 #if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA)
224 #if defined(WITH_ZLIB)
240 static void Gunzip(
byte **bufp,
size_t *sizep)
242 static const int BLOCKSIZE = 8192;
244 size_t alloc_size = 0;
248 memset(&z, 0,
sizeof(z));
250 z.avail_in = (uInt)*sizep;
253 res = inflateInit2(&z, 15 + 32);
255 while (res == Z_OK || (res == Z_BUF_ERROR && z.avail_out == 0)) {
258 alloc_size += BLOCKSIZE;
259 z.avail_out += BLOCKSIZE;
261 z.next_out = buf + alloc_size - z.avail_out;
262 res = inflate(&z, Z_FINISH);
268 if (res == Z_STREAM_END) {
270 *sizep = alloc_size - z.avail_out;
280 #if defined(WITH_LIBLZMA)
296 static void Xunzip(
byte **bufp,
size_t *sizep)
298 static const int BLOCKSIZE = 8192;
300 size_t alloc_size = 0;
301 lzma_stream z = LZMA_STREAM_INIT;
307 res = lzma_auto_decoder(&z, UINT64_MAX, LZMA_CONCATENATED);
309 while (res == LZMA_OK || (res == LZMA_BUF_ERROR && z.avail_out == 0)) {
312 alloc_size += BLOCKSIZE;
313 z.avail_out += BLOCKSIZE;
315 z.next_out = buf + alloc_size - z.avail_out;
316 res = lzma_code(&z, LZMA_FINISH);
322 if (res == LZMA_STREAM_END) {
324 *sizep = alloc_size - z.avail_out;
340 if (textfile ==
nullptr)
return;
346 FILE *handle =
FioFOpenFile(textfile,
"rb", dir, &filesize);
347 if (handle ==
nullptr)
return;
350 size_t read = fread(this->
text, 1, filesize, handle);
353 if (read != filesize)
return;
355 #if defined(WITH_ZLIB) || defined(WITH_LIBLZMA)
356 const char *suffix = strrchr(textfile,
'.');
357 if (suffix ==
nullptr)
return;
360 #if defined(WITH_ZLIB)
362 if (strcmp(suffix,
".gz") == 0)
Gunzip((
byte**)&this->
text, &filesize);
365 #if defined(WITH_LIBLZMA)
367 if (strcmp(suffix,
".xz") == 0)
Xunzip((
byte**)&this->text, &filesize);
370 if (!this->text)
return;
373 this->text =
ReallocT(this->text, filesize + 1);
374 this->text[filesize] =
'\0';
377 for (
char *p = this->text; *p !=
'\0'; p++) {
378 if (*p ==
'\t' || *p ==
'\r') *p =
' ';
382 char *p = this->text + (strncmp(u8
"\ufeff", this->text, 3) == 0 ? 3 : 0);
389 this->
lines.emplace_back(row, p);
390 for (; *p !=
'\0'; p++) {
393 this->
lines.emplace_back(++row, p + 1);
399 for (
auto &line : this->
lines) {
416 static const char *
const prefixes[] = {
421 static_assert(
lengthof(prefixes) == TFT_END);
423 const char *prefix = prefixes[type];
425 if (filename ==
nullptr)
return nullptr;
427 static char file_path[MAX_PATH];
430 char *slash = strrchr(file_path, PATHSEPCHAR);
431 if (slash ==
nullptr)
return nullptr;
433 static const char *
const exts[] = {
435 #if defined(WITH_ZLIB)
438 #if defined(WITH_LIBLZMA)
443 for (
size_t i = 0; i <
lengthof(exts); i++) {
FontSize DefaultSize() override
Get the default (font) size of the string.
int Height() const
Get height of Rect.
virtual void LoadTextfile(const char *textfile, Subdirectory dir)
Loads the textfile text from file and setup lines.
@ SVS_ALLOW_NEWLINE
Allow newlines.
const char * GetCurrentLanguageIsoCode()
Get the ISO language code of the currently loaded language.
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.
Dimensions (a width and height) of a rectangle in 2D.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
static void Xunzip(byte **bufp, size_t *sizep)
Do an in-memory xunzip operation.
static void Gunzip(byte **bufp, size_t *sizep)
Do an in-memory gunzip operation.
uint ReflowContent()
Get the total height of the content displayed in this window, if wrapping is disabled.
void OnResize() override
Called after the window got resized.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
void SetFontNames(FontCacheSettings *settings, const char *font_name, const void *os_data) override
Set the right font names.
static const NWidgetPart _nested_textfile_widgets[]
Widgets for the textfile window.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
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.
High level window description.
Settings for the four different fonts.
ResizeInfo resize
Resize information.
@ SA_TOP
Top align the text.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
int height
Height of the window (number of pixels down in y direction)
void StrMakeValidInPlace(char *str, const char *last, StringValidationSettings settings)
Scans the string for invalid characters and replaces then with a question mark '?' (if not ignored).
FILE * FioFOpenFile(const std::string &filename, const char *mode, Subdirectory subdir, size_t *filesize)
Opens a OpenTTD file somewhere in a personal or global directory.
uint Horizontal() const
Get total horizontal padding of RectPadding.
#define FONT_HEIGHT_MONO
Height of characters in the large (FS_MONO) font.
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
void SetupScrollbars(bool force_reflow)
Set scrollbars to the right lengths.
const char * NextString() override
Get the next string to search through.
fluid_settings_t * settings
FluidSynth settings handle.
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Coordinates of a point in 2D.
char * text
Lines of text from the NewGRF's textfile.
uint Vertical() const
Get total vertical padding of RectPadding.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
int GetStringHeight(const char *str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Scrollbar * hscroll
Horizontal scrollbar.
uint max_length
Maximum length of unwrapped text line.
void Reset() override
Reset the search, i.e.
uint search_iterator
Iterator for the font check search.
const char * GetTextfile(TextfileType type, Subdirectory dir, const char *filename)
Search a textfile file next to the given content.
bool FioCheckFileExists(const std::string &filename, Subdirectory subdir)
Check whether the given file exists.
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
bool IsWidgetLowered(byte widget_index) const
Gets the lowered state of a widget.
bool Monospace() override
Whether to search for a monospace font or not.
std::vector< Line > lines
text, split into lines in a table with lines.
int CDECL seprintf(char *str, const char *last, const char *format,...)
Safer implementation of snprintf; same as snprintf except:
Subdirectory
The different kinds of subdirectories OpenTTD uses.
static T * ReallocT(T *t_ptr, size_t num_elements)
Simplified reallocation function that allocates the specified number of elements of the given type.
@ SA_LEFT
Left align the text.
void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher)
Check whether the currently loaded language pack uses characters that the currently loaded font does ...
void ToggleWidgetLoweredState(byte widget_index)
Invert the lowered/raised status of a widget.
#define lengthof(x)
Return the length of an fixed size array.
@ FS_MONO
Index of the monospaced font in the font tables.
FontSize
Available font sizes.
Data structure for an opened window.
TextfileType
Additional text files accompanying Tar archives.
int Width() const
Get width of Rect.
char * strecpy(char *dst, const char *src, const char *last)
Copies characters from one buffer to another.
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
Specification of a rectangle with absolute coordinates of all edges.
@ WC_TEXTFILE
textfile; Window numbers:
#define lastof(x)
Get the last element of an fixed size array.
@ SVS_REPLACE_WITH_QUESTION_MARK
Replace the unknown/bad bits with question marks.
@ WDP_CENTER
Center the window.
static WindowDesc _textfile_desc(WDP_CENTER, "textfile", 630, 460, WC_TEXTFILE, WC_NONE, 0, _nested_textfile_widgets, lengthof(_nested_textfile_widgets))
Window definition for the textfile window.
Scrollbar * vscroll
Vertical scrollbar.
Data about how and where to blit pixels.