11#include "../strings_func.h"
24#include "../window_func.h"
25#include "../gfx_func.h"
26#include "../dropdown_type.h"
27#include "../dropdown_func.h"
28#include "../querystring_gui.h"
29#include "../sortlist_type.h"
30#include "../company_func.h"
31#include "../command_func.h"
32#include "../core/geometry_func.hpp"
33#include "../genworld.h"
34#include "../map_type.h"
35#include "../zoom_func.h"
37#include "../settings_internal.h"
38#include "../company_cmd.h"
39#include "../timer/timer.h"
40#include "../timer/timer_window.h"
41#include "../timer/timer_game_calendar.h"
42#include "../textfile_gui.h"
44#include "../widgets/network_widget.h"
46#include "table/strings.h"
47#include "../table/sprites.h"
49#include "../stringfilter_type.h"
52# include <emscripten.h>
55#include "../safeguards.h"
57static void ShowNetworkStartServerWindow();
75 list.push_back(MakeDropDownListStringItem(STR_NETWORK_SERVER_VISIBILITY_LOCAL, SERVER_GAME_TYPE_LOCAL));
76 list.push_back(MakeDropDownListStringItem(STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY, SERVER_GAME_TYPE_INVITE_ONLY));
77 list.push_back(MakeDropDownListStringItem(STR_NETWORK_SERVER_VISIBILITY_PUBLIC, SERVER_GAME_TYPE_PUBLIC));
83typedef int ServerListPosition;
84static const ServerListPosition SLP_INVALID = -1;
92 auto leaf = std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_NAME,
WidgetData{.string = STR_NETWORK_SERVER_LIST_GAME_NAME}, STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP);
93 leaf->SetResize(1, 0);
95 this->
Add(std::move(leaf));
99 this->
Add(std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_DATE,
WidgetData{.string = STR_NETWORK_SERVER_LIST_DATE_CAPTION}, STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP));
100 this->
Add(std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_YEARS,
WidgetData{.string = STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION}, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP));
104 this->
Add(std::move(leaf));
116 for (
const auto &child_wid : this->
children) {
117 child_wid->SetupSmallestSize(w);
118 this->
smallest_y = std::max(this->
smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
122 for (
const auto &child_wid : this->
children) {
123 child_wid->current_x = child_wid->smallest_x;
128 this->ApplyAspectRatio();
140 given_width -= this->
children.back()->smallest_x;
143 auto first = std::next(std::begin(this->
children));
144 auto last = std::prev(std::end(this->
children));
145 for (
auto it = first; it != last; ++it) {
146 auto &child_wid = *it;
148 given_width -= child_wid->smallest_x;
149 child_wid->current_x = child_wid->smallest_x;
151 child_wid->current_x = 0;
157 this->
children.front()->current_x = given_width;
161 auto assign_position = [&](
const std::unique_ptr<NWidgetBase> &child_wid) {
162 if (child_wid->current_x != 0) {
163 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
164 position += child_wid->current_x;
169 std::for_each(std::rbegin(this->
children), std::rend(this->
children), assign_position);
171 std::for_each(std::begin(this->
children), std::end(this->
children), assign_position);
182 static const std::initializer_list<GUIGameServerList::SortFunction * const> sorter_funcs;
183 static const std::initializer_list<GUIGameServerList::FilterFunction * const> filter_funcs;
207 this->servers.clear();
212 this->servers.push_back(
ngl);
213 if (
ngl == this->server) {
216 if (
ngl == this->last_joined) {
222 this->last_joined =
nullptr;
225 this->server =
nullptr;
226 this->list_pos = SLP_INVALID;
241 this->vscroll->
SetCount(this->servers.size());
244 this->servers.
Sort();
328 auto it = std::ranges::find(this->servers, this->server);
329 if (it == std::end(this->servers)) {
330 this->list_pos = SLP_INVALID;
332 this->list_pos =
static_cast<ServerListPosition
>(std::distance(std::begin(this->servers), it));
339 assert((*item) !=
nullptr);
342 sf.
AddLine((*item)->info.server_name);
359 Rect r = {std::min(name.left, info.left), y, std::max(name.right, info.right), y + (
int)this->
resize.
step_height - 1};
373 Rect clients =
nwid->GetCurrentRect();
416 PaletteID pal =
cur_item->info.compatible ? PALETTE_TO_GREEN : (
cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED);
430 if (this->list_pos == SLP_INVALID)
return;
437 this->list_pos = SLP_INVALID;
438 this->server =
nullptr;
463 this->servers.
SetSortFuncs(NetworkGameWindow::sorter_funcs);
470 this->last_sorting = this->servers.
GetListing();
485 size.height = 12 *
resize.height;
493 size.width = NWidgetScrollbar::GetVerticalDimension().width;
525 size.height = std::max(this->lock.height,
this->blot.height) + padding.height;
537 for (
auto it = first; it !=
last; ++it) {
547 if (this->last_joined !=
nullptr) this->
DrawServerLine(this->last_joined, r.top,
this->last_joined ==
this->server);
551 this->DrawDetails(r);
608 switch (this->server->
status) {
614 default: NOT_REACHED();
618 void DrawDetails(
const Rect &r)
const
630 tr.top += header_height;
636 if (sel ==
nullptr)
return;
707 if (this->list_pos != SLP_INVALID) this->list_pos = (ServerListPosition)this->servers.size() - this->list_pos - 1;
719 this->server = (it != this->servers.end()) ? *it :
nullptr;
720 this->list_pos = (
server ==
nullptr) ? SLP_INVALID : it - this->servers.begin();
729 if (this->last_joined !=
nullptr) {
745 this->searched_internet =
true;
762 ShowNetworkStartServerWindow();
766 if (this->server !=
nullptr) {
802 if (this->list_pos == SLP_INVALID)
return ES_HANDLED;
804 this->server = this->servers[this->
list_pos];
814 if (this->server !=
nullptr) {
815 if (keycode == WKC_DELETE) {
817 if (this->server == this->last_joined) this->last_joined =
nullptr;
818 this->server =
nullptr;
819 this->list_pos = SLP_INVALID;
847 if (!str.has_value() || str->empty())
return;
851 NetworkRebuildHostList();
861 if (!this->searched_internet)
return;
867Listing NetworkGameWindow::last_sorting = {
false, 5};
868const std::initializer_list<GUIGameServerList::SortFunction * const> NetworkGameWindow::sorter_funcs = {
872 &NGameCalendarDateSorter,
873 &NGameTicksPlayingSorter,
877const std::initializer_list<GUIGameServerList::FilterFunction * const> NetworkGameWindow::filter_funcs = {
881static std::unique_ptr<NWidgetBase> MakeResizableHeader()
883 return std::make_unique<NWidgetServerListHeader>();
886static constexpr NWidgetPart _nested_network_game_widgets[] = {
901 SetStringTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
916 SetToolTip(STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST_TOOLTIP),
927 SetStringTip(STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE, STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP),
968 _nested_network_game_widgets
971void ShowNetworkGameWindow()
973 static bool first =
true;
1024 size.width += padding.width;
1025 size.height += padding.height;
1043 ShowNetworkGameWindow();
1063 default: NOT_REACHED();
1088 if (!CheckServerName())
return;
1098 if (!CheckServerName())
return;
1104 if (!CheckServerName())
return;
1110 if (!CheckServerName())
return;
1130 bool CheckServerName()
1132 std::string str = this->name_editbox.text.
GetText();
1146 if (!str.has_value())
return;
1153 switch (this->widget_id) {
1154 default: NOT_REACHED();
1164static constexpr NWidgetPart _nested_network_start_server_window_widgets[] = {
1231static WindowDesc _network_start_server_window_desc(
1235 _nested_network_start_server_window_widgets
1238static void ShowNetworkStartServerWindow()
1252static constexpr NWidgetPart _nested_client_list_widgets[] = {
1264 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_CL_SERVER_NAME),
SetFill(1, 0),
SetResize(1, 0),
SetStringTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1275 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_CL_SERVER_INVITE_CODE),
SetFill(1, 0),
SetResize(1, 0),
SetStringTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1279 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_CL_SERVER_CONNECTION_TYPE),
SetFill(1, 0),
SetResize(1, 0),
SetStringTip(STR_JUST_STRING, STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1287 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_CL_CLIENT_NAME),
SetFill(1, 0),
SetResize(1, 0),
SetStringTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1294 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_CL_MATRIX),
SetMinimalSize(180, 0),
SetResize(1, 1),
SetFill(1, 1),
SetMatrixDataTip(1, 0),
SetScrollbar(
WID_CL_SCROLLBAR),
1299 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_CL_CLIENT_COMPANY_COUNT),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(
WidgetDimensions::unscaled.framerect),
SetAlignment(
SA_CENTER),
SetStringTip(STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT, STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT_TOOLTIP),
1306 WDP_AUTO,
"list_clients", 220, 300,
1309 _nested_client_list_widgets
1317 DD_CLIENT_ADMIN_KICK,
1318 DD_CLIENT_ADMIN_BAN,
1319 DD_COMPANY_ADMIN_RESET,
1389template <
typename T>
1402 assert(
proc !=
nullptr);
1409 this->
proc(w, pt, this->
id);
1433 std::map<uint, std::vector<std::unique_ptr<ButtonCommon>>>
buttons;
1485 wi_rect.left =
pt.x;
1486 wi_rect.right =
pt.x;
1488 wi_rect.bottom =
pt.y;
1490 w->dd_client_id = client_id;
1506 wi_rect.left =
pt.x;
1507 wi_rect.right =
pt.x;
1509 wi_rect.bottom =
pt.y;
1545 this->line_count += 1;
1549 if (ci->client_playas !=
company_id)
continue;
1562 this->line_count += 1;
1577 this->buttons.clear();
1578 this->line_count = 0;
1579 this->player_host_index = -1;
1580 this->player_self_index = -1;
1585 this->line_count += 1;
1594 if (c->index == client_playas)
continue;
1602 this->vscroll->
SetCount(this->line_count);
1616 uint x =
rtl ? matrix.left : matrix.right;
1620 if (
button_find == this->buttons.end())
return nullptr;
1624 uint
left =
rtl ? x : x - button->width;
1625 uint right =
rtl ? x + button->width : x;
1628 return button.get();
1677 size.width = std::min(size.width,
static_cast<uint
>(
ScaleGUITrad(200)));
1682 size.width += padding.width;
1683 size.height += padding.height;
1694 size.height = std::max(size.height, 5 *
this->line_height);
1717 static std::string empty = {};
1766 if (button ==
nullptr)
break;
1793 if (index == this->player_self_index) {
1796 }
else if (index == this->player_host_index) {
1803 if (button ==
nullptr)
return false;
1836 case DD_CLIENT_ADMIN_KICK:
1843 case DD_CLIENT_ADMIN_BAN:
1850 case DD_COMPANY_ADMIN_RESET:
1862 assert(callback !=
nullptr);
1879 if (!str.has_value())
return;
1881 switch (this->query_widget) {
1882 default: NOT_REACHED();
1914 for (
auto &button :
buttons) {
1917 int offset = (this->line_height - button->height) / 2;
1918 r.left =
rtl ? x : x - button->width + 1;
1919 r.right =
rtl ? x + button->width - 1 : x;
1921 r.bottom = r.top + button->height - 1;
1925 if (button->disabled) {
1951 uint y = r.top + (this->line_height * (line -
line_start));
1957 int &x =
rtl ?
tr.left :
tr.right;
1984 if (ci->client_playas !=
company_id)
continue;
1993 int &x =
rtl ?
tr.left :
tr.right;
2027 if (this->hover_index >= 0) {
2044 if (client_playas == c->index)
continue;
2059 if (this->hover_index != -1) {
2060 this->hover_index = -1;
2065 if (index != this->hover_index) {
2066 this->hover_index = index;
2073void ShowClientList()
2075 AllocateWindowDescFront<NetworkClientListWindow>(_client_list_desc, 0);
2084 std::shared_ptr<NetworkAuthenticationPasswordRequest> request;
2101 case NETWORK_JOIN_STATUS_CONNECTING:
2102 case NETWORK_JOIN_STATUS_AUTHORIZING:
2103 case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
2106 case NETWORK_JOIN_STATUS_WAITING:
2109 case NETWORK_JOIN_STATUS_DOWNLOADING:
2127 case NETWORK_JOIN_STATUS_WAITING:
2131 case NETWORK_JOIN_STATUS_DOWNLOADING:
2148 for (uint i = 0; i < NETWORK_JOIN_STATUS_END; i++) {
2174 ShowNetworkGameWindow();
2180 if (!str.has_value() || str->empty() ||
this->request ==
nullptr) {
2185 this->request->Reply(*str);
2189static constexpr NWidgetPart _nested_network_join_status_window_widgets[] = {
2200static WindowDesc _network_join_status_window_desc(
2204 _nested_network_join_status_window_widgets
2207void ShowJoinStatusWindow()
2213void ShowNetworkNeedPassword(std::shared_ptr<NetworkAuthenticationPasswordRequest> request)
2216 if (w ==
nullptr)
return;
2217 w->request = request;
2300static constexpr NWidgetPart _nested_network_ask_relay_widgets[] = {
2321 _nested_network_ask_relay_widgets
2330void ShowNetworkAskRelay(
const std::string &server_connection_string,
const std::string &relay_connection_string,
const std::string &token)
2335 new NetworkAskRelayWindow(_network_ask_relay_desc, parent, server_connection_string, relay_connection_string, token);
2375 ShowSurveyResultTextfileWindow();
2395static constexpr NWidgetPart _nested_network_ask_survey_widgets[] = {
2419 _nested_network_ask_survey_widgets
2428 if constexpr (!NetworkSurveyHandler::IsSurveyPossible())
return;
2442 this->ConstructWindow();
2450void ShowSurveyResultTextfileWindow()
void ConnectFailure(const std::string &token, uint8_t tracking_number)
Callback from a Connecter to let the Game Coordinator know the connection failed.
void GetListing()
Request a listing of all public servers.
constexpr bool Test(Tenum value) const
Test if the enum value is set.
List template of 'things' T to sort in a GUI.
bool Filter(FilterFunction *decide, F filter_data)
Filter the list.
void RebuildDone()
Notify the sortlist that the rebuild is done.
void SetListing(Listing l)
Import sort conditions.
void SetFilterState(bool state)
Enable or disable the filter.
bool IsDescSortOrder() const
Check if the sort order is descending.
void ToggleSortOrder()
Toggle the sort order Since that is the worst condition for the sort function reverse the list here.
void SetFilterFuncs(std::span< FilterFunction *const > n_funcs)
Hand the filter function pointers to the GUIList.
bool NeedRebuild() const
Check if a rebuild is needed.
void ForceRebuild()
Force that a rebuild is needed.
bool Sort(Comp compare)
Sort the list.
void ForceResort()
Force a resort next Sort call Reset the resort timer if used too.
uint8_t SortType() const
Get the sorttype of the list.
Listing GetListing() const
Export current sort conditions.
void SetSortFuncs(std::span< SortFunction *const > n_funcs)
Hand the sort function pointers to the GUIList.
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0.
void SetSortType(uint8_t n_type)
Set the sorttype of the list.
An interval timer will fire every interval, and will continue to fire until it is deleted.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void OnPaint() override
The window must be repainted.
static bool NGameClientSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by the amount of clients online on a server.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
static bool NGameMapSizeSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by map size.
QueryString filter_editbox
Editbox for filter on servers.
Scrollbar * vscroll
Vertical scrollbar of the list of servers.
NetworkGameList * last_joined
The last joined server.
static bool NGameAllowedSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by joinability.
NetworkGameList * server
Selected server.
void BuildGUINetworkGameList()
Dimension of compatibility icon.
void UpdateListPos()
Set this->list_pos to match this->server.
IntervalTimer< TimerWindow > refresh_interval
Refresh the online servers on a regular interval.
void OnInit() override
Notification that the nested widget tree gets initialized.
static bool NGameNameSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by name.
void DrawServerLine(const NetworkGameList *cur_item, int y, bool highlight) const
Draw a single server line.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
static bool NGameCalendarDateSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by calendar date.
void OnResize() override
Called after the window got resized.
void ScrollToSelectedServer()
Scroll the list up or down to the currently selected server.
void OnEditboxChanged(WidgetID wid) override
The text in an editbox has been edited.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
ServerListPosition list_pos
Position of the selected server.
static bool NGameTicksPlayingSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by the number of ticks the game is running.
void SortNetworkGameList()
Sort the server list.
Dimension blot
Dimension of lock icon.
GUIGameServerList servers
List with game servers.
bool searched_internet
Did we ever press "Search Internet" button?
QueryString name_editbox
Client name editbox.
EventState OnKeyPress(char32_t key, uint16_t keycode) override
A key has been pressed.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
@ PREVIEW
User is previewing the survey result.
static constexpr TimerGameTick::Ticks TICKS_PER_SECOND
Estimation of how many ticks fit in a single second.
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
CompanyID _current_company
Company currently doing an action.
@ CCA_DELETE
Delete a company.
@ CCA_NEW
Create a new company.
@ CALCA_ADD
Create a public key.
Owner
Enum for all companies/owners.
@ INVALID_COMPANY
An invalid company.
@ COMPANY_SPECTATOR
The client is spectating.
@ COMPANY_NEW_COMPANY
The client wants a new company.
@ MAX_COMPANIES
Maximum number of companies.
@ CRR_NONE
Dummy reason for actions that don't need one.
@ CRR_MANUAL
The company is manually removed.
static const uint NETWORK_CLIENT_NAME_LENGTH
The maximum length of a client's name, in bytes including '\0'.
static const uint NETWORK_HOSTNAME_PORT_LENGTH
The maximum length of the host name + port, in bytes including '\0'. The extra six is ":" + port numb...
static const uint NETWORK_NAME_LENGTH
The maximum length of the server name and map name, in bytes including '\0'.
static const std::string NETWORK_SURVEY_DETAILS_LINK
Link with more details & privacy statement of the survey.
static const uint NETWORK_PASSWORD_LENGTH
The maximum length of the password, in bytes including '\0'.
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, bool instant_close, bool persist)
Show a drop down list.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23)
@ SLO_LOAD
File is being loaded.
@ FT_SCENARIO
old or new scenario
@ FT_HEIGHTMAP
heightmap file
@ FT_SAVEGAME
old or new savegame
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
static const uint32_t GENERATE_NEW_SEED
Create a new random seed.
void StartNewGameWithoutGUI(uint32_t seed)
Start a normal game without the GUI.
void ShowGenerateLandscape()
Start with a normal game.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
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.
bool _ctrl_pressed
Is Ctrl pressed?
bool _left_button_clicked
Is left mouse button clicked?
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.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
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.
Dimension GetScaledSpriteSize(SpriteID sprid)
Scale sprite size for GUI.
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
@ FS_NORMAL
Index of the normal font in the font tables.
@ SA_RIGHT
Right align the text (must be a single bit).
@ SA_HOR_CENTER
Horizontally center the text.
@ SA_CENTER
Center both horizontally and vertically.
@ SA_VERT_CENTER
Vertically center the text.
uint32_t PaletteID
The number of the palette.
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
static const uint MAX_MAP_SIZE
Maximal map size = 4096.
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.
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
Shows a tooltip.
void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback, bool focus)
Show a confirmation window with standard 'yes' and 'no' buttons The window is aligned to the centre o...
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
bool _is_network_server
Does this client wants to be a network-server?
StringList _network_host_list
The servers we know.
void NetworkQueryServer(const std::string &connection_string)
Query a server to fetch the game-info.
NetworkGameList * NetworkAddServer(const std::string &connection_string, bool manually, bool never_expire)
Validates an address entered as a string and adds the server to the list.
void NetworkDisconnect(bool close_admins)
We want to disconnect from the host/clients.
bool _network_server
network-server is active
ClientID _network_own_client_id
Our client identifier.
bool NetworkClientConnectGame(const std::string &connection_string, CompanyID default_company, const std::string &join_server_password)
Join a client to the server at with the given connection string.
void NetworkUpdateServerGameType()
The setting server_game_type was updated; possibly we need to take some action.
bool NetworkValidateServerName(std::string &server_name)
Trim the given server name in place, i.e.
Basic functions/variables used all over the place.
Base core network types and some helper functions to access them.
void ShowNetworkChatQueryWindow(DestType type, int dest)
Show the chat window.
bool NetworkValidateOurClientName()
Convenience method for NetworkValidateClientName on _settings_client.network.client_name.
bool NetworkMaxCompaniesReached()
Check if max_companies has been reached on the server (local check only).
uint NetworkMaxCompaniesAllowed()
Get the maximum number of companies that are allowed by the server.
std::string _network_server_name
The current name of the server you are on.
void NetworkClientRequestMove(CompanyID company_id)
Notify the server of this client wanting to be moved to another company.
Client part of the network protocol.
Part of the network protocol handling content distribution.
void ShowMissingContentWindow(const GRFConfigList &list)
Show the content list window with all missing grfs from the given list.
ConnectionType _network_server_connection_type
What type of connection the Game Coordinator detected we are on.
ClientNetworkCoordinatorSocketHandler _network_coordinator_client
The connection to the Game Coordinator.
std::string _network_server_invite_code
Our invite code as indicated by the Game Coordinator.
Part of the network protocol handling Game Coordinator requests.
uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const std::string &reason)
Ban, or kick, everyone joined from the given client's IP.
void NetworkServerKickClient(ClientID client_id, const std::string &reason)
Kick a single client.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
bool NetworkCompanyHasClients(CompanyID company)
Check whether a particular company has clients.
void NetworkGameListRemoveItem(NetworkGameList *remove)
Remove an item from the gamelist linked list.
NetworkGameList * _network_game_list
Game list of this client.
Handling of the list of games.
@ NGLS_ONLINE
Server is online.
@ NGLS_FULL
Server is full and cannot be queried.
@ NGLS_TOO_OLD
Server is too old to query.
@ NGLS_OFFLINE
Server is offline (or cannot be queried).
@ NGLS_BANNED
You are banned from this server.
void ShowNetworkAskRelay(const std::string &server_connection_string, const std::string &relay_connection_string, const std::string &token)
Show a modal confirmation window with "no" / "yes, once" / "yes, always" buttons.
static void AdminCompanyResetCallback(Window *, bool confirmed)
Callback function for admin command to reset company.
NetworkJoinStatus _network_join_status
The status of joining.
static void AdminClientKickCallback(Window *, bool confirmed)
Callback function for admin command to kick client.
void UpdateNetworkGameWindow()
Update the network new window because a new server is found on the network.
uint8_t _network_join_waiting
The number of clients waiting in front of us.
DropDownAdmin
The possibly entries in a DropDown for an admin.
static void AdminClientBanCallback(Window *, bool confirmed)
Callback function for admin command to ban client.
void DrawCompanyIcon(CompanyID cid, int x, int y)
Draw the icon of a company.
uint32_t _network_join_bytes_total
The total number of bytes to download.
uint32_t _network_join_bytes
The number of bytes we already downloaded.
void ShowNetworkAskSurvey()
Show a modal confirmation window with "no" / "preview" / "yes" buttons.
static CompanyID _admin_company_id
For what company a confirmation window is open.
static ClientID _admin_client_id
For what client a confirmation window is open.
GUIs related to networking.
@ NRWCD_UNHANDLED
Relay request is unhandled.
@ NRWCD_HANDLED
Relay request is handled, either by user or by timeout.
NetworkJoinStatus
Status of the clients during joining.
Server part of the network protocol.
Part of the network protocol handling opt-in survey.
@ DESTTYPE_CLIENT
Send message/notice to only a certain client (Private)
@ DESTTYPE_TEAM
Send message/notice to everyone playing the same company (Team)
static const uint MAX_CLIENTS
How many clients can we have.
ClientID
'Unique' identifier to be given to clients
@ INVALID_CLIENT_ID
Client is not part of anything.
@ CLIENT_ID_SERVER
Servers always have this ID.
ServerGameType
Game type the server can be using.
void NetworkUDPSearchGame()
Find all servers.
Sending and receiving UDP messages.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfigList &config)
Setup the NewGRF gui.
@ SM_MENU
Switch to game intro menu.
uint8_t GetColourGradient(Colours colour, ColourShade shade)
Get colour gradient palette index.
static const uint8_t PC_GREY
Grey palette colour.
static const uint8_t PC_DARK_BLUE
Dark blue palette colour.
#define GREY_SCALE(level)
Return the colour for a particular greyscale level.
bool SetSettingValue(const IntSettingDesc *sd, int32_t value, bool force_newgame)
Top function to save the new value of an element of the Settings struct.
static const SettingDesc * GetSettingFromName(const std::string_view name, const SettingTable &settings)
Given a name of setting, return a setting description from the table.
ClientSettings _settings_client
The current settings for this game.
int StrNaturalCompare(std::string_view s1, std::string_view s2, bool ignore_garbage_at_front)
Compares two strings using case insensitive natural sort.
@ CS_NUMERAL
Only numeric ones.
@ CS_ALPHANUMERAL
Both numeric and alphabetic and spaces and stuff.
void SetDParamMaxValue(size_t n, uint64_t max_value, uint min_count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
TextDirection _current_text_dir
Text direction of the currently selected language.
void SetDParamStr(size_t n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
void SetDParamMaxDigits(size_t n, uint count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
NetworkSettings network
settings related to the network
Dimensions (a width and height) of a rectangle in 2D.
Information about GRF, used in the game and (part of it) in savegames.
Data structure describing how to show the list (what sort direction and criteria).
Window used for asking the user if he is okay using a relay server.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
std::string relay_connection_string
The relay server we want to connect to.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
std::string token
The token for this connection.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
std::string server_connection_string
The game server we want to connect to.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Window used for asking if the user wants to participate in the automated survey.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
Container for all information known about a client.
static NetworkClientInfo * GetByClientID(ClientID client_id)
Return the CI given it's client-identifier.
Main handle for clientlist.
Scrollbar * vscroll
Vertical scrollbar of this window.
void OnResize() override
Called after the window got resized.
uint line_count
Amount of lines in the matrix.
std::map< uint, std::vector< std::unique_ptr< ButtonCommon > > > buttons
Per line which buttons are available.
void DrawButtons(int &x, uint y, const std::vector< std::unique_ptr< ButtonCommon > > &buttons) const
Draw the buttons for a single line in the matrix.
ClientListWidgets query_widget
During a query this tracks what widget caused the query.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
CompanyID dd_company_id
During admin dropdown, track which company this was for.
void OnMouseOver(Point pt, WidgetID widget) override
The mouse is currently moving over the window or has just moved outside of the window.
int hover_index
Index of the current line we are hovering over, or -1 if none.
bool OnTooltip(Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
Event to display a custom tooltip.
static void OnClickCompanyNew(NetworkClientListWindow *w, Point pt, CompanyID)
Crete new company button is clicked.
void OnDropdownClose(Point pt, WidgetID widget, int index, bool instant_close) override
A dropdown window associated to this window has been closed.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
uint line_height
Current lineheight of each entry in the matrix.
void OnInit() override
Notification that the nested widget tree gets initialized.
static void OnClickCompanyAdmin(NetworkClientListWindow *w, Point pt, CompanyID company_id)
Admin button on a Company is clicked.
static void OnClickCompanyChat(NetworkClientListWindow *w, Point pt, CompanyID company_id)
Chat button on a Company is clicked.
ClientID dd_client_id
During admin dropdown, track which client this was for.
static void OnClickClientChat(NetworkClientListWindow *w, Point pt, ClientID client_id)
Chat button on a Client is clicked.
void RebuildListCompany(CompanyID company_id, CompanyID client_playas, bool can_join_company)
Part of RebuildList() to create the information for a single company.
int player_self_index
The line the current player is on.
void DrawCompany(CompanyID company_id, const Rect &r, uint &line) const
Draw a company and its clients on the matrix.
int player_host_index
The line the host is on.
static void OnClickClientAdmin(NetworkClientListWindow *w, Point pt, ClientID client_id)
Admin button on a Client is clicked.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
ButtonCommon * GetButtonAtPoint(Point pt)
Get the button at a specific point on the WID_CL_MATRIX.
static void OnClickCompanyJoin(NetworkClientListWindow *w, Point pt, CompanyID company_id)
Join button on a Company is clicked.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void RebuildList()
Rebuild the list, meaning: calculate the lines needed and what buttons go on which line.
bool version_compatible
Can we connect to this server or not? (based on server_revision)
bool compatible
Can we connect to this server or not? (based on server_revision and grf_match.
Structure with information shown in the game list (GUI)
std::string connection_string
Address of the server.
bool refreshing
Whether this server is being queried.
NetworkGameList * next
Next pointer to make a linked game list.
NetworkGameListStatus status
Stats of the server.
NetworkGameInfo info
The game information of this server.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
TimerGameCalendar::Date calendar_start
When the game started.
std::string server_revision
The version number the server is using (e.g.: 'r304' or 0.5.0)
bool use_password
Is this server passworded?
uint8_t clients_max
Max clients allowed on server.
GRFConfigList grfconfig
List of NewGRF files used.
uint16_t map_height
Map height.
std::string server_name
Server name.
uint16_t map_width
Map width.
TimerGameTick::TickCounter ticks_playing
Amount of ticks the game has been running unpaused.
LandscapeType landscape
The used landscape.
uint8_t companies_max
Max companies allowed on server.
std::string gamescript_name
Name of the gamescript.
TimerGameCalendar::Date calendar_date
Current calendar date.
int gamescript_version
Version of the gamescript.
uint8_t companies_on
How many started companies do we have.
uint8_t clients_on
Current count of clients on server.
uint8_t max_clients
maximum amount of clients
uint8_t max_companies
maximum amount of companies
std::string client_name
name of the player (as client)
ServerGameType server_game_type
Server type: local / public / invite-only.
UseRelayService use_relay_service
Use relay service?
std::string connect_to_ip
default for the "Add server" query
std::string last_joined
Last joined server.
std::string server_name
name of the server
std::string server_password
password for joining this server
ParticipateSurvey participate_survey
Participate in the automated survey.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
WidgetID widget_id
The widget that has the pop-up input menu.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
QueryString name_editbox
Server name editbox.
void OnTimeout() override
Called when this window's timeout has been reached.
Coordinates of a point in 2D.
static size_t GetNumItems()
Returns number of valid items in the pool.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static Titem * Get(size_t index)
Returns Titem with given index.
Data stored about a string that can be modified in the GUI.
int cancel_button
Widget button of parent window to simulate when pressing CANCEL in OSK.
static const int ACTION_CLEAR
Clear editbox.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
uint step_height
Step-size of height resize changes.
bool IsEmpty() const
Check whether any filter words were entered.
void SetFilterTerm(const char *str)
Set the term to filter on.
void ResetState()
Reset the matching state to process a new item.
void AddLine(const char *str)
Pass another text line from the current item to the filter.
bool GetState() const
Get the matching state of the current item.
Window for displaying the textfile of a survey result.
const GRFConfig * grf_config
View the textfile of this GRFConfig.
void Assign(StringID string)
Render a string into the textbuffer.
const char * GetText() const
Get the current text.
Window for displaying a textfile.
void LoadText(std::string_view buf)
Load a text into the textfile viewer.
TextfileType file_type
Type of textfile to view.
High level window description.
Number to differentiate different windows of the same class.
Data structure for an opened window.
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
std::map< WidgetID, QueryString * > querystrings
QueryString associated to WWT_EDITBOX widgets.
void DrawWidgets() const
Paint all widgets of a window.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Window * parent
Parent window.
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
void DrawSortButtonState(WidgetID widget, SortButtonState state) const
Draw a sort button's up or down arrow symbol.
ResizeInfo resize
Resize information.
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
bool SetFocusedWidget(WidgetID widget_index)
Set focus within this window to the given widget.
virtual void OnDropdownClose(Point pt, WidgetID widget, int index, bool instant_close)
A dropdown window associated to this window has been closed.
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
int left
x position of left edge of the window
void RaiseWidgetsWhenLowered(Args... widgets)
Raises the widgets and sets widgets dirty that are lowered.
int top
y position of top edge of the window
int GetRowFromWidget(int clickpos, WidgetID widget, int padding, int line_height=-1) const
Compute the row of a widget that a user clicked in.
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
WindowFlags flags
Window flags.
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
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)
WindowNumber window_number
Window number within the window class.
@ CONNECTION_TYPE_UNKNOWN
The Game Coordinator hasn't informed us yet what type of connection we have.
void QueryCallbackProc(Window *, bool)
Callback procedure for the ShowQuery method.
@ QSF_ACCEPT_UNCHANGED
return success even when the text didn't change
@ QSF_LEN_IN_CHARS
the length of the string is counted in characters
TextfileType
Additional text files accompanying Tar archives.
@ TFT_SURVEY_RESULT
Survey result (preview)
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Window * GetMainWindow()
Get the main window, i.e.
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
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-...
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
@ Modal
The window is a modal child of some other window, meaning the parent is 'inactive'.
@ BorderOnly
Draw border only, no background.
@ Lowered
If set the frame is lowered and the background colour brighter (ie. buttons when pressed)
@ Timeout
Window timeout counter.
@ SBS_DOWN
Sort ascending.
@ WDP_CENTER
Center the window.
@ WDP_AUTO
Find a place automatically.
@ WN_NETWORK_STATUS_WINDOW_JOIN
Network join status.
@ WN_NETWORK_WINDOW_GAME
Network game window.
@ WN_NETWORK_WINDOW_START
Network start server.
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_NETWORK_ASK_RELAY
Network ask relay window; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
@ WC_CLIENT_LIST
Client list; Window numbers:
@ WC_NETWORK_WINDOW
Network window; Window numbers:
@ WC_TEXTFILE
textfile; Window numbers:
@ WC_NETWORK_STATUS_WINDOW
Network status window; Window numbers:
@ WC_NETWORK_ASK_SURVEY
Network ask survey window; Window numbers: