summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network/network_gui.cpp285
1 files changed, 135 insertions, 150 deletions
diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp
index 989b97e3f..122c601f8 100644
--- a/src/network/network_gui.cpp
+++ b/src/network/network_gui.cpp
@@ -43,7 +43,6 @@ struct chatquerystr_d : public querystr_d {
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(chatquerystr_d));
struct network_d {
- PlayerID company; // select company in network lobby
byte field; // select text-field in start-server and game-listing
byte widget_id; ///< The widget that has the pop-up input menu
NetworkGameList *server; // selected server in lobby and game-listing
@@ -1030,164 +1029,155 @@ enum NetworkLobbyWindowWidgets {
NLWW_CANCEL = 12, ///< 'Cancel' button
};
-/**
- * Handler of actions done in the NetworkLobby window
- *
- * @param w pointer to the Window structure
- * @param e pointer to window event
- * @note uses network_d WP macro
- * @see struct _network_lobby_window_widgets
- * @see enum NetworkLobbyWindowWidgets
- */
-static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
-{
- network_d *nd = &WP(w, network_d);
-
- switch (e->event) {
- case WE_CREATE:
- nd->company = INVALID_PLAYER;
- break;
+struct NetworkLobbyWindow : public Window {
+ PlayerID company; ///< Select company
+ NetworkGameList *server; ///< Selected server
- case WE_PAINT: {
- const NetworkGameInfo *gi = &nd->server->info;
- int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
-
- /* Join button is disabled when no company is selected */
- w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER);
- /* Cannot start new company if there are too many */
- w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
- /* Cannot spectate if there are too many spectators */
- w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
-
- /* Draw window widgets */
- SetDParamStr(0, gi->server_name);
- DrawWindowWidgets(w);
-
- /* Draw company list */
- pos = w->vscroll.pos;
- while (pos < gi->companies_on) {
- byte company = NetworkLobbyFindCompanyIndex(pos);
- bool income = false;
- if (nd->company == company)
- GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
-
- DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
- if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
-
- /* If the company's income was positive puts a green dot else a red dot */
- if (_network_player_info[company].income >= 0) income = true;
- DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
+ NetworkLobbyWindow(const WindowDesc *desc, NetworkGameList *ngl) :
+ Window(desc), company(INVALID_PLAYER), server(ngl)
+ {
+ strcpy(_edit_str_net_buf, "");
+ this->vscroll.cap = 10;
+ }
- pos++;
- y += NET_PRC__SIZE_OF_ROW;
- if (pos >= w->vscroll.cap) break;
+ virtual void OnPaint()
+ {
+ const NetworkGameInfo *gi = &this->server->info;
+ int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
+
+ /* Join button is disabled when no company is selected */
+ this->SetWidgetDisabledState(NLWW_JOIN, this->company == INVALID_PLAYER);
+ /* Cannot start new company if there are too many */
+ this->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
+ /* Cannot spectate if there are too many spectators */
+ this->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
+
+ /* Draw window widgets */
+ SetDParamStr(0, gi->server_name);
+ DrawWindowWidgets(this);
+
+ /* Draw company list */
+ pos = this->vscroll.pos;
+ while (pos < gi->companies_on) {
+ byte company = NetworkLobbyFindCompanyIndex(pos);
+ bool income = false;
+ if (this->company == company) {
+ GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
}
- /* Draw info about selected company when it is selected in the left window */
- GfxFillRect(174, 39, 403, 75, 157);
- DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
- if (nd->company != INVALID_PLAYER) {
- const uint x = 183;
- const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
- y = 80;
-
- SetDParam(0, nd->server->info.clients_on);
- SetDParam(1, nd->server->info.clients_max);
- SetDParam(2, nd->server->info.companies_on);
- SetDParam(3, nd->server->info.companies_max);
- DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
- y += 10;
-
- SetDParamStr(0, _network_player_info[nd->company].company_name);
- DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].inaugurated_year);
- DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].company_value);
- DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].money);
- DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].income);
- DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].performance);
- DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].num_vehicle[0]);
- SetDParam(1, _network_player_info[nd->company].num_vehicle[1]);
- SetDParam(2, _network_player_info[nd->company].num_vehicle[2]);
- SetDParam(3, _network_player_info[nd->company].num_vehicle[3]);
- SetDParam(4, _network_player_info[nd->company].num_vehicle[4]);
- DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
- y += 10;
+ DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
+ if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
- SetDParam(0, _network_player_info[nd->company].num_station[0]);
- SetDParam(1, _network_player_info[nd->company].num_station[1]);
- SetDParam(2, _network_player_info[nd->company].num_station[2]);
- SetDParam(3, _network_player_info[nd->company].num_station[3]);
- SetDParam(4, _network_player_info[nd->company].num_station[4]);
- DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
- y += 10;
+ /* If the company's income was positive puts a green dot else a red dot */
+ if (_network_player_info[company].income >= 0) income = true;
+ DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
- SetDParamStr(0, _network_player_info[nd->company].players);
- DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
- }
- } break;
+ pos++;
+ y += NET_PRC__SIZE_OF_ROW;
+ if (pos >= this->vscroll.cap) break;
+ }
- case WE_CLICK:
- switch (e->we.click.widget) {
- case NLWW_CLOSE: // Close 'X'
- case NLWW_CANCEL: // Cancel button
- ShowNetworkGameWindow();
- break;
+ /* Draw info about selected company when it is selected in the left window */
+ GfxFillRect(174, 39, 403, 75, 157);
+ DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
+ if (this->company != INVALID_PLAYER) {
+ const uint x = 183;
+ const uint trunc_width = this->widget[NLWW_DETAILS].right - x;
+ y = 80;
+
+ SetDParam(0, gi->clients_on);
+ SetDParam(1, gi->clients_max);
+ SetDParam(2, gi->companies_on);
+ SetDParam(3, gi->companies_max);
+ DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
+ y += 10;
+
+ SetDParamStr(0, _network_player_info[this->company].company_name);
+ DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].inaugurated_year);
+ DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].company_value);
+ DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].money);
+ DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].income);
+ DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].performance);
+ DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].num_vehicle[0]);
+ SetDParam(1, _network_player_info[this->company].num_vehicle[1]);
+ SetDParam(2, _network_player_info[this->company].num_vehicle[2]);
+ SetDParam(3, _network_player_info[this->company].num_vehicle[3]);
+ SetDParam(4, _network_player_info[this->company].num_vehicle[4]);
+ DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
+ y += 10;
+
+ SetDParam(0, _network_player_info[this->company].num_station[0]);
+ SetDParam(1, _network_player_info[this->company].num_station[1]);
+ SetDParam(2, _network_player_info[this->company].num_station[2]);
+ SetDParam(3, _network_player_info[this->company].num_station[3]);
+ SetDParam(4, _network_player_info[this->company].num_station[4]);
+ DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
+ y += 10;
+
+ SetDParamStr(0, _network_player_info[this->company].players);
+ DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
+ }
+ }
- case NLWW_MATRIX: { // Company list
- uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
+ virtual void OnClick(Point pt, int widget)
+ {
+ switch (widget) {
+ case NLWW_CLOSE: // Close 'X'
+ case NLWW_CANCEL: // Cancel button
+ ShowNetworkGameWindow();
+ break;
- if (id_v >= w->vscroll.cap) break;
+ case NLWW_MATRIX: { // Company list
+ uint32 id_v = (pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
- id_v += w->vscroll.pos;
- nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
- SetWindowDirty(w);
- } break;
+ if (id_v >= this->vscroll.cap) break;
- case NLWW_JOIN: // Join company
- /* Button can be clicked only when it is enabled */
- _network_playas = nd->company;
- NetworkClientConnectGame(_network_last_host, _network_last_port);
- break;
+ id_v += this->vscroll.pos;
+ this->company = (id_v >= this->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
+ this->SetDirty();
+ } break;
- case NLWW_NEW: // New company
- _network_playas = PLAYER_NEW_COMPANY;
- NetworkClientConnectGame(_network_last_host, _network_last_port);
- break;
+ case NLWW_JOIN: // Join company
+ /* Button can be clicked only when it is enabled */
+ _network_playas = this->company;
+ NetworkClientConnectGame(_network_last_host, _network_last_port);
+ break;
- case NLWW_SPECTATE: // Spectate game
- _network_playas = PLAYER_SPECTATOR;
- NetworkClientConnectGame(_network_last_host, _network_last_port);
- break;
+ case NLWW_NEW: // New company
+ _network_playas = PLAYER_NEW_COMPANY;
+ NetworkClientConnectGame(_network_last_host, _network_last_port);
+ break;
- case NLWW_REFRESH: // Refresh
- NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
- NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
- break;
- }
- break;
+ case NLWW_SPECTATE: // Spectate game
+ _network_playas = PLAYER_SPECTATOR;
+ NetworkClientConnectGame(_network_last_host, _network_last_port);
+ break;
- case WE_INVALIDATE_DATA:
- SetWindowDirty(w);
- break;
+ case NLWW_REFRESH: // Refresh
+ NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
+ NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
+ break;
+ }
}
-}
+};
static const Widget _network_lobby_window_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // NLWW_CLOSE
@@ -1218,7 +1208,7 @@ static const WindowDesc _network_lobby_window_desc = {
WC_NETWORK_WINDOW, WC_NONE,
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_network_lobby_window_widgets,
- NetworkLobbyWindowWndProc,
+ NULL,
};
/* Show the networklobbywindow with the selected server
@@ -1230,12 +1220,7 @@ static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
- Window *w = new Window(&_network_lobby_window_desc);
- if (w != NULL) {
- WP(w, network_ql_d).n.server = ngl;
- strcpy(_edit_str_net_buf, "");
- w->vscroll.cap = 10;
- }
+ new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
}
// The window below gives information about the connected clients