From 526635942451479bee66e9eb61c50f91ae48a7dd Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 18 Apr 2021 09:54:47 +0200 Subject: [PATCH] Feature: rework in-game Online Players GUI The GUI now more clearly shows some basic information about the server you joined, your client name (and the ability to change it), and what players are in which company. It also contains useful buttons to press to join companies, chat with other people, and for admins to kick/ban people. Additionally, renamed "advertised" to "visibility"; this has to do with future additions, but also because it is more clear in wording. --- media/baseset/openttd.grf | Bin 510358 -> 510525 bytes media/baseset/openttd/openttdgui.nfo | 5 +- media/baseset/openttd/openttdgui.png | Bin 43899 -> 44464 bytes src/company_cmd.cpp | 4 +- src/lang/english.txt | 41 +- src/network/network.cpp | 5 +- src/network/network_client.cpp | 10 +- src/network/network_gui.cpp | 645 +++++++++++++++++++++------ src/network/network_server.cpp | 7 +- src/table/sprites.h | 6 +- src/toolbar_gui.cpp | 14 +- src/widgets/network_widget.h | 11 +- 12 files changed, 573 insertions(+), 175 deletions(-) diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index a63bfc4e295e77a34ac22387778c534dcc1f2c3d..c4511f55ea9f87c7dd7e3e4f73e79e404801d053 100644 GIT binary patch delta 217 zcmbO>S$^*nc@`Fi|92Z%T3HxdS(sW`m|Iy`wz9AqlriqzZd%6LIH$gWfsu=c0R)&C z7#LnKUtoK|!_3IY_=1^{@dh_DKR^EqW=8%Oya%`+@Gjtaq0G$4&-j96f$9m{9Ud=2 zRwNuKz%=0j4--HC4Bi7`52Q9IZBPXnvcPBtZ->+jbw&nMb%7 diff --git a/media/baseset/openttd/openttdgui.nfo b/media/baseset/openttd/openttdgui.nfo index eb1313365e..9a13fa8000 100644 --- a/media/baseset/openttd/openttdgui.nfo +++ b/media/baseset/openttd/openttdgui.nfo @@ -4,7 +4,7 @@ // See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . // -1 * 0 0C "OpenTTD GUI graphics" - -1 * 3 05 15 \b 186 // OPENTTD_SPRITE_COUNT + -1 * 3 05 15 \b 189 // OPENTTD_SPRITE_COUNT -1 sprites/openttdgui.png 8bpp 66 8 64 31 -31 7 normal -1 sprites/openttdgui.png 8bpp 146 8 64 31 -31 7 normal -1 sprites/openttdgui.png 8bpp 226 8 64 31 -31 7 normal @@ -191,3 +191,6 @@ -1 sprites/openttdgui_convert_tram.png 8bpp 24 0 32 32 0 0 normal -1 sprites/openttdgui.png 8bpp 513 440 10 10 0 0 normal -1 sprites/openttdgui.png 8bpp 526 440 10 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 539 440 12 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 553 440 12 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 567 440 12 10 0 0 normal diff --git a/media/baseset/openttd/openttdgui.png b/media/baseset/openttd/openttdgui.png index 1fc02aa61e30774b4e69fd08b21f51ef69a74a00..dc0976a971647fa6adad1ed1506030aaf2c60bf8 100644 GIT binary patch delta 41971 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 AWB>pF delta 41353 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 z

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 = address; // Save the IP of the client + + InvalidateWindowData(WC_CLIENT_LIST, 0); } /** @@ -713,7 +714,7 @@ void NetworkClientConnectGame(NetworkAddress address, CompanyID join_as, const c static void NetworkInitGameInfo() { if (StrEmpty(_settings_client.network.server_name)) { - seprintf(_settings_client.network.server_name, lastof(_settings_client.network.server_name), "Unnamed Server"); + strecpy(_settings_client.network.server_name, "Unnamed Server", lastof(_settings_client.network.server_name)); } /* The server is a client too */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 6156dc4863..d5fe64b11d 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -647,7 +647,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac ci->client_playas = playas; strecpy(ci->client_name, name, lastof(ci->client_name)); - SetWindowDirty(WC_CLIENT_LIST, 0); + InvalidateWindowData(WC_CLIENT_LIST, 0); return NETWORK_RECV_STATUS_OKAY; } @@ -666,7 +666,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac strecpy(ci->client_name, name, lastof(ci->client_name)); - SetWindowDirty(WC_CLIENT_LIST, 0); + InvalidateWindowData(WC_CLIENT_LIST, 0); return NETWORK_RECV_STATUS_OKAY; } @@ -1043,7 +1043,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack delete ci; } - SetWindowDirty(WC_CLIENT_LIST, 0); + InvalidateWindowData(WC_CLIENT_LIST, 0); return NETWORK_RECV_STATUS_OKAY; } @@ -1062,7 +1062,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p) DEBUG(net, 0, "Unknown client (%d) is leaving the game", client_id); } - SetWindowDirty(WC_CLIENT_LIST, 0); + InvalidateWindowData(WC_CLIENT_LIST, 0); /* If we come here it means we could not locate the client.. strange :s */ return NETWORK_RECV_STATUS_OKAY; @@ -1079,7 +1079,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p) NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, ci->client_name); } - SetWindowDirty(WC_CLIENT_LIST, 0); + InvalidateWindowData(WC_CLIENT_LIST, 0); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index dd25ad5bc1..fcfeded5a5 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -21,6 +21,7 @@ #include "network_udp.h" #include "../window_func.h" #include "../gfx_func.h" +#include "../widgets/dropdown_type.h" #include "../widgets/dropdown_func.h" #include "../querystring_gui.h" #include "../sortlist_type.h" @@ -30,6 +31,8 @@ #include "../map_type.h" #include "../guitimer_func.h" #include "../zoom_func.h" +#include "../sprite.h" +#include "../settings_internal.h" #include "../widgets/network_widget.h" @@ -38,21 +41,24 @@ #include "../stringfilter_type.h" -#include "../safeguards.h" - #ifdef __EMSCRIPTEN__ # include #endif +#include + +#include "../safeguards.h" + static void ShowNetworkStartServerWindow(); static void ShowNetworkLobbyWindow(NetworkGameList *ngl); /** - * Advertisement options in the start server window + * Visibility of the server. Public servers advertise, where private servers + * do not. */ -static const StringID _connection_types_dropdown[] = { - STR_NETWORK_START_SERVER_UNADVERTISED, - STR_NETWORK_START_SERVER_ADVERTISED, +static const StringID _server_visibility_dropdown[] = { + STR_NETWORK_SERVER_VISIBILITY_PRIVATE, + STR_NETWORK_SERVER_VISIBILITY_PUBLIC, INVALID_STRING_ID }; @@ -985,7 +991,7 @@ struct NetworkStartServerWindow : public Window { { switch (widget) { case WID_NSS_CONNTYPE_BTN: - SetDParam(0, _connection_types_dropdown[_settings_client.network.server_advertise]); + SetDParam(0, _server_visibility_dropdown[_settings_client.network.server_advertise]); break; case WID_NSS_CLIENTS_TXT: @@ -1006,7 +1012,7 @@ struct NetworkStartServerWindow : public Window { { switch (widget) { case WID_NSS_CONNTYPE_BTN: - *size = maxdim(GetStringBoundingBox(_connection_types_dropdown[0]), GetStringBoundingBox(_connection_types_dropdown[1])); + *size = maxdim(GetStringBoundingBox(_server_visibility_dropdown[0]), GetStringBoundingBox(_server_visibility_dropdown[1])); size->width += padding.width; size->height += padding.height; break; @@ -1036,7 +1042,7 @@ struct NetworkStartServerWindow : public Window { break; case WID_NSS_CONNTYPE_BTN: // Connection type - ShowDropDownMenu(this, _connection_types_dropdown, _settings_client.network.server_advertise, WID_NSS_CONNTYPE_BTN, 0, 0); // do it for widget WID_NSS_CONNTYPE_BTN + ShowDropDownMenu(this, _server_visibility_dropdown, _settings_client.network.server_advertise, WID_NSS_CONNTYPE_BTN, 0, 0); // do it for widget WID_NSS_CONNTYPE_BTN break; case WID_NSS_CLIENTS_BTND: case WID_NSS_CLIENTS_BTNU: // Click on up/down button for number of clients @@ -1175,8 +1181,8 @@ static const NWidgetPart _nested_network_start_server_window_widgets[] = { NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 6, 10), NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), - NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_ADVERTISED_LABEL, STR_NULL), - NWidget(WWT_DROPDOWN, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_BTN), SetFill(1, 0), SetDataTip(STR_BLACK_STRING, STR_NETWORK_START_SERVER_ADVERTISED_TOOLTIP), + NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_VISIBILITY_LABEL, STR_NULL), + NWidget(WWT_DROPDOWN, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_BTN), SetFill(1, 0), SetDataTip(STR_BLACK_STRING, STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP), EndContainer(), NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), NWidget(NWID_SPACER), SetFill(1, 1), @@ -1592,21 +1598,6 @@ static void ClientList_Ban(const NetworkClientInfo *ci) NetworkServerKickOrBanIP(ci->client_id, true, nullptr); } -static void ClientList_SpeakToClient(const NetworkClientInfo *ci) -{ - ShowNetworkChatQueryWindow(DESTTYPE_CLIENT, ci->client_id); -} - -static void ClientList_SpeakToCompany(const NetworkClientInfo *ci) -{ - ShowNetworkChatQueryWindow(DESTTYPE_TEAM, ci->client_playas); -} - -static void ClientList_SpeakToAll(const NetworkClientInfo *ci) -{ - ShowNetworkChatQueryWindow(DESTTYPE_BROADCAST, 0); -} - /** Popup selection window to chose an action to perform */ struct NetworkClientListPopupWindow : Window { /** Container for actions that can be executed. */ @@ -1639,15 +1630,6 @@ struct NetworkClientListPopupWindow : Window { const NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); - if (_network_own_client_id != ci->client_id) { - this->AddAction(STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT, &ClientList_SpeakToClient); - } - - if (Company::IsValidID(ci->client_playas) || ci->client_playas == COMPANY_SPECTATOR) { - this->AddAction(STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY, &ClientList_SpeakToCompany); - } - this->AddAction(STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL, &ClientList_SpeakToAll); - /* A server can kick clients (but not himself). */ if (_network_server && _network_own_client_id != ci->client_id) { this->AddAction(STR_NETWORK_CLIENTLIST_KICK, &ClientList_Kick); @@ -1671,7 +1653,7 @@ struct NetworkClientListPopupWindow : Window { } d.height *= (uint)this->actions.size(); - d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT + 4 + 4; // Give the list a bit of padding on both sides. d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; *size = d; } @@ -1690,7 +1672,7 @@ struct NetworkClientListPopupWindow : Window { colour = TC_BLACK; } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, action.name, colour); + DrawString(r.left + WD_FRAMERECT_LEFT + 4, r.right - WD_FRAMERECT_RIGHT - 4, y, action.name, colour); y += FONT_HEIGHT_NORMAL; } } @@ -1731,167 +1713,554 @@ static void PopupClientList(ClientID client_id, int x, int y) static const NWidgetPart _nested_client_list_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), - NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_NETWORK_COMPANY_LIST_CLIENT_LIST_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_DEFSIZEBOX, COLOUR_GREY), NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_CL_PANEL), SetMinimalSize(250, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), SetResize(1, 1), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_CL_SERVER_SELECTOR), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER, STR_NULL), SetPadding(4, 4, 0, 4), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_NAME, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(20, 0), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_NAME), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_SERVER_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(20, 0), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_CL_SERVER_VISIBILITY), SetDataTip(STR_BLACK_STRING, STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP), + EndContainer(), + EndContainer(), + EndContainer(), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_PLAYER, STR_NULL), SetPadding(4, 4, 4, 4), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_PLAYER_NAME, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(20, 0), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_NAME), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_RAW_STRING, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_CLIENT_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP), + EndContainer(), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_MATRIX, COLOUR_GREY, WID_CL_MATRIX), SetMinimalSize(180, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_CL_SCROLLBAR), + NWidget(NWID_VERTICAL), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_CL_SCROLLBAR), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), + EndContainer(), + EndContainer(), + EndContainer(), }; static WindowDesc _client_list_desc( - WDP_AUTO, "list_clients", 0, 0, + WDP_AUTO, "list_clients", 220, 300, WC_CLIENT_LIST, WC_NONE, 0, _nested_client_list_widgets, lengthof(_nested_client_list_widgets) ); +/** + * Button shown for either a company or client in the client-list. + * + * These buttons are dynamic and strongly depends on which company/client + * what buttons are available. This class allows dynamically creating them + * as the current Widget system does not. + */ +class ButtonCommon { +public: + SpriteID sprite; ///< The sprite to use on the button. + StringID tooltip; ///< The tooltip of the button. + Colours colour; ///< The colour of the button. + bool disabled; ///< Is the button disabled? + uint height; ///< Calculated height of the button. + uint width; ///< Calculated width of the button. + + ButtonCommon(SpriteID sprite, StringID tooltip, Colours colour) : + sprite(sprite), + tooltip(tooltip), + colour(colour), + disabled(false) + { + Dimension d = GetSpriteSize(sprite); + this->height = d.height + ScaleGUITrad(WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + this->width = d.width + ScaleGUITrad(WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT); + } + virtual ~ButtonCommon() {} + + /** + * OnClick handler for when the button is pressed. + */ + virtual void OnClick(struct NetworkClientListWindow *w, Point pt) = 0; +}; + +/** + * Template version of Button, with callback support. + */ +template +class Button : public ButtonCommon { +private: + typedef void (*ButtonCallback)(struct NetworkClientListWindow *w, Point pt, T id); ///< Callback function to call on click. + T id; ///< ID this button belongs to. + ButtonCallback proc; ///< Callback proc to call when button is pressed. + +public: + Button(SpriteID sprite, StringID tooltip, Colours colour, T id, ButtonCallback proc) : + ButtonCommon(sprite, tooltip, colour), + id(id), + proc(proc) + { + assert(proc != nullptr); + } + + void OnClick(struct NetworkClientListWindow *w, Point pt) override + { + if (this->disabled) return; + + this->proc(w, pt, this->id); + } +}; + +using CompanyButton = Button; +using ClientButton = Button; + /** * Main handle for clientlist */ struct NetworkClientListWindow : Window { - int selected_item; +private: + ClientListWidgets query_widget; ///< During a query this tracks what widget caused the query. + CompanyID join_company; ///< During query for company password, this stores what company we wanted to join. - uint server_client_width; - uint line_height; + Scrollbar *vscroll; ///< Vertical scrollbar of this window. + uint line_height; ///< Current lineheight of each entry in the matrix. + uint line_count; ///< Amount of lines in the matrix. - Dimension icon_size; + std::map>> buttons; ///< Per line which buttons are available. - NetworkClientListWindow(WindowDesc *desc, WindowNumber window_number) : - Window(desc), - selected_item(-1) + static const int CLIENT_OFFSET_LEFT = 12; ///< Offset of client entries compared to company entries. + + /** + * Chat button on a Company is clicked. + * @param w The instance of this window. + * @param pt The point where this button was clicked. + * @param company_id The company this button was assigned to. + */ + static void OnClickCompanyChat(NetworkClientListWindow *w, Point pt, CompanyID company_id) { - this->InitNested(window_number); + ShowNetworkChatQueryWindow(DESTTYPE_TEAM, company_id); } /** - * Finds the amount of clients and set the height correct + * Join button on a Company is clicked. + * @param w The instance of this window. + * @param pt The point where this button was clicked. + * @param company_id The company this button was assigned to. */ - bool CheckClientListHeight() + static void OnClickCompanyJoin(NetworkClientListWindow *w, Point pt, CompanyID company_id) { - int num = 0; + if (_network_server) { + NetworkServerDoMove(CLIENT_ID_SERVER, company_id); + MarkWholeScreenDirty(); + } else if (NetworkCompanyIsPassworded(company_id)) { + w->query_widget = WID_CL_COMPANY_JOIN; + w->join_company = company_id; + ShowQueryString(STR_EMPTY, STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION, NETWORK_PASSWORD_LENGTH, w, CS_ALPHANUMERAL, QSF_PASSWORD); + } else { + NetworkClientRequestMove(company_id); + } + } - /* Should be replaced with a loop through all clients */ + /** + * Admin button on a Client is clicked. + * @param w The instance of this window. + * @param pt The point where this button was clicked. + * @param client_id The client this button was assigned to. + */ + static void OnClickClientAdmin(NetworkClientListWindow *w, Point pt, ClientID client_id) + { + PopupClientList(client_id, pt.x + w->left, pt.y + w->top); + } + + /** + * Chat button on a Client is clicked. + * @param w The instance of this window. + * @param pt The point where this button was clicked. + * @param client_id The client this button was assigned to. + */ + static void OnClickClientChat(NetworkClientListWindow *w, Point pt, ClientID client_id) + { + ShowNetworkChatQueryWindow(DESTTYPE_CLIENT, client_id); + } + + /** + * Part of RebuildList() to create the information for a single company. + * @param company_id The company to build the list for. + * @param own_ci The NetworkClientInfo of the client itself. + */ + void RebuildListCompany(CompanyID company_id, const NetworkClientInfo *own_ci) + { + ButtonCommon *chat_button = new CompanyButton(SPR_CHAT, company_id == COMPANY_SPECTATOR ? STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP : STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyChat); + + this->buttons[line_count].emplace_back(chat_button); + if (own_ci->client_playas != company_id) this->buttons[line_count].emplace_back(new CompanyButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyJoin)); + + this->line_count += 1; + + bool has_players = false; for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (ci->client_playas != COMPANY_INACTIVE_CLIENT) num++; + if (ci->client_playas != company_id) continue; + has_players = true; + + if (_network_own_client_id != ci->client_id) this->buttons[line_count].emplace_back(new ClientButton(SPR_CHAT, STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP, COLOUR_ORANGE, ci->client_id, &NetworkClientListWindow::OnClickClientChat)); + if (_network_server && _network_own_client_id != ci->client_id) this->buttons[line_count].emplace_back(new ClientButton(SPR_ADMIN, STR_NETWORK_CLIENT_LIST_ADMIN_TOOLTIP, COLOUR_RED, ci->client_id, &NetworkClientListWindow::OnClickClientAdmin)); + + this->line_count += 1; } - num *= this->line_height; + chat_button->disabled = !has_players; + } - int diff = (num + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM) - (this->GetWidget(WID_CL_PANEL)->current_y); - /* If height is changed */ - if (diff != 0) { - ResizeWindow(this, 0, diff, false); - return false; + /** + * Rebuild the list, meaning: calculate the lines needed and what buttons go on which line. + */ + void RebuildList() + { + const NetworkClientInfo *own_ci = NetworkClientInfo::GetByClientID(_network_own_client_id); + + this->buttons.clear(); + this->line_count = 0; + + /* Companies */ + for (const Company *c : Company::Iterate()) { + this->RebuildListCompany(c->index, own_ci); } - return true; + + /* Spectators */ + this->RebuildListCompany(COMPANY_SPECTATOR, own_ci); + + this->vscroll->SetCount(this->line_count); + } + + /** + * Get the button at a specific point on the WID_CL_MATRIX. + * @param pt The point to look for a button. + * @return The button or a nullptr if there was none. + */ + ButtonCommon *GetButtonAtPoint(Point pt) + { + uint index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CL_MATRIX); + NWidgetBase *widget_matrix = this->GetWidget(WID_CL_MATRIX); + + bool rtl = _current_text_dir == TD_RTL; + uint x = rtl ? (uint)widget_matrix->pos_x + WD_FRAMERECT_LEFT : widget_matrix->current_x - WD_FRAMERECT_RIGHT; + + /* Find the buttons for this row. */ + auto button_find = this->buttons.find(index); + if (button_find == this->buttons.end()) return nullptr; + + /* Check if we want to display a tooltip for any of the buttons. */ + for (auto &button : button_find->second) { + uint left = rtl ? x : x - button->width; + uint right = rtl ? x + button->width : x; + + if (IsInsideMM(pt.x, left, right)) { + return button.get(); + } + + int width = button->width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + x += rtl ? width : -width; + } + + return nullptr; + } + +public: + NetworkClientListWindow(WindowDesc *desc, WindowNumber window_number) : + Window(desc) + { + this->CreateNestedTree(); + this->vscroll = this->GetScrollbar(WID_CL_SCROLLBAR); + this->OnInvalidateData(); + this->FinishInitNested(window_number); + } + + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + this->RebuildList(); + + /* Currently server information is not sync'd to clients, so we cannot show it on clients. */ + this->GetWidget(WID_CL_SERVER_SELECTOR)->SetDisplayedPlane(_network_server ? 0 : SZSP_HORIZONTAL); } void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { - if (widget != WID_CL_PANEL) return; + switch (widget) { + case WID_CL_SERVER_VISIBILITY: + *size = maxdim(GetStringBoundingBox(_server_visibility_dropdown[0]), GetStringBoundingBox(_server_visibility_dropdown[1])); + size->width += padding.width; + size->height += padding.height; + break; - this->server_client_width = std::max(GetStringBoundingBox(STR_NETWORK_SERVER).width, GetStringBoundingBox(STR_NETWORK_CLIENT).width) + WD_FRAMERECT_RIGHT; - this->icon_size = GetSpriteSize(SPR_COMPANY_ICON); - this->line_height = std::max(this->icon_size.height + 2U, (uint)FONT_HEIGHT_NORMAL); + case WID_CL_MATRIX: { + uint height = std::max({GetSpriteSize(SPR_COMPANY_ICON).height, GetSpriteSize(SPR_JOIN).height, GetSpriteSize(SPR_ADMIN).height, GetSpriteSize(SPR_CHAT).height}); + height += ScaleGUITrad(WD_FRAMERECT_TOP) + ScaleGUITrad(WD_FRAMERECT_BOTTOM); + this->line_height = std::max(height, (uint)FONT_HEIGHT_NORMAL) + ScaleGUITrad(WD_MATRIX_TOP + WD_MATRIX_BOTTOM); - uint width = 100; // Default width - for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - width = std::max(width, GetStringBoundingBox(ci->client_name).width); + resize->width = 1; + resize->height = this->line_height; + fill->height = this->line_height; + size->height = std::max(size->height, 5 * this->line_height); + break; + } } - - size->width = WD_FRAMERECT_LEFT + this->server_client_width + this->icon_size.width + WD_FRAMERECT_LEFT + width + WD_FRAMERECT_RIGHT; } - void OnPaint() override + void OnResize() override { - /* Check if we need to reset the height */ - if (!this->CheckClientListHeight()) return; - - this->DrawWidgets(); + this->vscroll->SetCapacityFromWidget(this, WID_CL_MATRIX); } - void DrawWidget(const Rect &r, int widget) const override + void SetStringParameters(int widget) const override { - if (widget != WID_CL_PANEL) return; + switch (widget) { + case WID_CL_SERVER_NAME: + SetDParamStr(0, _settings_client.network.server_name); + break; - bool rtl = _current_text_dir == TD_RTL; - int icon_offset = (this->line_height - icon_size.height) / 2; - int text_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; + case WID_CL_SERVER_VISIBILITY: + SetDParam(0, _server_visibility_dropdown[_settings_client.network.server_advertise]); + break; - uint y = r.top + WD_FRAMERECT_TOP; - uint left = r.left + WD_FRAMERECT_LEFT; - uint right = r.right - WD_FRAMERECT_RIGHT; - uint type_icon_width = this->server_client_width + this->icon_size.width + WD_FRAMERECT_LEFT; - - - uint type_left = rtl ? right - this->server_client_width : left; - uint type_right = rtl ? right : left + this->server_client_width - 1; - uint icon_left = rtl ? right - type_icon_width + WD_FRAMERECT_LEFT : left + this->server_client_width; - uint name_left = rtl ? left : left + type_icon_width; - uint name_right = rtl ? right - type_icon_width : right; - - int i = 0; - for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - TextColour colour; - if (this->selected_item == i++) { // Selected item, highlight it - GfxFillRect(r.left + 1, y, r.right - 1, y + this->line_height - 1, PC_BLACK); - colour = TC_WHITE; - } else { - colour = TC_BLACK; - } - - if (ci->client_id == CLIENT_ID_SERVER) { - DrawString(type_left, type_right, y + text_offset, STR_NETWORK_SERVER, colour); - } else { - DrawString(type_left, type_right, y + text_offset, STR_NETWORK_CLIENT, colour); - } - - /* Filter out spectators */ - if (Company::IsValidID(ci->client_playas)) DrawCompanyIcon(ci->client_playas, icon_left, y + icon_offset); - - DrawString(name_left, name_right, y + text_offset, ci->client_name, colour); - - y += line_height; + case WID_CL_CLIENT_NAME: + SetDParamStr(0, _settings_client.network.client_name); + break; } } void OnClick(Point pt, int widget, int click_count) override { - /* Show the popup with option */ - if (this->selected_item != -1) { - int client_no = this->selected_item; - for (NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (client_no == 0) { - PopupClientList(ci->client_id, pt.x + this->left, pt.y + this->top); - break; - } - client_no--; + switch (widget) { + case WID_CL_SERVER_NAME_EDIT: + if (!_network_server) break; + + this->query_widget = WID_CL_SERVER_NAME_EDIT; + SetDParamStr(0, _settings_client.network.server_name); + ShowQueryString(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION, NETWORK_NAME_LENGTH, this, CS_ALPHANUMERAL, QSF_LEN_IN_CHARS); + break; + + case WID_CL_CLIENT_NAME_EDIT: + this->query_widget = WID_CL_CLIENT_NAME_EDIT; + SetDParamStr(0, _settings_client.network.client_name); + ShowQueryString(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION, NETWORK_CLIENT_NAME_LENGTH, this, CS_ALPHANUMERAL, QSF_LEN_IN_CHARS); + break; + + case WID_CL_SERVER_VISIBILITY: + if (!_network_server) break; + + ShowDropDownMenu(this, _server_visibility_dropdown, _settings_client.network.server_advertise, WID_CL_SERVER_VISIBILITY, 0, 0); + break; + + case WID_CL_MATRIX: { + ButtonCommon *button = this->GetButtonAtPoint(pt); + if (button == nullptr) break; + + button->OnClick(this, pt); + break; } } } - void OnMouseOver(Point pt, int widget) override + bool OnTooltip(Point pt, int widget, TooltipCloseCondition close_cond) override { - /* -1 means we left the current window */ - if (pt.y == -1) { - this->selected_item = -1; - this->SetDirty(); - return; + switch (widget) { + case WID_CL_MATRIX: { + ButtonCommon *button = this->GetButtonAtPoint(pt); + if (button == nullptr) return false; + + GuiShowTooltips(this, button->tooltip, 0, nullptr, close_cond); + return true; + }; } - /* Find the new selected item (if any) */ - pt.y -= this->GetWidget(WID_CL_PANEL)->pos_y; - int item = -1; - if (IsInsideMM(pt.y, WD_FRAMERECT_TOP, this->GetWidget(WID_CL_PANEL)->current_y - WD_FRAMERECT_BOTTOM)) { - item = (pt.y - WD_FRAMERECT_TOP) / this->line_height; + return false; + } + + void OnDropdownSelect(int widget, int index) override + { + switch (widget) { + case WID_CL_SERVER_VISIBILITY: + if (!_network_server) break; + + _settings_client.network.server_advertise = (index != 0); + break; + + default: + NOT_REACHED(); } - /* It did not change.. no update! */ - if (item == this->selected_item) return; - this->selected_item = item; - - /* Repaint */ this->SetDirty(); } + + void OnQueryTextFinished(char *str) override + { + if (str == nullptr) return; + + switch (this->query_widget) { + default: NOT_REACHED(); + + case WID_CL_SERVER_NAME_EDIT: { + if (!_network_server) break; + + uint index; + GetSettingFromName("network.server_name", &index); + SetSettingValue(index, StrEmpty(str) ? "Unnamed Server" : str); + this->InvalidateData(); + break; + } + + case WID_CL_CLIENT_NAME_EDIT: { + if (!NetworkValidateClientName(str)) break; + + uint index; + GetSettingFromName("network.client_name", &index); + SetSettingValue(index, str); + this->InvalidateData(); + break; + } + + case WID_CL_COMPANY_JOIN: + NetworkClientRequestMove(this->join_company, str); + break; + } + } + + /** + * Draw the buttons for a single line in the matrix. + * + * The x-position in RTL is the most left or otherwise the most right pixel + * we can draw the buttons from. + * + * @param x The x-position to start with the buttons. Updated during this function. + * @param y The y-position to start with the buttons. + * @param buttons The buttons to draw. + */ + void DrawButtons(uint &x, uint y, const std::vector> &buttons) const + { + for (auto &button : buttons) { + bool rtl = _current_text_dir == TD_RTL; + + uint left = rtl ? x : x - button->width; + uint right = rtl ? x + button->width : x; + + int offset = std::max(0, ((int)(this->line_height + 1) - (int)button->height) / 2); + + DrawFrameRect(left, y + offset, right, y + offset + button->height, button->colour, FR_NONE); + DrawSprite(button->sprite, PAL_NONE, left + ScaleGUITrad(WD_FRAMERECT_LEFT), y + offset + ScaleGUITrad(WD_FRAMERECT_TOP)); + if (button->disabled) { + GfxFillRect(left + 1, y + offset + 1, right - 1, y + offset + button->height - 1, _colour_gradient[button->colour & 0xF][2], FILLRECT_CHECKER); + } + + int width = button->width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + x += rtl ? width : -width; + } + } + + /** + * Draw a company and its clients on the matrix. + * @param c The company to draw. + * @param left The most left pixel of the line. + * @param right The most right pixel of the line. + * @param top The top of the first line. + * @param line The Nth line we are drawing. Updated during this function. + */ + void DrawCompany(const Company *c, uint left, uint right, uint top, uint &line) const + { + bool rtl = _current_text_dir == TD_RTL; + int text_y_offset = std::max(0, ((int)(this->line_height + 1) - (int)FONT_HEIGHT_NORMAL) / 2) + WD_MATRIX_BOTTOM; + + Dimension d = GetSpriteSize(SPR_COMPANY_ICON); + int offset = std::max(0, ((int)(this->line_height + 1) - (int)d.height) / 2); + + uint text_left = left + (rtl ? (uint)WD_FRAMERECT_LEFT : d.width + 8); + uint text_right = right - (rtl ? d.width + 8 : (uint)WD_FRAMERECT_RIGHT); + + uint line_start = this->vscroll->GetPosition(); + uint line_end = line_start + this->vscroll->GetCapacity(); + + uint y = top + (this->line_height * (line - line_start)); + + /* Draw the company line (if in range of scrollbar). */ + if (IsInsideMM(line, line_start, line_end)) { + uint x = rtl ? text_left : text_right; + + /* If there are buttons for this company, draw them. */ + auto button_find = this->buttons.find(line); + if (button_find != this->buttons.end()) { + this->DrawButtons(x, y, button_find->second); + } + + if (c == nullptr) { + DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, rtl ? right - d.width - 4 : left + 4, y + offset); + DrawString(rtl ? x : text_left, rtl ? text_right : x, y + text_y_offset, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER); + } else { + DrawCompanyIcon(c->index, rtl ? right - d.width - 4 : left + 4, y + offset); + + SetDParam(0, c->index); + SetDParam(1, c->index); + DrawString(rtl ? x : text_left, rtl ? text_right : x, y + text_y_offset, STR_COMPANY_NAME, TC_SILVER); + } + } + + y += this->line_height; + line++; + + for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { + if (c != nullptr && ci->client_playas != c->index) continue; + if (c == nullptr && ci->client_playas != COMPANY_SPECTATOR) continue; + + /* Draw the player line (if in range of scrollbar). */ + if (IsInsideMM(line, line_start, line_end)) { + uint x = rtl ? text_left : text_right; + + /* If there are buttons for this client, draw them. */ + auto button_find = this->buttons.find(line); + if (button_find != this->buttons.end()) { + this->DrawButtons(x, y, button_find->second); + } + + StringID client_string = STR_JUST_RAW_STRING; + + if (ci->client_id == CLIENT_ID_SERVER) { + client_string = STR_NETWORK_CLIENT_LIST_PLAYER_HOST; + } + if (ci->client_id == _network_own_client_id) { + client_string = STR_NETWORK_CLIENT_LIST_PLAYER_SELF; + } + + SetDParamStr(0, ci->client_name); + DrawString(rtl ? x : text_left + CLIENT_OFFSET_LEFT, rtl ? text_right - CLIENT_OFFSET_LEFT : x, y + text_y_offset, client_string, TC_BLACK); + } + + y += this->line_height; + line++; + } + } + + void DrawWidget(const Rect &r, int widget) const override + { + switch (widget) { + case WID_CL_MATRIX: { + uint line = 0; + + for (const Company *c : Company::Iterate()) { + this->DrawCompany(c, r.left, r.right, r.top, line); + } + /* Specators */ + this->DrawCompany(nullptr, r.left, r.right, r.top, line); + + break; + } + } + } }; void ShowClientList() diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index a0d1a00666..746077abdb 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -288,13 +288,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta _network_clients_connected--; DeleteWindowById(WC_CLIENT_LIST_POPUP, this->client_id); - SetWindowDirty(WC_CLIENT_LIST, 0); this->SendPackets(true); delete this->GetInfo(); delete this; + InvalidateWindowData(WC_CLIENT_LIST, 0); + return status; } @@ -1043,6 +1044,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet * this->GetClientName(client_name, lastof(client_name)); NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, client_name, nullptr, this->client_id); + InvalidateWindowData(WC_CLIENT_LIST, 0); /* Mark the client as pre-active, and wait for an ACK * so we know he is done loading and in sync with us */ @@ -2061,6 +2063,9 @@ void NetworkServerDoMove(ClientID client_id, CompanyID company_id) NetworkAction action = (company_id == COMPANY_SPECTATOR) ? NETWORK_ACTION_COMPANY_SPECTATOR : NETWORK_ACTION_COMPANY_JOIN; NetworkServerSendChat(action, DESTTYPE_BROADCAST, 0, "", client_id, company_id + 1); + + InvalidateWindowClassesData(WC_CLIENT_LIST_POPUP); + InvalidateWindowData(WC_CLIENT_LIST, 0); } /** diff --git a/src/table/sprites.h b/src/table/sprites.h index 9071e61dc6..039d50b9de 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -54,7 +54,7 @@ static const SpriteID SPR_LARGE_SMALL_WINDOW = 682; /** Extra graphic spritenumbers */ static const SpriteID SPR_OPENTTD_BASE = 4896; -static const uint16 OPENTTD_SPRITE_COUNT = 186; +static const uint16 OPENTTD_SPRITE_COUNT = 189; /* Halftile-selection sprites */ static const SpriteID SPR_HALFTILE_SELECTION_FLAT = SPR_OPENTTD_BASE; @@ -166,6 +166,10 @@ static const SpriteID SPR_WINDOW_DEFSIZE = SPR_OPENTTD_BASE + 168; static const SpriteID SPR_RENAME = SPR_OPENTTD_BASE + 184; static const SpriteID SPR_GOTO_LOCATION = SPR_OPENTTD_BASE + 185; +static const SpriteID SPR_CHAT = SPR_OPENTTD_BASE + 186; +static const SpriteID SPR_ADMIN = SPR_OPENTTD_BASE + 187; +static const SpriteID SPR_JOIN = SPR_OPENTTD_BASE + 188; + static const SpriteID SPR_IMG_CARGOFLOW = SPR_OPENTTD_BASE + 174; static const SpriteID SPR_SIGNALS_BASE = SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT; diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index ea50661e4c..6a65382b44 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -205,8 +205,7 @@ static void PopupMainToolbMenu(Window *w, int widget, StringID string, int count /** Enum for the Company Toolbar's network related buttons */ static const int CTMN_CLIENT_LIST = -1; ///< Show the client list static const int CTMN_NEW_COMPANY = -2; ///< Create a new company -static const int CTMN_SPECTATE = -3; ///< Become spectator -static const int CTMN_SPECTATOR = -4; ///< Show a company window as spectator +static const int CTMN_SPECTATOR = -3; ///< Show a company window as spectator /** * Pop up a generic company list menu. @@ -227,8 +226,6 @@ static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0) if (_local_company == COMPANY_SPECTATOR) { list.emplace_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_NEW_COMPANY, CTMN_NEW_COMPANY, NetworkMaxCompaniesReached())); - } else { - list.emplace_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE, NetworkMaxSpectatorsReached())); } break; @@ -619,15 +616,6 @@ static CallBackFunction MenuClickCompany(int index) NetworkSendCommand(0, CCA_NEW, 0, CMD_COMPANY_CTRL, nullptr, nullptr, _local_company); } return CBF_NONE; - - case CTMN_SPECTATE: - if (_network_server) { - NetworkServerDoMove(CLIENT_ID_SERVER, COMPANY_SPECTATOR); - MarkWholeScreenDirty(); - } else { - NetworkClientRequestMove(COMPANY_SPECTATOR); - } - return CBF_NONE; } } ShowCompany((CompanyID)index); diff --git a/src/widgets/network_widget.h b/src/widgets/network_widget.h index 79d33fb067..a453b085cf 100644 --- a/src/widgets/network_widget.h +++ b/src/widgets/network_widget.h @@ -96,7 +96,16 @@ enum NetworkLobbyWidgets { /** Widgets of the #NetworkClientListWindow class. */ enum ClientListWidgets { - WID_CL_PANEL, ///< Panel of the window. + WID_CL_PANEL, ///< Panel of the window. + WID_CL_SERVER_SELECTOR, ///< Selector to hide the server frame. + WID_CL_SERVER_NAME, ///< Server name. + WID_CL_SERVER_NAME_EDIT, ///< Edit button for server name. + WID_CL_SERVER_VISIBILITY, ///< Server visibility. + WID_CL_CLIENT_NAME, ///< Client name. + WID_CL_CLIENT_NAME_EDIT, ///< Edit button for client name. + WID_CL_MATRIX, ///< Company/client list. + WID_CL_SCROLLBAR, ///< Scrollbar for company/client list. + WID_CL_COMPANY_JOIN, ///< Used for QueryWindow when a company has a password. }; /** Widgets of the #NetworkClientListPopupWindow class. */