30#include "table/strings.h"
34static const uint ICON_HISTORY_SIZE = 20;
35static const uint ICON_RIGHT_BORDERWIDTH = 10;
36static const uint ICON_BOTTOM_BORDERWIDTH = 12;
75 using AutoCompletion::AutoCompletion;
78 std::vector<std::string> GetSuggestions(std::string_view
prefix, std::string_view
query)
override
81 std::vector<std::string> suggestions;
88 for (
const auto &[_, command] : IConsole::Commands()) {
89 if (command.name.starts_with(
query)) {
90 suggestions.push_back(command.name);
93 for (
const auto &[_, alias] : IConsole::Aliases()) {
94 if (alias.name.starts_with(
query)) {
95 suggestions.push_back(alias.name);
102 void ApplySuggestion(std::string_view
prefix, std::string_view suggestion)
override
104 this->textbuf->
Assign(fmt::format(
"{}{} ",
prefix, suggestion));
111static std::deque<std::string> _iconsole_history;
112static ptrdiff_t _iconsole_historypos;
119static void IConsoleClearCommand()
122 _iconsole_tab_completion.Reset();
126static inline void IConsoleResetHistoryPos()
128 _iconsole_historypos = -1;
135static constexpr NWidgetPart _nested_console_window_widgets[] = {
143 _nested_console_window_widgets
148 static size_t scroll;
182 size_t namount =
static_cast<size_t>(-amount);
183 IConsoleWindow::scroll = (
namount > IConsoleWindow::scroll) ? 0 : IConsoleWindow::scroll -
namount;
188 IConsoleWindow::scroll = std::min<size_t>(IConsoleWindow::scroll + amount,
max_scroll);
217 if (_focused_window ==
this && _iconsole_cmdline.
caret) {
229 IConsoleWindow::scroll = std::min<size_t>(IConsoleWindow::scroll,
max_scroll);
255 case WKC_SHIFT | WKC_PAGEDOWN:
256 this->
Scroll(-scroll_height);
259 case WKC_SHIFT | WKC_PAGEUP:
260 this->
Scroll(scroll_height);
263 case WKC_SHIFT | WKC_DOWN:
267 case WKC_SHIFT | WKC_UP:
275 case WKC_RETURN:
case WKC_NUM_ENTER: {
281 IConsoleClearCommand();
287 case WKC_CTRL | WKC_RETURN:
293 case (WKC_CTRL |
'L'):
309 IConsoleWindow::scroll = 0;
310 IConsoleResetHistoryPos();
325 IConsoleWindow::scroll = 0;
326 IConsoleResetHistoryPos();
333 return &_iconsole_cmdline;
338 int delta = std::min<int>(this->
width - this->line_offset - _iconsole_cmdline.
pixels - ICON_RIGHT_BORDERWIDTH, 0);
346 int delta = std::min<int>(this->
width - this->line_offset - _iconsole_cmdline.
pixels - ICON_RIGHT_BORDERWIDTH, 0);
357 int delta = std::min<int>(this->
width - this->line_offset - _iconsole_cmdline.
pixels - ICON_RIGHT_BORDERWIDTH, 0);
380size_t IConsoleWindow::scroll = 0;
382void IConsoleGUIInit()
384 IConsoleResetHistoryPos();
387 IConsoleClearBuffer();
389 IConsolePrint(TC_LIGHT_BLUE,
"OpenTTD Game Console Revision 7 - {}", _openttd_revision);
393 IConsoleClearCommand();
396void IConsoleClearBuffer()
401void IConsoleGUIFree()
403 IConsoleClearBuffer();
409 switch (_iconsole_mode) {
411 w->
height = _screen.height / 3;
412 w->
width = _screen.width;
415 w->
height = _screen.height - ICON_BOTTOM_BORDERWIDTH;
416 w->
width = _screen.width;
427 switch (_iconsole_mode) {
461 if (_iconsole_history.empty() || _iconsole_history.front() != cmd) {
462 _iconsole_history.emplace_front(cmd);
463 while (_iconsole_history.size() > ICON_HISTORY_SIZE) _iconsole_history.pop_back();
467 IConsoleResetHistoryPos();
468 return _iconsole_history.front().c_str();
477 if (_iconsole_history.empty())
return;
478 _iconsole_historypos = Clamp<ptrdiff_t>(_iconsole_historypos + direction, -1, _iconsole_history.size() - 1);
480 if (_iconsole_historypos == -1) {
483 _iconsole_cmdline.
Assign(_iconsole_history[_iconsole_historypos]);
485 _iconsole_tab_completion.Reset();
512 bool need_truncation =
false;
519 need_truncation =
true;
524 if (need_truncation) {
528 return need_truncation;
544 c &= ~TC_IS_PALETTE_COLOUR;
545 for (Colours i = COLOUR_BEGIN; i < COLOUR_END; i++) {
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.
An interval timer will fire every interval, and will continue to fire until it is deleted.
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.
void IConsoleCmdExec(const std::string &command_string, const uint recurse_count)
Execute a given command passed to us.
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.
Console functions used outside of the console code.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
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.
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.
static const char * IConsoleHistoryAdd(const char *cmd)
Add the entered line into the history so you can look it back scroll, etc.
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.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
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.
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.
uint8_t GetCharacterWidth(FontSize size, char32_t key)
Return width of character glyph.
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.
Functions related to the gfx engine.
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.
ParagraphLayouter::Position GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize)
Get the leading corner of a character in a single-line string relative to the start of the string.
Functions related to laying out the texts.
@ FS_NORMAL
Index of the normal font in the font tables.
@ SA_LEFT
Left align the text.
@ SA_FORCE
Force the alignment, i.e. don't swap for RTL languages.
@ SA_BOTTOM
Bottom align the text.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
@ TC_IS_PALETTE_COLOUR
Colour value is already a real palette colour index, not an index of a StringColour.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
uint8_t GetColourGradient(Colours colour, ColourShade shade)
Get colour gradient palette index.
static const uint8_t PC_BLACK
Black palette colour.
static const uint8_t PC_DARK_RED
Dark red 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.
Types related to global configuration settings.
Definition of base types and functions in a cross-platform compatible way.
Functions related to low-level strings.
bool StrEmpty(const char *s)
Check if a string buffer is empty.
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.
void SetDParamStr(size_t n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
Functions related to OTTD's strings.
GUISettings gui
settings related to the GUI
uint16_t console_backlog_length
the minimum amount of items in the console backlog before items will be removed.
uint16_t console_backlog_timeout
the minimum amount of time items should be in the console backlog before they will be removed in ~3 s...
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.
void InsertTextString(WidgetID, const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end) override
Insert a text string at the cursor position into the edit box widget.
const Textbuf * GetFocusedTextbuf() const override
Get the current input text buffer.
IntervalTimer< TimerWindow > truncate_interval
Check on a regular interval if the console buffer needs truncating.
ptrdiff_t GetTextCharacterAtPosition(const Point &pt) const override
Get the character that is rendered at a position by the focused edit box.
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 OnPaint() override
The window must be repainted.
Rect GetTextBoundingRect(const char *from, const char *to) const override
Get the bounding rectangle for a text range if an edit box has the focus.
Point GetCaretPosition() const override
Get the current caret position if an edit box has the focus.
void OnMouseWheel(int wheel) override
The mouse wheel has been turned.
void OnFocus() override
The window has gained focus.
Coordinates of a point in 2D.
Specification of a rectangle with absolute coordinates of all edges.
Helper/buffer for input fields.
uint16_t pixels
the current size of the string in pixels
uint16_t markxoffs
the start position of the marked area in pixels
void DeleteAll()
Delete every character in the textbuffer.
bool InsertString(const char *str, bool marked, const char *caret=nullptr, const char *insert_location=nullptr, const char *replacement_end=nullptr)
Insert a string into the text buffer.
void Assign(StringID string)
Render a string into the textbuffer.
const char * GetText() const
Get the current text.
uint16_t caretxoffs
the current position of the caret in pixels
uint16_t marklength
the length of the marked area in pixels
bool caret
is the caret ("_") visible or not
bool HandleCaret()
Handle the flashing of the caret.
High level window description.
Data structure for an opened window.
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
int height
Height of the window (number of pixels down in y direction)
int width
width of the window (number of pixels to the right in x direction)
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.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen, bool schedule_resize)
Resize the window.
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
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.