OpenTTD Source
20240915-master-g3784a3d3d6
|
Go to the documentation of this file.
84 Point _cursorpos_drag_start;
86 int _scrollbar_start_pos;
88 uint8_t _scroller_click_timeout = 0;
107 const std::span<const NWidgetPart> nwid_parts,
HotkeyList *hotkeys,
108 const std::source_location location) :
109 source_location(location),
110 default_pos(def_pos),
112 parent_cls(parent_class),
115 nwid_parts(nwid_parts),
120 default_width_trad(def_width_trad),
121 default_height_trad(def_height_trad)
127 WindowDesc::~WindowDesc()
160 if (wd->ini_key ==
nullptr)
continue;
185 if (wd->ini_key ==
nullptr)
continue;
215 const NWidgetBase *wid = this->GetWidget<NWidgetBase>(widget);
216 if (line_height < 0) line_height = wid->
resize_y;
217 if (clickpos < wid->pos_y + padding)
return INT_MAX;
218 return (clickpos - wid->
pos_y - padding) / line_height;
228 if (nwid->IsHighlighted()) {
229 nwid->SetHighlighted(TC_INVALID);
244 NWidgetBase *nwid = this->GetWidget<NWidgetBase>(widget_index);
245 if (nwid ==
nullptr)
return;
247 nwid->SetHighlighted(highlighted_colour);
250 if (highlighted_colour != TC_INVALID) {
258 if (!nwid->IsHighlighted())
continue;
274 const NWidgetBase *nwid = this->GetWidget<NWidgetBase>(widget_index);
275 if (nwid ==
nullptr)
return false;
277 return nwid->IsHighlighted();
289 if (widget < 0)
return;
300 NWidgetCore *nwi2 = this->GetWidget<NWidgetCore>(widget);
316 return this->GetWidget<NWidgetScrollbar>(widnum);
326 return this->GetWidget<NWidgetScrollbar>(widnum);
337 return query != this->
querystrings.end() ? query->second :
nullptr;
348 return query != this->
querystrings.end() ? query->second :
nullptr;
357 qs.second->text.UpdateSize();
400 Rect r = {0, 0, 0, 0};
424 if (_focused_window == w)
return;
430 if (_focused_window !=
nullptr) {
435 Window *old_focused = _focused_window;
439 if (old_focused !=
nullptr) old_focused->
OnFocusLost(
false);
440 if (_focused_window !=
nullptr) _focused_window->
OnFocus();
450 if (_focused_window ==
nullptr)
return false;
488 NWidgetCore *widget = this->GetWidget<NWidgetCore>(widget_index);
489 assert(widget !=
nullptr);
530 if (((type & ~WWB_PUSHBUTTON) <
WWT_LAST || type == NWID_PUSHBUTTON_DROPDOWN) &&
540 if (wid !=
nullptr) {
557 it->second->SetDirty(
this);
569 NWidgetCore *nw = this->GetWidget<NWidgetCore>(hotkey);
615 bool focused_widget_changed =
false;
617 if (_focused_window != w &&
620 focused_widget_changed =
true;
624 if (nw ==
nullptr)
return;
654 switch (widget_type) {
662 if (query !=
nullptr) query->ClickEditBox(w, pt, widget_index, click_count, focused_widget_changed);
724 if (widget_index < 0)
return;
732 w->
OnClick(pt, widget_index, click_count);
744 if (wid ==
nullptr)
return;
749 if (wid->
index >= 0) {
775 if (wid ==
nullptr)
return;
786 if (wid->
index < 0)
return;
800 if (nwid ==
nullptr)
return;
861 for (; !it.IsEnd(); ++it) {
866 left < v->left + v->
width &&
867 top < v->top + v->
height) {
871 if (left < (x = v->
left)) {
883 if (top < (x = v->
top)) {
901 dp->width = right - left;
902 dp->height = bottom - top;
903 dp->left = left - w->
left;
904 dp->top = top - w->
top;
905 dp->pitch = _screen.pitch;
928 left < w->left + w->width &&
929 top < w->top + w->height) {
931 DrawOverlappedWindow(w, std::max(left, w->left), std::max(top, w->top), std::min(right, w->left + w->width), std::min(bottom, w->top + w->height));
971 window_width = std::max(window_width + rx, this->
width);
972 window_height = std::max(window_height + ry, this->
height);
1025 if ((wc ==
WC_INVALID || wc == v->window_class) && v->parent ==
this)
return v;
1038 while (child !=
nullptr) {
1050 if (*this->z_position ==
nullptr)
return;
1052 *this->z_position =
nullptr;
1069 if (_focused_window ==
this) {
1071 _focused_window =
nullptr;
1087 assert(*this->z_position ==
nullptr);
1089 if (this->
viewport !=
nullptr) DeleteWindowViewport(
this);
1101 if (w->window_class == cls && w->window_number == number)
return w;
1116 if (w->window_class == cls)
return w;
1130 assert(w !=
nullptr);
1156 if (w->window_class == cls) {
1172 if (w->owner ==
id) {
1191 if (w->owner != old_owner)
continue;
1193 switch (w->window_class) {
1208 w->owner = new_owner;
1238 static inline bool IsVitalWindow(
const Window *w)
1264 uint z_priority = 0;
1347 WindowList::iterator dest =
_z_windows.begin();
1350 if (dest != w->z_position) {
1406 this->
width = sm_width;
1407 this->
height = sm_height;
1422 def_width = std::max(def_width, this->
width);
1423 def_height = std::max(def_height, this->
height);
1429 if (this->
width != def_width || this->
height != def_height) {
1431 int free_height = _screen.height;
1433 if (wt !=
nullptr) free_height -= wt->
height;
1435 if (wt !=
nullptr) free_height -= wt->
height;
1437 int enlarge_x = std::max(std::min(def_width - this->
width, _screen.width - this->width), 0);
1438 int enlarge_y = std::max(std::min(def_height - this->
height, free_height - this->
height), 0);
1453 int nx = this->
left;
1456 if (nx + this->
width > _screen.width) nx -= (nx + this->
width - _screen.width);
1459 ny = std::max(ny, (wt ==
nullptr ||
this == wt || this->
top == 0) ? 0 : wt->
height);
1460 nx = std::max(nx, 0);
1486 int right = width + left;
1487 int bottom = height + top;
1489 if (left < 0 || top < toolbar_y || right > _screen.width || bottom > _screen.height)
return false;
1495 if (right > w->
left &&
1528 if (left < -(width >> 1) || left > _screen.width - (width >> 2))
return false;
1530 if (left < -(width >> 2) || left > _screen.width - (width >> 1))
return false;
1534 if (top < toolbar_y || top > _screen.height - (height >> 2))
return false;
1540 if (left + width > w->
left &&
1542 top + height > w->
top &&
1567 const int toolbar_y = main_toolbar !=
nullptr ? main_toolbar->
height : 0;
1568 if (
IsGoodAutoPlace1(rtl ? _screen.width - width : 0, toolbar_y, width, height, toolbar_y, pt))
return pt;
1603 int left = rtl ? _screen.width - width : 0, top = toolbar_y;
1609 if (w->
left == left && w->
top == top) {
1630 assert(w !=
nullptr);
1663 pt.x = w->
left + (rtl ? w->
width - default_width : 0);
1672 if (w->
top + 3 * indent_y < _screen.height) {
1673 pt.y = w->
top + indent_y;
1677 pt.x = std::max(w->
left + w->
width - default_width - indent_close, 0);
1678 if (pt.x + default_width >= indent_close && pt.x + indent_resize <= _screen.width)
return pt;
1680 pt.x = std::min(w->
left + indent_close, _screen.width - default_width);
1681 if (pt.x + default_width >= indent_resize && pt.x + indent_close <= _screen.width)
return pt;
1695 pt.x = (_screen.width - default_width) / 2;
1696 pt.y = (_screen.height - default_height) / 2;
1786 _focused_window =
nullptr;
1794 NWidgetScrollbar::InvalidateDimensionCache();
1825 static void DecreaseWindowCounters()
1827 if (_scroller_click_timeout != 0) _scroller_click_timeout--;
1830 if (_scroller_click_timeout == 0) {
1847 pair.second->HandleEditBox(w, pair.first);
1863 static void HandlePlacePresize()
1868 if (w ==
nullptr)
return;
1870 Point pt = GetTileBelowCursor();
1893 pt.x = _cursor.
pos.x - w->
left;
1894 pt.y = _cursor.
pos.y - w->
top;
1914 Point pt = { -1, -1 };
1947 if (v ==
nullptr)
return;
1949 const int min_visible = rect.
Height();
1953 int safe_y = (dir ==
PHD_UP) ? (v->
top - min_visible - rect.top) : (v_bottom + min_visible - rect.bottom);
1955 if (*ny + rect.top <= v->
top - min_visible)
return;
1956 if (*ny + rect.bottom >= v_bottom + min_visible)
return;
1959 if (*nx + rect.left + min_visible < v->left) {
1960 if (v->
left < min_visible) *ny = safe_y;
1963 if (*nx + rect.right - min_visible > v_right) {
1964 if (v_right > _screen.width - min_visible) *ny = safe_y;
1969 if (px + rect.left < v->
left && v->
left >= min_visible) {
1970 *nx = v->
left - min_visible - rect.left;
1971 }
else if (px + rect.right > v_right && v_right <= _screen.width - min_visible) {
1972 *nx = v_right + min_visible - rect.right;
1989 if (caption !=
nullptr) {
1990 const Rect caption_rect = caption->GetCurrentRect();
1992 const int min_visible = caption_rect.
Height();
1995 nx =
Clamp(nx, min_visible - caption_rect.right, _screen.width - min_visible - caption_rect.left);
1996 ny =
Clamp(ny, 0, _screen.height - min_visible);
2024 if (delta_x != 0 || delta_y != 0) {
2025 if (clamp_to_screen) {
2028 int new_right = w->
left + w->
width + delta_x;
2029 int new_bottom = w->
top + w->
height + delta_y;
2030 if (new_right >= (
int)_screen.width) delta_x -=
Ceil(new_right - _screen.width, std::max(1U, w->
nested_root->resize_x));
2031 if (new_bottom >= (
int)_screen.height) delta_y -=
Ceil(new_bottom - _screen.height, std::max(1U, w->
nested_root->resize_y));
2049 if (schedule_resize) {
2065 return (w ==
nullptr) ? 0 : w->
top + w->
height;
2076 return (w ==
nullptr) ? _screen.height : w->
top;
2115 if (v == w)
continue;
2117 if (y + w->
height > v->top && y < v->top + v->height) {
2119 delta =
abs(v->left + v->width - x);
2120 if (delta <= hsnap) {
2121 nx = v->left + v->width;
2126 delta =
abs(v->left - x - w->
width);
2127 if (delta <= hsnap) {
2128 nx = v->left - w->
width;
2133 if (w->
top + w->
height >= v->top && w->
top <= v->top + v->height) {
2135 delta =
abs(v->left - x);
2136 if (delta <= hsnap) {
2142 delta =
abs(v->left + v->width - x - w->
width);
2143 if (delta <= hsnap) {
2144 nx = v->left + v->width - w->
width;
2149 if (x + w->
width > v->left && x < v->left + v->width) {
2151 delta =
abs(v->top + v->height - y);
2152 if (delta <= vsnap) {
2153 ny = v->top + v->height;
2159 if (delta <= vsnap) {
2165 if (w->
left + w->
width >= v->left && w->
left <= v->left + v->width) {
2167 delta =
abs(v->top - y);
2168 if (delta <= vsnap) {
2174 delta =
abs(v->top + v->height - y - w->
height);
2175 if (delta <= vsnap) {
2176 ny = v->top + v->height - w->
height;
2210 if (w->
top + w->
height + y > _screen.height) {
2211 y = _screen.height - w->
height - w->
top;
2296 i = _cursor.
pos.x - _cursorpos_drag_start.x;
2299 i = _cursor.
pos.y - _cursorpos_drag_start.y;
2303 if (_scroller_click_timeout == 1) {
2304 _scroller_click_timeout = 3;
2379 if (scrollwheel_scrolling) {
2381 delta.x = _cursor.h_wheel;
2382 delta.y = _cursor.v_wheel;
2383 _cursor.v_wheel = 0;
2384 _cursor.h_wheel = 0;
2387 delta.x = -_cursor.
delta.x;
2388 delta.y = -_cursor.
delta.y;
2390 delta.x = _cursor.
delta.x;
2391 delta.y = _cursor.
delta.y;
2398 _cursor.
delta.x = 0;
2399 _cursor.
delta.y = 0;
2415 bool bring_to_front =
false;
2425 int w_width = w->
width;
2426 int w_height = w->
height;
2434 for (; !it.IsEnd(); ++it) {
2451 if (w->
left + w_width <= u->left ||
2453 w->
top + w_height <= u->top ||
2458 bring_to_front =
true;
2480 switch (query->text.HandleKeyPress(key, keycode)) {
2524 if (query->text.
bytes <= 1) {
2575 if (key >= 0xE000 && key <= 0xF8FF) key = 0;
2580 if (key == 0 && keycode == 0)
return;
2612 HandleGlobalHotkeys(key, keycode);
2634 if (query ==
nullptr)
return;
2636 if (query->text.
InsertString(str, marked, caret, insert_location, replacement_end) || marked) {
2648 void HandleTextInput(
const char *str,
bool marked,
const char *caret,
const char *insert_location,
const char *replacement_end)
2673 int x = _cursor.
pos.x;
2674 int y = _cursor.
pos.y;
2680 if (vp ==
nullptr)
return;
2687 static const int SCROLLSPEED = 3;
2691 }
else if (15 - (vp->
width - x) > 0) {
2698 }
else if (15 - (vp->
height - y) > 0) {
2718 static void ScrollMainViewport(
int x,
int y)
2720 if (_game_mode != GM_MENU && _game_mode != GM_BOOTSTRAP) {
2755 static void HandleKeyScrolling()
2771 static void MouseLoop(
MouseClick click,
int mousewheel)
2777 HandlePlacePresize();
2789 if (click == MC_NONE && mousewheel == 0 && !scrollwheel_scrolling)
return;
2791 int x = _cursor.
pos.x;
2792 int y = _cursor.
pos.y;
2794 if (w ==
nullptr)
return;
2800 if (vp !=
nullptr && (_game_mode == GM_MENU ||
HasModalProgress()))
return;
2802 if (mousewheel != 0) {
2810 if (vp !=
nullptr) {
2818 case MC_DOUBLE_LEFT:
2820 if (HandleViewportClicked(vp, x, y))
return;
2847 case MC_DOUBLE_LEFT:
2867 _cursor.h_wheel = 0;
2868 _cursor.v_wheel = 0;
2888 static std::chrono::steady_clock::time_point double_click_time = {};
2889 static Point double_click_pos = {0, 0};
2898 click = MC_DOUBLE_LEFT;
2900 double_click_time = std::chrono::steady_clock::now();
2901 double_click_pos = _cursor.
pos;
2911 if (_cursor.
wheel) {
2912 mousewheel = _cursor.
wheel;
2917 static std::chrono::steady_clock::time_point hover_time = {};
2918 static Point hover_pos = {0, 0};
2924 hover_pos = _cursor.
pos;
2925 hover_time = std::chrono::steady_clock::now();
2932 hover_time = std::chrono::steady_clock::now();
2945 MouseLoop(click, mousewheel);
2950 _cursor.
delta.x = 0;
2951 _cursor.
delta.y = 0;
2962 uint deletable_count = 0;
2963 Window *last_deletable =
nullptr;
2974 assert(last_deletable !=
nullptr);
2975 last_deletable->
Close();
3016 extern int _caret_timer;
3020 HandleKeyScrolling();
3022 DecreaseWindowCounters();
3036 CLRBITS(w->flags, WF_WHITE_BORDER);
3047 static auto last_time = std::chrono::steady_clock::now();
3048 auto now = std::chrono::steady_clock::now();
3049 auto delta_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now - last_time);
3051 if (delta_ms.count() == 0)
return;
3167 this->scheduled_invalidation_data.clear();
3178 if (pair.second->IsHighlighted()) pair.second->SetDirty(
this);
3313 void ReInitWindow(
Window *w,
bool zoom_changed)
3315 if (w ==
nullptr)
return;
3328 NWidgetScrollbar::InvalidateDimensionCache();
3338 ReInitWindow(w, zoom_changed);
3361 if (w ==
nullptr)
return 0;
3363 int old_left = w->
left;
3365 case 1: w->
left = (_screen.width - w->
width) / 2;
break;
3366 case 2: w->
left = _screen.width - w->
width;
break;
3367 default: w->
left = 0;
break;
3381 Debug(misc, 5,
"Repositioning Main Toolbar...");
3392 Debug(misc, 5,
"Repositioning statusbar...");
3403 Debug(misc, 5,
"Repositioning news message...");
3414 Debug(misc, 5,
"Repositioning network chat window...");
3452 ws->top = newh - ws->height;
3488 top = (newh - w->
height) >> 1;
3489 left = (neww - w->
width) >> 1;
3494 if (left + (w->
width >> 1) >= neww) left = neww - w->
width;
3495 if (left < 0) left = 0;
3498 if (top + (w->
height >> 1) >= newh) top = newh - w->
height;
void * clicked_pixel
Clicked pixel (pointer to blitter buffer)
@ ES_HANDLED
The passed event is handled.
void ShowFirstError()
Show the first error of the queue.
uint8_t timeout_timer
Timer value of the WF_TIMEOUT for flags.
Iterator to iterate all valid Windows.
@ WC_CUSTOM_CURRENCY
Custom currency; Window numbers:
@ WC_SAVELOAD
Saveload window; Window numbers:
void SetTimeout()
Set the timeout flag of the window and initiate the timer.
@ WC_ROADVEH_LIST
Road vehicle list; Window numbers:
int16_t pref_width
User-preferred width of the window. Zero if unset.
@ MAX_OFFSET_HOVER
Maximum mouse movement before stopping a hover event.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
void HideVitalWindows()
Close all always on-top windows to get an empty screen.
virtual void OnScroll([[maybe_unused]] Point delta)
Handle the request for (viewport) scrolling.
Window * FindWindowFromPt(int x, int y)
Do a search for a window at specific coordinates.
@ WC_INVALID
Invalid window.
static Window * _mouseover_last_w
Window of the last OnMouseOver event.
int16_t default_height_trad
Preferred initial height of the window (pixels at 1x zoom).
int Height() const
Get height of Rect.
static Titem * Get(size_t index)
Returns Titem with given index.
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
int ok_button
Widget button of parent window to simulate when pressing OK in OSK.
@ HKPR_EDITING
Textbuf content changed.
void AddDirtyBlock(int left, int top, int right, int bottom)
Extend the internal _invalid_rect rectangle to contain the rectangle defined by the given parameters.
@ WF_SIZING
Window is being resized.
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
static void CheckSoftLimit()
Check the soft limit of deletable (non vital, non sticky) windows.
void UpdateTileSelection()
Updates tile highlighting for all cases.
virtual Point OnInitialPosition(int16_t sm_width, int16_t sm_height, int window_number)
Compute the initial position of the window.
void SetWhiteBorder()
Set the timeout flag of the window and initiate the timer.
List of hotkeys for a window.
void SetFocusedWindow(Window *w)
Set the window that has the focus.
virtual ~Window()
Remove window and all its child windows from the window stack.
virtual const struct Textbuf * GetFocusedTextbuf() const
Get the current input text buffer.
@ HKPR_CONFIRM
Return or enter key pressed.
@ WDF_CONSTRUCTION
This window is used for construction; close it whenever changing company.
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
NWidgetStacked * shade_select
Selection widget (NWID_SELECTION) to use for shading the window. If nullptr, window cannot shade.
@ WF_SIZING_RIGHT
Window is being resized towards the right.
constexpr uint Ceil(uint a, uint b)
Computes ceil(a / b) * b for non-negative a and b.
SpecialMouseMode _special_mouse_mode
Mode of the mouse.
bool _left_button_down
Is left mouse button pressed?
virtual void ApplyDefaults()
Read default values from WindowDesc configuration an apply them to the window.
virtual void OnDropdownClose(Point pt, WidgetID widget, int index, bool instant_close)
A dropdown window associated to this window has been closed.
void CloseCompanyWindows(CompanyID id)
Close all windows of a company.
@ WC_COMPANY_COLOUR
Company colour selection; Window numbers:
How all blitters should look like.
void IniLoadWindowSettings(IniFile &ini, const char *grpname, void *desc)
Load a WindowDesc from config.
void InitializePositionSize(int x, int y, int min_width, int min_height)
Set the position and smallest size of the window.
static void HandleScrollbarScrolling(Window *w)
Handle scrollbar scrolling with the mouse.
void HandleTextInput(const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end)
Handle text input.
int width
Screen width of the viewport.
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
@ INVALID_OWNER
An invalid owner.
@ SWS_SCROLL_MAP
Scroll wheel scrolls the map.
virtual ptrdiff_t GetTextCharacterAtPosition(const Point &pt) const
Get the character that is rendered at a position by the focused edit box.
@ PHD_DOWN
Below v is a safe position.
@ WF_DISABLE_VP_SCROLL
Window does not do autoscroll,.
ViewportData * viewport
Pointer to viewport data, if present.
uint8_t statusbar_pos
position of statusbar, 0=left, 1=center, 2=right
NewGrfDebugSpritePicker _newgrf_debug_sprite_picker
The sprite picker.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
int height
Screen height of the viewport.
std::vector< SpriteID > sprites
Sprites found.
@ WDP_ALIGN_TOOLBAR
Align toward the toolbar.
void InitWindowSystem()
(re)initialize the windowing system
NewGrfDebugSpritePickerMode mode
Current state.
Owner
Enum for all companies/owners.
virtual void OnGameTick()
Called once per (game) tick.
uint8_t valid
Bits indicating what variable is valid (for each bit, 0 is invalid, 1 is valid).
int top
Screen coordinate top edge of the viewport.
@ WF_STICKY
Window is made sticky by user.
virtual void OnFocusLost(bool closing)
The window has lost focus.
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
void UpdateWindows()
Update the continuously changing contents of the windows, such as the viewports.
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
void InitNewsItemStructs()
Initialize the news-items data structures.
static void StartWindowSizing(Window *w, bool to_left)
Start resizing a window.
static IntervalTimer< TimerWindow > window_interval(std::chrono::milliseconds(30), [](auto) { extern int _caret_timer;_caret_timer+=3;CursorTick();HandleKeyScrolling();HandleAutoscroll();DecreaseWindowCounters();})
Update various of window-related information on a regular interval.
static void BringWindowToFront(Window *w, bool dirty=true)
On clicking on a window, make it the frontmost window of all windows with an equal or lower z-priorit...
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
void UnInitWindowSystem()
Close down the windowing system.
@ VA_DISABLED
Do not autoscroll when mouse is at edge of viewport.
static IntervalTimer< TimerWindow > white_border_interval(std::chrono::milliseconds(30), [](auto) { if(_network_dedicated) return;for(Window *w :Window::Iterate()) { if((w->flags &WF_WHITE_BORDER) &&--w->white_border_timer==0) { CLRBITS(w->flags, WF_WHITE_BORDER);w->SetDirty();} } })
Blink all windows marked with a white border.
bool _ctrl_pressed
Is Ctrl pressed?
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
bool IsWidgetHighlighted(WidgetID widget_index) const
Gets the highlighted status of a widget.
@ WC_BOOTSTRAP
Bootstrap; Window numbers:
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
@ WC_GENERATE_LANDSCAPE
Generate landscape (newgame); Window numbers:
@ WC_MESSAGE_HISTORY
News history list; Window numbers:
ClientSettings _settings_client
The current settings for this game.
@ WC_OSK
On Screen Keyboard; Window numbers:
WindowClass cls
Class of the window,.
int32_t dest_scrollpos_y
Current destination y coordinate to display (virtual screen coordinate of topleft corner of the viewp...
@ VSM_VIEWPORT_RMB_FIXED
Viewport moves with mouse movement on holding right mouse button, cursor position is fixed.
void HandleKeypress(uint keycode, char32_t key)
Handle keyboard input.
virtual void OnTimeout()
Called when this window's timeout has been reached.
Owner owner
The owner of the content shown in this window. Company colour is acquired from this variable.
@ WC_COMPANY
Company view; Window numbers:
virtual void OnPlacePresize([[maybe_unused]] Point pt, [[maybe_unused]] TileIndex tile)
The user moves over the map when a tile highlight mode has been set when the special mouse mode has b...
virtual Point GetCaretPosition() const
Get the current caret position if an edit box has the focus.
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
bool EditBoxInGlobalFocus()
Check if an edit box is in global focus.
static Point LocalGetWindowPlacement(const WindowDesc &desc, int16_t sm_width, int16_t sm_height, int window_number)
Compute the position of the top-left corner of a new window that is opened.
static void HandleAutoscroll()
If needed and switched on, perform auto scrolling (automatically moving window contents when mouse is...
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
static void StartWindowDrag(Window *w)
Start window dragging.
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 ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen, bool schedule_resize)
Resize the window.
const NWidgetCore * nested_focus
Currently focused nested widget, or nullptr if no nested widget has focus.
Data stored about a string that can be modified in the GUI.
static uint GetWindowZPriority(WindowClass wc)
Get the z-priority for a given window.
@ WC_GRF_PARAMETERS
NewGRF parameters; Window numbers:
std::vector< int > scheduled_invalidation_data
Data of scheduled OnInvalidateData() calls.
@ WC_SAVE_PRESET
Save preset; Window numbers:
virtual void OnEditboxChanged([[maybe_unused]] WidgetID widget)
The text in an editbox has been edited.
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
int _gui_scale
GUI scale, 100 is 100%.
virtual EventState OnCTRLStateChange()
The state of the control key has changed.
int32_t x_pos
x coordinate.
@ ZOOM_LVL_MIN
Minimum zoom level.
@ WC_HIGHSCORE
Highscore; Window numbers:
void NetworkReInitChatBoxSize()
Initialize all font-dependent chat box sizes.
void ProcessScheduledInvalidations()
Process all scheduled invalidations.
virtual void OnMouseDrag([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget)
An 'object' is being dragged at the provided position, highlight the target if possible.
@ PHD_UP
Above v is a safe position.
WindowPosition default_pos
Preferred position of the window.
High level window description.
constexpr int RoundDivSU(int a, uint b)
Computes round(a / b) for signed a and unsigned b.
@ WC_MODAL_PROGRESS
Progress report of landscape generation; Window numbers:
int ScaleGUITrad(int value)
Scale traditional pixel dimensions to GUI zoom level.
@ WF_SIZING_LEFT
Window is being resized towards the left.
int PositionStatusbar(Window *w)
(Re)position statusbar window at the screen.
void SetShaded(bool make_shaded)
Set the shaded state of the window to make_shaded.
@ WC_CONFIRM_POPUP_QUERY
Popup with confirm question; Window numbers:
static bool MayBeShown(const Window *w)
Returns whether a window may be shown or not.
constexpr bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
int PositionNewsMessage(Window *w)
(Re)position news message window at the screen.
@ WC_QUERY_STRING
Query string window; Window numbers:
Data structure for viewport, display of a part of the world.
void UnfocusFocusedWidget()
Makes no widget on this window have focus.
@ WDP_AUTO
Find a place automatically.
const char * ini_key
Key to store window defaults in openttd.cfg. nullptr if nothing shall be stored.
void ChangeVehicleViewports(VehicleID from_index, VehicleID to_index)
Switches viewports following vehicles, which get autoreplaced.
ResizeInfo resize
Resize information.
static int _input_events_this_tick
Local counter that is incremented each time an mouse input event is detected.
@ WSM_PRESIZE
Presizing mode (docks, tunnels).
int32_t WindowNumber
Number to differentiate different windows of the same class.
@ WC_BUY_COMPANY
Buyout company (merger); Window numbers:
static bool DescSorter(WindowDesc *const &a, WindowDesc *const &b)
Sort WindowDesc by ini_key.
@ FS_NORMAL
Index of the normal font in the font tables.
uint8_t auto_scrolling
scroll when moving mouse to the edge (see ViewportAutoscrolling)
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
void ProcessHighlightedInvalidations()
Process all invalidation of highlighted widgets.
virtual void OnMouseWheel([[maybe_unused]] int wheel)
The mouse wheel has been turned.
void CloseNonVitalWindows()
Try to close a non-vital window.
std::unique_ptr< NWidgetBase > nested_root
Root of the nested tree.
void ReInitAllWindows(bool zoom_changed)
Re-initialize all windows.
void ScheduleResize()
Mark this window as resized and in need of OnResize() event.
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
WindowNumber window_number
The WindowNumber of the window that is responsible for the selection mode.
const std::chrono::milliseconds TIME_BETWEEN_DOUBLE_CLICK(500)
Time between 2 left clicks before it becoming a double click.
int height
Height of the window (number of pixels down in y direction)
@ WF_CENTERED
Window is centered and shall stay centered after ReInit.
@ WF_WHITE_BORDER
Window white border counter bit mask.
int32_t dest_scrollpos_x
Current destination x coordinate to display (virtual screen coordinate of topleft corner of the viewp...
int16_t pref_height
User-preferred height of the window. Zero if unset.
SpecialMouseMode
Mouse modes.
static const VehicleID INVALID_VEHICLE
Constant representing a non-existing vehicle.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
uint16_t bytes
the current size of the string in bytes (including terminating '\0')
int left
Screen coordinate left edge of the viewport.
@ SBI_NEWS_DELETED
abort current news display (active news were deleted)
virtual void OnDragDrop([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget)
A dragged 'object' has been released.
virtual void OnFocus()
The window has gained focus.
bool SaveToDisk(const std::string &filename)
Save the Ini file's data to the disk.
@ ES_NOT_HANDLED
The passed event is not handled.
static void DispatchMouseWheelEvent(Window *w, NWidgetCore *nwid, int wheel)
Dispatch the mousewheel-action to the window.
ptrdiff_t GetCharAtPosition(const Window *w, WidgetID wid, const Point &pt) const
Get the character that is rendered at a position.
void RelocateAllWindows(int neww, int newh)
Relocate all windows to fit the new size of the game application screen.
static Point GetAutoPlacePosition(int width, int height)
Find a good place for opening a new window of a given width and height.
void Close([[maybe_unused]] int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
static void PreventHiding(int *nx, int *ny, const Rect &rect, const Window *v, int px, PreventHideDirection dir)
Do not allow hiding of the rectangle with base coordinates nx and ny behind window v.
void DisableAllWidgetHighlight()
Disable the highlighted status of all widgets.
int16_t GetDefaultHeight() const
Determine default height of window.
virtual bool OnTooltip([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget, [[maybe_unused]] TooltipCloseCondition close_cond)
Event to display a custom tooltip.
WindowDesc(WindowPosition default_pos, const char *ini_key, int16_t def_width_trad, int16_t def_height_trad, WindowClass window_class, WindowClass parent_class, uint32_t flags, const std::span< const NWidgetPart > nwid_parts, HotkeyList *hotkeys=nullptr, const std::source_location location=std::source_location::current())
Window description constructor.
void ProcessPendingPerformanceMeasurements()
This drains the PFE_SOUND measurement data queue into _pf_data.
Rect GetBoundingRect(const Window *w, WidgetID wid, const char *from, const char *to) const
Get the bounding rectangle for a range of the query string.
int GetMainViewTop()
Return the top of the main view available for general use.
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
static Blitter * GetCurrentBlitter()
Get the current active blitter (always set by calling SelectBlitter).
bool HasModalProgress()
Check if we are currently in a modal progress state.
static void DrawOverlappedWindow(Window *w, int left, int top, int right, int bottom)
Generate repaint events for the visible part of window w within the rectangle.
static void NewEvent(class ScriptEvent *event)
Queue a new event for a Game Script.
static void DeleteClosedWindows()
Delete all closed windows.
Window * parent
Parent window.
void CallWindowGameTickEvent()
Dispatch OnGameTick event over all windows.
Point GetToolbarAlignedWindowPosition(int window_width)
Computer the position of the top-left corner of a window to be opened right under the toolbar.
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
int left
x position of left edge of the window
WindowFlags flags
Window flags.
WindowList _z_windows
List of windows opened at the screen sorted from the front to back.
WindowDesc & window_desc
Window description.
@ WF_TIMEOUT
Window timeout counter.
bool fix_at
mouse is moving, but cursor is not (used for scrolling)
@ WC_SHIPS_LIST
Ships list; Window numbers:
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
WindowClass
Window classes.
virtual void ShowNewGRFInspectWindow() const
Show the NewGRF inspection window.
const QueryString * GetQueryString(WidgetID widnum) const
Return the querystring associated to a editbox.
void HandleCtrlChanged()
State of CONTROL key has changed.
bool _mouse_hovering
The mouse is hovering over the same point.
void IConsoleResize(Window *w)
Change the size of the in-game console window after the screen size changed, or the window state chan...
bool _networking
are we in networking mode?
bool _shift_pressed
Is Shift pressed?
int wheel
mouse wheel movement
static int PositionWindow(Window *w, WindowClass clss, int setting)
(Re)position a window at the screen.
static void HandleMouseOver()
Report position of the mouse to the underlying window.
void DrawDirtyBlocks()
Repaints the rectangle blocks which are marked as 'dirty'.
uint32_t VehicleID
The type all our vehicle IDs have.
@ WDF_MODAL
The window is a modal child of some other window, meaning the parent is 'inactive'.
@ PFE_DRAWING
Speed of drawing world and GUI.
@ VSM_MAP_RMB_FIXED
Map moves with mouse movement on holding right mouse button, cursor position is fixed.
Coordinates of a point in 2D.
@ WF_HIGHLIGHTED
Window has a widget that has a highlight.
bool ScrollMainWindowTo(int x, int y, int z, bool instant)
Scrolls the main window to given coordinates.
bool FocusedWindowIsConsole()
Check if a console is focused.
void NetworkUndrawChatMessage()
Hide the chatbox.
@ WC_TRAINS_LIST
Trains list; Window numbers:
@ WDF_NO_CLOSE
This window can't be interactively closed.
@ WSM_DRAGDROP
Drag&drop an object.
virtual void OnInit()
Notification that the nested widget tree gets initialized.
static bool Elapsed(TElapsed value)
Called when time for this timer elapsed.
Dimension unshaded_size
Last known unshaded size (only valid while shaded).
bool _network_dedicated
are we a dedicated server?
uint8_t scroll_mode
viewport scroll mode
static void SaveToConfig()
Save all WindowDesc settings to _windows_file.
Point GetCaretPosition(const Window *w, WidgetID wid) const
Get the current caret position.
WindowNumber window_number
Window number within the window class.
bool SetFocusedWidget(WidgetID widget_index)
Set focus within this window to the given widget.
uint step_height
Step-size of height resize changes.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
virtual void InsertTextString(WidgetID wid, const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end)
Insert a text string at the cursor position into the edit box widget.
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
void HandleMouseEvents()
Handle a mouse event from the video driver.
Iterable ensemble of all valid Windows.
bool scheduled_resize
Set if window has been resized.
int32_t z_pos
z coordinate.
static void DispatchRightClickEvent(Window *w, int x, int y)
Dispatch right mouse-button click in window.
static bool IsGoodAutoPlace2(int left, int top, int width, int height, int toolbar_y, Point &pos)
Decide whether a given rectangle is a good place to open a mostly visible new window.
static EventState HandleViewportScroll()
Handle viewport scrolling with the mouse.
static IntervalTimer< TimerWindow > highlight_interval(std::chrono::milliseconds(450), [](auto) { _window_highlight_colour=!_window_highlight_colour;})
Blink the window highlight colour constantly.
std::map< WidgetID, QueryString * > querystrings
QueryString associated to WWT_EDITBOX widgets.
std::string _windows_file
Config file to store WindowDesc.
int cancel_button
Widget button of parent window to simulate when pressing CANCEL in OSK.
@ VA_EVERY_VIEWPORT
Scroll all viewports at their edges.
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
Shows a tooltip.
@ WC_GAME_OPTIONS
Game options window; Window numbers:
virtual void OnMouseLoop()
Called for every mouse loop run, which is at least once per (game) tick.
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
uint step_width
Step-size of width resize changes.
@ VSM_MAP_LMB
Map moves with mouse movement on holding left mouse button, cursor moves.
@ MAX_OFFSET_DOUBLE_CLICK
How much the mouse is allowed to move to call it a double click.
Ini file that supports both loading and saving.
bool IsShaded() const
Is window shaded currently?
virtual void OnRealtimeTick([[maybe_unused]] uint delta_ms)
Called periodically.
int16_t default_width_trad
Preferred initial width of the window (pixels at 1x zoom).
virtual void * MoveTo(void *video, int x, int y)=0
Move the destination pointer the requested amount x and y, keeping in mind any pitch and bpp of the r...
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
ViewportAutoscrolling
Values for _settings_client.gui.auto_scrolling.
static std::vector< Window * > closed_windows
List of closed windows to delete.
void CloseChildWindows(WindowClass wc=WC_INVALID) const
Close all children a window might have in a head-recursive manner.
void UnshowCriticalError()
Unshow the critical error.
constexpr T abs(const T a)
Returns the absolute value of (scalar) variable.
@ VA_MAIN_VIEWPORT_FULLSCREEN
Scroll main viewport at edge when using fullscreen.
@ WC_SCEN_LAND_GEN
Landscape generation (in Scenario Editor); Window numbers:
static void DispatchHoverEvent(Window *w, int x, int y)
Dispatch hover of the mouse over a window.
@ NO_DIRECTORY
A path without any base directory.
@ WC_NETWORK_WINDOW
Network window; Window numbers:
uint8_t toolbar_pos
position of toolbars, 0=left, 1=center, 2=right
Window * GetMainWindow()
Get the main window, i.e.
@ WC_CONSOLE
Console; Window numbers:
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
virtual Rect GetTextBoundingRect(const char *from, const char *to) const
Get the bounding rectangle for a text range if an edit box has the focus.
int CheckMatch(uint16_t keycode, bool global_only=false) const
Check if a keycode is bound to something.
@ WC_NETWORK_STATUS_WINDOW
Network status window; Window numbers:
virtual void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true)
Some data on this window has become invalid.
@ WC_TOOLTIPS
Tooltip window; Window numbers:
bool _window_highlight_colour
If false, highlight is white, otherwise the by the widget defined colour.
virtual void OnPaint()
The window must be repainted.
Point delta
relative mouse movement in this tick
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc)
Save a WindowDesc to config.
@ WC_COMPANY_INFRASTRUCTURE
Company infrastructure overview; Window numbers:
@ HKPR_CANCEL
Escape key pressed.
EventState VpHandlePlaceSizingDrag()
Handle the mouse while dragging for placement/resizing.
EventState
State of handling an event.
void InitDepotWindowBlockSizes()
Set the size of the blocks in the window so we can be sure that they are big enough for the vehicle s...
bool pref_sticky
Preferred stickyness.
WidgetID mouse_capture_widget
ID of current mouse capture widget (e.g. dragged scrollbar). -1 if no widget has mouse capture.
@ WF_DRAGGING
Window is being dragged.
uint8_t window_soft_limit
soft limit of maximum number of non-stickied non-vital windows (0 = no limit)
@ WC_NETWORK_ASK_RELAY
Network ask relay window; Window numbers:
Window * FindWindowByClass(WindowClass cls)
Find any window by its class.
WindowClass window_class
Window class.
uint8_t scrollwheel_scrolling
scrolling using the scroll wheel?
static const int8_t scrollamt[16][2]
Describes all the different arrow key combinations the game allows when it is in scrolling mode.
virtual bool OnRightClick([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget)
A click with the right mouse button has been made on the window.
@ WC_MAIN_WINDOW
Main window; Window numbers:
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
WidgetLookup widget_lookup
Indexed access to the nested widget tree. Do not access directly, use Window::GetWidget() instead.
virtual void OnDropdownSelect([[maybe_unused]] WidgetID widget, [[maybe_unused]] int index)
A dropdown option associated to this window has been selected.
static bool IsGoodAutoPlace1(int left, int top, int width, int height, int toolbar_y, Point &pos)
Decide whether a given rectangle is a good place to open a completely visible new window.
void UpdateViewportPosition(Window *w, uint32_t delta_ms)
Update the viewport position being displayed.
static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count)
Dispatch left mouse-button (possibly double) click in window.
@ WC_ENDSCREEN
Endscreen; Window numbers:
PreventHideDirection
Direction for moving the window.
static const int ACTION_CLEAR
Clear editbox.
void UpdateQueryStringSize()
Update size of all QueryStrings of this window.
int top
y position of top edge of the window
int32_t y_pos
y coordinate.
Viewport * IsPtInWindowViewport(const Window *w, int x, int y)
Is a xy position inside the viewport of the window?
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
void ChangeWindowOwner(Owner old_owner, Owner new_owner)
Change the owner of all the windows one company can take over from another company in the case of a c...
virtual void OnHover([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget)
The mouse is hovering over a widget in the window, perform an action for it.
@ WC_SEND_NETWORK_MSG
Chatbox; Window numbers:
VehicleID follow_vehicle
VehicleID to follow if following a vehicle, INVALID_VEHICLE otherwise.
static EventState HandleActiveWidget()
Handle active widget (mouse draggin on widget) with the mouse.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
int width
width of the window (number of pixels to the right in x direction)
static void LoadFromConfig()
Load all WindowDesc settings from _windows_file.
ZoomLevel zoom
The zoom level of the viewport.
void DrawOverlappedWindowForAll(int left, int top, int right, int bottom)
From a rectangle that needs redrawing, find the windows that intersect with the rectangle.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
WindowClass window_class
The WindowClass of the window that is responsible for the selection mode.
static EventState HandleMouseDragDrop()
Handle dragging and dropping in mouse dragging mode (WSM_DRAGDROP).
uint8_t window_snap_radius
windows snap at each other if closer than this
void IConsoleClose()
Close the in-game console.
static Point _drag_delta
delta between mouse cursor and upper left corner of dragged window
static bool _dragging_window
A window is being dragged or resized.
void NetworkDrawChatMessage()
Draw the chat message-box.
int GetRowFromWidget(int clickpos, WidgetID widget, int padding, int line_height=-1) const
Compute the row of a widget that a user clicked in.
std::vector< WindowDesc * > * _window_descs
List of all WindowDescs.
int scale
Scale of this window – used to determine how to resize.
static debug_inline TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
void ResetWindowSystem()
Reset the windowing system, by means of shutting it down followed by re-initialization.
static EventState HandleWindowDragging()
Handle dragging/resizing of a window.
int PositionNetworkChatWindow(Window *w)
(Re)position network chat window at the screen.
virtual void EditBoxLostFocus()
An edit box lost the input focus.
void CloseAllNonVitalWindows()
It is possible that a stickied window gets to a position where the 'close' button is outside the gami...
WindowClass parent_cls
Class of the parent window.
const std::span< const NWidgetPart > nwid_parts
Span of nested widget parts describing the window.
Data structure for an opened window.
static const int ACTION_DESELECT
Deselect editbox.
void InputLoop()
Regular call from the global game loop.
@ WC_STATUS_BAR
Statusbar (at the bottom of your screen); Window numbers:
@ WC_NEWS_WINDOW
News window; Window numbers:
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
void CloseConstructionWindows()
Close all windows that are used for construction of vehicle etc.
virtual void OnMouseOver([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget)
The mouse is currently moving over the window or has just moved outside of the window.
@ WC_FINANCES
Finances of a company; Window numbers:
@ HKPR_NOT_HANDLED
Key does not affect editboxes.
@ WC_ERRMSG
Error message; Window numbers:
void SetWidgetHighlight(WidgetID widget_index, TextColour highlighted_colour)
Sets the highlighted status of a widget.
@ WC_SCRIPT_SETTINGS
Script settings; Window numbers:
static Window * _last_scroll_window
Window of the last scroll event.
int16_t GetDefaultWidth() const
Determine default width of window.
void LoadFromDisk(const std::string &filename, Subdirectory subdir)
Load the Ini file's data from the disk.
@ WC_SCRIPT_LIST
Scripts list; Window numbers:
int GetMainViewBottom()
Return the bottom of the main view available for general use.
void CallWindowRealtimeTickEvent(uint delta_ms)
Dispatch OnRealtimeTick event over all windows.
Specification of a rectangle with absolute coordinates of all edges.
Point pos
logical mouse position
@ WC_DROPDOWN_MENU
Drop down menu; Window numbers:
Window * BringWindowToFrontById(WindowClass cls, WindowNumber number)
Find a window and make it the relative top-window on the screen.
bool _right_button_clicked
Is right mouse button clicked?
bool IsLocalCompany()
Is the current company the local company?
int ScaleByZoom(int value, ZoomLevel zoom)
Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_MIN) When shifting right,...
EventState HandleEditBoxKey(WidgetID wid, char32_t key, uint16_t keycode)
Process keypress for editbox widget.
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
@ WC_SPRITE_ALIGNER
Sprite aligner (debug); Window numbers:
constexpr T ClrBit(T &x, const uint8_t y)
Clears a bit in a variable.
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting)
@ WC_AIRCRAFT_LIST
Aircraft list; Window numbers:
void SetWindowWidgetDirty(WindowClass cls, WindowNumber number, WidgetID widget_index)
Mark a particular widget in a particular window as dirty (in need of repainting)
virtual void OnResize()
Called after the window got resized.
bool in_window
mouse inside this window, determines drawing logic
#define CLRBITS(x, y)
Clears several bits in a variable.
@ WC_TEXTFILE
textfile; Window numbers:
HotkeyList * hotkeys
Hotkeys for the window.
@ WC_STATION_LIST
Station list; Window numbers:
WindowPosition
How do we the window to be placed?
virtual void OnClick([[maybe_unused]] Point pt, [[maybe_unused]] WidgetID widget, [[maybe_unused]] int click_count)
A click with the left mouse button has been made on the window.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
bool _scrolling_viewport
A viewport is being scrolled with the mouse.
@ WC_SMALLMAP
Small map; Window numbers:
@ WDP_CENTER
Center the window.
bool _left_button_clicked
Is left mouse button clicked?
static bool MaybeBringWindowToFront(Window *w)
Check if a window can be made relative top-most window, and if so do it.
void DeleteAll()
Delete every character in the textbuffer.
@ TD_RTL
Text is written right-to-left by default.
TextDirection _current_text_dir
Text direction of the currently selected language.
uint16_t hover_delay_ms
time required to activate a hover event, in milliseconds
uint8_t _dirkeys
1 = left, 2 = up, 4 = right, 8 = down
static void EnsureVisibleCaption(Window *w, int nx, int ny)
Make sure at least a part of the caption bar is still visible by moving the window if necessary.
RightClickClose right_click_wnd_close
close window with right click
bool _right_button_down
Is right mouse button pressed?
uint8_t white_border_timer
Timer value of the WF_WHITE_BORDER for flags.
virtual EventState OnKeyPress([[maybe_unused]] char32_t key, [[maybe_unused]] uint16_t keycode)
A key has been pressed.
@ PFE_DRAWWORLD
Time spent drawing world viewports in GUI.
@ WC_VEHICLE_ORDERS
Vehicle orders; Window numbers:
GUISettings gui
settings related to the GUI
virtual void EditBoxGainedFocus()
An edit box gained the input focus.
void InitializeData(WindowNumber window_number)
Initializes the data (except the position and initial size) of a new Window.
Point selend
The location where the drag currently ends.
void HandleToolbarHotkey(int hotkey)
Handle Toolbar hotkey events - can come from a source like the MacBook Touch Bar.
@ VA_MAIN_VIEWPORT
Scroll main viewport at edge.
Window * GetCallbackWnd()
Get the window that started the current highlighting.
Window * FindChildWindow(WindowClass wc=WC_INVALID) const
Find the Window whose parent pointer points to this window.
Data about how and where to blit pixels.
@ HKPR_CURSOR
Non-text change, e.g. cursor position.
void Reset()
Reset tile highlighting.
virtual void FindWindowPlacementAndResize(int def_width, int def_height)
Resize window towards the default size.
static const int ACTION_NOTHING
Nothing.
Helper/buffer for input fields.
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
void ProcessScheduledResize()
Process scheduled OnResize() event.
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.