OpenTTD Source 20260512-master-g20b387b91f
console_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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "stdafx.h"
12#include "textbuf_type.h"
13#include "window_gui.h"
14#include "autocompletion.h"
15#include "console_gui.h"
16#include "console_internal.h"
17#include "window_func.h"
18#include "string_func.h"
19#include "strings_func.h"
20#include "gfx_func.h"
21#include "gfx_layout.h"
22#include "settings_type.h"
23#include "console_func.h"
24#include "rev.h"
26#include "timer/timer.h"
27#include "timer/timer_window.h"
28
30
31#include "table/strings.h"
32
33#include "safeguards.h"
34
35static const uint ICON_HISTORY_SIZE = 20;
36static const uint ICON_RIGHT_BORDERWIDTH = 10;
37static const uint ICON_BOTTOM_BORDERWIDTH = 12;
38
42struct IConsoleLine {
43 std::string buffer;
45 uint16_t time;
46
47 IConsoleLine() : buffer(), colour(TC_BEGIN), time(0)
48 {
49
50 }
51
58 buffer(std::move(buffer)),
60 time(0)
61 {
62 }
63
65 {
66 }
67};
68
70static std::deque<IConsoleLine> _iconsole_buffer;
71
72static bool TruncateBuffer();
73
74class ConsoleAutoCompletion final : public AutoCompletion {
75public:
76 using AutoCompletion::AutoCompletion;
77
78private:
79 std::vector<std::string> GetSuggestions(std::string_view prefix, std::string_view query) override
80 {
82 std::vector<std::string> suggestions;
83
84 /* We only suggest commands or aliases, so we only do it for the first token or an argument to help command. */
85 if (!prefix.empty() && prefix != "help") {
86 return suggestions;
87 }
88
89 for (const auto &[_, command] : IConsole::Commands()) {
90 if (command.name.starts_with(query)) {
91 suggestions.push_back(command.name);
92 }
93 }
94 for (const auto &[_, alias] : IConsole::Aliases()) {
95 if (alias.name.starts_with(query)) {
96 suggestions.push_back(alias.name);
97 }
98 }
99
100 return suggestions;
101 }
102
103 void ApplySuggestion(std::string_view prefix, std::string_view suggestion) override
104 {
105 this->textbuf->Assign(fmt::format("{}{} ", prefix, suggestion));
106 }
107};
108
111static ConsoleAutoCompletion _iconsole_tab_completion(&_iconsole_cmdline);
112static std::deque<std::string> _iconsole_history;
113static ptrdiff_t _iconsole_historypos;
115
116/* *************** *
117 * end of header *
118 * *************** */
119
120static void IConsoleClearCommand()
121{
122 _iconsole_cmdline.DeleteAll();
123 _iconsole_tab_completion.Reset();
125}
126
127static inline void IConsoleResetHistoryPos()
128{
129 _iconsole_historypos = -1;
130}
131
132
133static std::optional<std::string_view> IConsoleHistoryAdd(std::string_view cmd);
134static void IConsoleHistoryNavigate(int direction);
135
136static constexpr std::initializer_list<NWidgetPart> _nested_console_window_widgets = {
138};
139
142 WindowPosition::Manual, {}, 0, 0,
144 {},
145 _nested_console_window_widgets
146);
147
148struct IConsoleWindow : Window
149{
150 static size_t scroll;
151 int line_height = 0;
152 int line_offset = 0;
153 int cursor_width = 0;
154
155 IConsoleWindow() : Window(_console_window_desc)
156 {
158
159 this->InitNested(0);
160 ResizeWindow(this, _screen.width, _screen.height / 3);
161 }
162
163 void OnInit() override
164 {
165 this->line_height = GetCharacterHeight(FontSize::Normal) + WidgetDimensions::scaled.hsep_normal;
166 this->line_offset = GetStringBoundingBox("] ").width + WidgetDimensions::scaled.frametext.left;
167 this->cursor_width = GetCharacterWidth(FontSize::Normal, '_');
168 }
169
170 void Close([[maybe_unused]] int data = 0) override
171 {
174 this->Window::Close();
175 }
176
181 void Scroll(int amount)
182 {
183 if (amount < 0) {
184 size_t namount = static_cast<size_t>(-amount);
185 IConsoleWindow::scroll = (namount > IConsoleWindow::scroll) ? 0 : IConsoleWindow::scroll - namount;
186 } else {
187 assert(this->height >= 0 && this->line_height > 0);
188 size_t visible_lines = static_cast<size_t>(this->height / this->line_height);
189 size_t max_scroll = (visible_lines > _iconsole_buffer.size()) ? 0 : _iconsole_buffer.size() + 1 - visible_lines;
190 IConsoleWindow::scroll = std::min<size_t>(IConsoleWindow::scroll + amount, max_scroll);
191 }
192 this->SetDirty();
193 }
194
195 void OnPaint() override
196 {
197 const int right = this->width - WidgetDimensions::scaled.frametext.right;
198
199 GfxFillRect(0, 0, this->width - 1, this->height - 1, PC_BLACK);
200 int ypos = this->height - this->line_height - WidgetDimensions::scaled.hsep_normal;
201 for (size_t line_index = IConsoleWindow::scroll; line_index < _iconsole_buffer.size(); line_index++) {
202 const IConsoleLine &print = _iconsole_buffer[line_index];
203 ypos = DrawStringMultiLine(WidgetDimensions::scaled.frametext.left, right, -this->line_height, ypos, GetString(STR_JUST_RAW_STRING, print.buffer), print.colour, SA_LEFT | SA_BOTTOM | SA_FORCE) - WidgetDimensions::scaled.hsep_normal;
204 if (ypos < 0) break;
205 }
206 /* If the text is longer than the window, don't show the starting ']' */
207 int delta = this->width - WidgetDimensions::scaled.frametext.right - cursor_width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH;
208 if (delta > 0) {
209 DrawString(WidgetDimensions::scaled.frametext.left, right, this->height - this->line_height, "]", (TextColour)CC_COMMAND, SA_LEFT | SA_FORCE);
210 delta = 0;
211 }
212
213 /* If we have a marked area, draw a background highlight. */
214 if (_iconsole_cmdline.marklength != 0) GfxFillRect(this->line_offset + delta + _iconsole_cmdline.markxoffs, this->height - this->line_height, this->line_offset + delta + _iconsole_cmdline.markxoffs + _iconsole_cmdline.marklength, this->height - 1, PC_DARK_RED);
215
216 DrawString(this->line_offset + delta, right, this->height - this->line_height, _iconsole_cmdline.GetText(), static_cast<TextColour>(CC_COMMAND), SA_LEFT | SA_FORCE);
217
218 if (_focused_window == this && _iconsole_cmdline.caret) {
219 DrawString(this->line_offset + delta + _iconsole_cmdline.caretxoffs, right, this->height - this->line_height, "_", TC_WHITE, SA_LEFT | SA_FORCE);
220 }
221 }
222
224 const IntervalTimer<TimerWindow> truncate_interval = {std::chrono::seconds(3), [this](auto) {
225 assert(this->height >= 0 && this->line_height > 0);
226 size_t visible_lines = static_cast<size_t>(this->height / this->line_height);
227
228 if (TruncateBuffer() && IConsoleWindow::scroll + visible_lines > _iconsole_buffer.size()) {
229 size_t max_scroll = (visible_lines > _iconsole_buffer.size()) ? 0 : _iconsole_buffer.size() + 1 - visible_lines;
230 IConsoleWindow::scroll = std::min<size_t>(IConsoleWindow::scroll, max_scroll);
231 this->SetDirty();
232 }
233 }};
234
235 void OnMouseLoop() override
236 {
237 if (_iconsole_cmdline.HandleCaret()) this->SetDirty();
238 }
239
240 EventState OnKeyPress([[maybe_unused]] char32_t key, uint16_t keycode) override
241 {
242 if (_focused_window != this) return ES_NOT_HANDLED;
243
244 const int scroll_height = (this->height / this->line_height) - 1;
245 switch (keycode) {
246 case WKC_UP:
248 this->SetDirty();
249 break;
250
251 case WKC_DOWN:
253 this->SetDirty();
254 break;
255
256 case WKC_SHIFT | WKC_PAGEDOWN:
257 this->Scroll(-scroll_height);
258 break;
259
260 case WKC_SHIFT | WKC_PAGEUP:
261 this->Scroll(scroll_height);
262 break;
263
264 case WKC_SHIFT | WKC_DOWN:
265 this->Scroll(-1);
266 break;
267
268 case WKC_SHIFT | WKC_UP:
269 this->Scroll(1);
270 break;
271
272 case WKC_BACKQUOTE:
274 break;
275
276 case WKC_RETURN: case WKC_NUM_ENTER: {
277 /* We always want the ] at the left side; we always force these strings to be left
278 * aligned anyway. So enforce this in all cases by adding a left-to-right marker,
279 * otherwise it will be drawn at the wrong side with right-to-left texts. */
280 IConsolePrint(CC_COMMAND, LRM "] {}", _iconsole_cmdline.GetText());
281 auto cmd = IConsoleHistoryAdd(_iconsole_cmdline.GetText());
282 IConsoleClearCommand();
283
284 if (cmd.has_value()) IConsoleCmdExec(*cmd);
285 break;
286 }
287
288 case WKC_CTRL | WKC_RETURN:
290 IConsoleResize(this);
292 break;
293
294 case (WKC_CTRL | 'L'):
295 IConsoleCmdExec("clear");
296 break;
297
298 case WKC_TAB:
299 if (_iconsole_tab_completion.AutoComplete()) {
300 this->SetDirty();
301 }
302 break;
303
304 default: {
305 HandleKeyPressResult handle_result = _iconsole_cmdline.HandleKeyPress(key, keycode);
306 if (handle_result != HKPR_NOT_HANDLED) {
307 if (handle_result == HKPR_EDITING) {
308 _iconsole_tab_completion.Reset();
309 }
310 IConsoleWindow::scroll = 0;
311 IConsoleResetHistoryPos();
312 this->SetDirty();
313 } else {
314 return ES_NOT_HANDLED;
315 }
316 break;
317 }
318 }
319 return ES_HANDLED;
320 }
321
322 void InsertTextString(WidgetID, std::string_view str, bool marked, std::optional<size_t> caret, std::optional<size_t> insert_location, std::optional<size_t> replacement_end) override
323 {
324 if (_iconsole_cmdline.InsertString(str, marked, caret, insert_location, replacement_end)) {
325 _iconsole_tab_completion.Reset();
326 IConsoleWindow::scroll = 0;
327 IConsoleResetHistoryPos();
328 this->SetDirty();
329 }
330 }
331
332 const Textbuf *GetFocusedTextbuf() const override
333 {
334 return &_iconsole_cmdline;
335 }
336
337 Point GetCaretPosition() const override
338 {
339 int delta = std::min<int>(this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH, 0);
340 Point pt = {this->line_offset + delta + _iconsole_cmdline.caretxoffs, this->height - this->line_height};
341
342 return pt;
343 }
344
345 Rect GetTextBoundingRect(size_t from, size_t to) const override
346 {
347 int delta = std::min<int>(this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH, 0);
348
349 const auto p1 = GetCharPosInString(_iconsole_cmdline.GetText(), from, FontSize::Normal);
350 const auto p2 = from != to ? GetCharPosInString(_iconsole_cmdline.GetText(), to, FontSize::Normal) : p1;
351
352 Rect r = {this->line_offset + delta + p1.left, this->height - this->line_height, this->line_offset + delta + p2.right, this->height};
353 return r;
354 }
355
356 ptrdiff_t GetTextCharacterAtPosition(const Point &pt) const override
357 {
358 int delta = std::min<int>(this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH, 0);
359
360 if (!IsInsideMM(pt.y, this->height - this->line_height, this->height)) return -1;
361
362 return GetCharAtPosition(_iconsole_cmdline.GetText(), pt.x - delta);
363 }
364
365 void OnMouseWheel(int wheel, WidgetID widget) override
366 {
367 if (widget != WID_C_BACKGROUND) return;
368 this->Scroll(-wheel);
369 }
370
371 void OnFocus() override
372 {
374 }
375
376 void OnFocusLost(bool) override
377 {
379 }
380};
381
382size_t IConsoleWindow::scroll = 0;
383
384void IConsoleGUIInit()
385{
386 IConsoleResetHistoryPos();
388
389 IConsoleClearBuffer();
390
391 IConsolePrint(TC_LIGHT_BLUE, "OpenTTD Game Console Revision 7 - {}", _openttd_revision);
392 IConsolePrint(CC_WHITE, "------------------------------------");
393 IConsolePrint(CC_WHITE, "use \"help\" for more information.");
395 IConsoleClearCommand();
396}
397
398void IConsoleClearBuffer()
399{
400 _iconsole_buffer.clear();
401}
402
403void IConsoleGUIFree()
404{
405 IConsoleClearBuffer();
406}
407
413{
414 switch (_iconsole_mode) {
415 case ICONSOLE_OPENED:
416 w->height = _screen.height / 3;
417 w->width = _screen.width;
418 break;
419 case ICONSOLE_FULL:
420 w->height = _screen.height - ICON_BOTTOM_BORDERWIDTH;
421 w->width = _screen.width;
422 break;
423 default: return;
424 }
425
427}
428
431{
432 switch (_iconsole_mode) {
433 case ICONSOLE_CLOSED:
434 new IConsoleWindow();
435 break;
436
439 break;
440 }
441
443}
444
450
457static std::optional<std::string_view> IConsoleHistoryAdd(std::string_view cmd)
458{
459 /* Strip all spaces at the begin */
460 while (!cmd.empty() && IsWhitespace(cmd[0])) cmd.remove_prefix(1);
461
462 /* Do not put empty command in history */
463 if (cmd.empty()) return std::nullopt;
464
465 /* Do not put in history if command is same as previous */
466 if (_iconsole_history.empty() || _iconsole_history.front() != cmd) {
467 _iconsole_history.emplace_front(cmd);
468 while (_iconsole_history.size() > ICON_HISTORY_SIZE) _iconsole_history.pop_back();
469 }
470
471 /* Reset the history position */
472 IConsoleResetHistoryPos();
473 return _iconsole_history.front();
474}
475
480static void IConsoleHistoryNavigate(int direction)
481{
482 if (_iconsole_history.empty()) return; // Empty history
483 _iconsole_historypos = Clamp<ptrdiff_t>(_iconsole_historypos + direction, -1, _iconsole_history.size() - 1);
484
485 if (_iconsole_historypos == -1) {
486 _iconsole_cmdline.DeleteAll();
487 } else {
488 _iconsole_cmdline.Assign(_iconsole_history[_iconsole_historypos]);
489 }
490 _iconsole_tab_completion.Reset();
491}
492
502void IConsoleGUIPrint(TextColour colour_code, const std::string &str)
503{
504 _iconsole_buffer.push_front(IConsoleLine(str, colour_code));
506}
507
515static bool TruncateBuffer()
516{
517 bool need_truncation = false;
518 size_t count = 0;
519 for (IConsoleLine &line : _iconsole_buffer) {
520 count++;
521 line.time++;
522 if (line.time > _settings_client.gui.console_backlog_timeout && count > _settings_client.gui.console_backlog_length) {
523 /* Any messages after this are older and need to be truncated */
524 need_truncation = true;
525 break;
526 }
527 }
528
529 if (need_truncation) {
530 _iconsole_buffer.resize(count - 1);
531 }
532
533 return need_truncation;
534}
535
536
543{
544 /* A normal text colour is used. */
545 if (!(c & TC_IS_PALETTE_COLOUR)) return TC_BEGIN <= c && c < TC_END;
546
547 /* A text colour from the palette is used; must be the company
548 * colour gradient, so it must be one of those. */
550 for (Colours i = Colours::Begin; i < Colours::End; i++) {
551 if (GetColourGradient(i, Shade::Normal).p == c) return true;
552 }
553
554 return false;
555}
Generic auto-completion engine.
std::string_view query
Last token of the text. This is used to based the suggestions on.
std::string_view prefix
Prefix of the text before the last space.
std::vector< std::string > GetSuggestions(std::string_view prefix, std::string_view query) override
Get suggestions for auto completion with the given 'query' input text.
void ApplySuggestion(std::string_view prefix, std::string_view suggestion) override
Format the given suggestion after the given prefix, and write that to the buffer.
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
static const std::string_view WHITESPACE_NO_NEWLINE
ASCII whitespace characters, excluding new-line.
virtual void EditBoxLostFocus()
An edit box lost the input focus.
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
virtual void EditBoxGainedFocus()
An edit box gained the input focus.
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:30
void IConsoleCmdExec(std::string_view command_string, const uint recurse_count)
Execute a given command passed to us.
Definition console.cpp:271
void IConsolePrint(TextColour colour_code, const std::string &string)
Handle the printing of text entered into the console or redirected there by any other means.
Definition console.cpp:90
Console functions used outside of the console code.
IConsoleModes _iconsole_mode
Console modes.
static Textbuf _iconsole_cmdline(ICON_CMDLN_SIZE)
Main console cmd buffer.
static std::optional< std::string_view > IConsoleHistoryAdd(std::string_view cmd)
Add the entered line into the history so you can look it back scroll, etc.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
static WindowDesc _console_window_desc(WindowPosition::Manual, {}, 0, 0, WC_CONSOLE, WC_NONE, {}, _nested_console_window_widgets)
Window definition for the console window.
void IConsoleClose()
Close the in-game console.
bool IsValidConsoleColour(TextColour c)
Check whether the given TextColour is valid for console usage.
static bool TruncateBuffer()
Remove old lines from the backlog buffer.
IConsoleModes _iconsole_mode
Console modes.
void IConsoleGUIPrint(TextColour colour_code, const std::string &str)
Handle the printing of text entered into the console or redirected there by any other means.
static std::deque< IConsoleLine > _iconsole_buffer
The console backlog buffer.
void IConsoleResize(Window *w)
Change the size of the in-game console window after the screen size changed, or the window state chan...
static void IConsoleHistoryNavigate(int direction)
Navigate Up/Down in the history of typed commands.
GUI related functions in the console.
Internally used functions for the console.
static const uint ICON_CMDLN_SIZE
maximum length of a typed in command
static const TextColour CC_WHITE
White console lines for various things such as the welcome.
static const TextColour CC_COMMAND
Colour for the console's commands.
IConsoleModes
Modes of the in-game console.
@ ICONSOLE_CLOSED
In-game console is closed.
@ ICONSOLE_OPENED
In-game console is opened, upper 1/3 of the screen.
@ ICONSOLE_FULL
In-game console is opened, whole screen.
Types related to the console widgets.
@ WID_C_BACKGROUND
Background of the console.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:88
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:900
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:669
uint8_t GetCharacterWidth(FontSize size, char32_t key)
Return width of character glyph.
Definition gfx.cpp:1278
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition gfx.cpp:788
void GfxFillRect(int left, int top, int right, int bottom, const std::variant< PixelColour, PaletteID > &colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:116
Functions related to the gfx engine.
ParagraphLayouter::Position GetCharPosInString(std::string_view str, size_t pos, FontSize start_fontsize)
Get the leading corner of a character in a single-line string relative to the start of the string.
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize)
Get the character from a string that is drawn at a specific position.
Functions related to laying out the texts.
@ Normal
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ SA_LEFT
Left align the text.
Definition gfx_type.h:388
@ SA_FORCE
Force the alignment, i.e. don't swap for RTL languages.
Definition gfx_type.h:400
@ SA_BOTTOM
Bottom align the text.
Definition gfx_type.h:395
Colours
One of 16 base colours used for companies and windows/widgets.
Definition gfx_type.h:283
@ Begin
Begin marker.
Definition gfx_type.h:284
@ Invalid
Invalid marker.
Definition gfx_type.h:302
@ End
End-of-array marker.
Definition gfx_type.h:301
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition gfx_type.h:307
@ TC_IS_PALETTE_COLOUR
Colour value is already a real palette colour index, not an index of a StringColour.
Definition gfx_type.h:330
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
Definition window.cpp:980
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1554
#define Point
Macro that prevents name conflicts between included headers.
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
PixelColour GetColourGradient(Colours colour, Shade shade)
Get colour gradient palette index.
Definition palette.cpp:393
@ Normal
Normal colour shade.
static constexpr PixelColour PC_DARK_RED
Dark red palette colour.
static constexpr PixelColour PC_BLACK
Black palette colour.
Declaration of OTTD revision dependent variables.
A number of safeguards to prevent using unsafe methods.
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
Types related to global configuration settings.
Definition of base types and functions in a cross-platform compatible way.
Parse strings.
Functions related to low-level strings.
bool IsWhitespace(char32_t c)
Check whether UNICODE character is whitespace or not, i.e.
#define LRM
A left-to-right marker, marks the next character as left-to-right.
Definition string_type.h:19
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
Functions related to OTTD's strings.
T y
Y coordinate.
T x
X coordinate.
Container for a single line of console output.
TextColour colour
The colour of the line.
uint16_t time
The amount of time the line is in the backlog.
std::string buffer
The data to store.
IConsoleLine(std::string buffer, TextColour colour)
Initialize the console line.
void OnFocusLost(bool) override
The window has lost focus.
EventState OnKeyPress(char32_t key, uint16_t keycode) override
A key has been pressed.
void Scroll(int amount)
Scroll the content of the console.
const Textbuf * GetFocusedTextbuf() const override
Get the current input text buffer.
ptrdiff_t GetTextCharacterAtPosition(const Point &pt) const override
Get the character that is rendered at a position by the focused edit box.
Rect GetTextBoundingRect(size_t from, size_t to) const override
Get the bounding rectangle for a text range if an edit box has the focus.
void OnMouseLoop() override
Called for every mouse loop run, which is at least once per (game) tick.
void OnInit() override
Notification that the nested widget tree gets initialized.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
int line_height
Height of one line of text in the console.
void InsertTextString(WidgetID, std::string_view str, bool marked, std::optional< size_t > caret, std::optional< size_t > insert_location, std::optional< size_t > replacement_end) override
Insert a text string at the cursor position into the edit box widget.
void OnPaint() override
The window must be repainted.
const IntervalTimer< TimerWindow > truncate_interval
Check on a regular interval if the console buffer needs truncating.
Point GetCaretPosition() const override
Get the current caret position if an edit box has the focus.
void OnMouseWheel(int wheel, WidgetID widget) override
The mouse wheel has been turned.
void OnFocus() override
The window has gained focus.
Specification of a rectangle with absolute coordinates of all edges.
Helper/buffer for input fields.
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:274
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1117
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1846
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1836
int height
Height of the window (number of pixels down in y direction).
Definition window_gui.h:313
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:312
Stuff related to text buffers.
HandleKeyPressResult
Return values for Textbuf::HandleKeypress.
@ HKPR_NOT_HANDLED
Key does not affect editboxes.
@ HKPR_EDITING
Textbuf content changed.
Definition of Interval and OneShot timers.
Definition of the Window system.
Base of all video drivers.
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:37
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Definition window.cpp:1209
Window * _focused_window
Window that currently has focus.
Definition window.cpp:85
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen, bool schedule_resize)
Resize the window.
Definition window.cpp:2113
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting).
Definition window.cpp:3200
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ Manual
Manually align the window (so no automatic location finding).
Definition window_gui.h:143
int WidgetID
Widget ID.
Definition window_type.h:21
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_CONSOLE
Console; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:51