src/network/network_gui.cpp
changeset 8459 fc93bfaeca2e
parent 8457 6e4071463e64
child 8462 2dad58135d95
equal deleted inserted replaced
8458:e3b1575895cd 8459:fc93bfaeca2e
   958 	}
   958 	}
   959 
   959 
   960 	return PLAYER_FIRST;
   960 	return PLAYER_FIRST;
   961 }
   961 }
   962 
   962 
   963 /* uses network_d WP macro */
   963 /** Enum for NetworkLobbyWindow, referring to _network_lobby_window_widgets */
       
   964 enum NetworkLobbyWindowWidgets {
       
   965 	NLWW_CLOSE    =  0, ///< Close 'X' button
       
   966 	NLWW_MATRIX   =  5, ///< List of companies
       
   967 	NLWW_DETAILS  =  7, ///< Company details
       
   968 	NLWW_JOIN     =  8, ///< 'Join company' button
       
   969 	NLWW_NEW      =  9, ///< 'New company' button
       
   970 	NLWW_SPECTATE = 10, ///< 'Spectate game' button
       
   971 	NLWW_REFRESH  = 11, ///< 'Refresh server' button
       
   972 	NLWW_CANCEL   = 12, ///< 'Cancel' button
       
   973 };
       
   974 
       
   975 /**
       
   976  * Handler of actions done in the NetworkLobby window
       
   977  *
       
   978  * @param w pointer to the Window structure
       
   979  * @param e pointer to window event
       
   980  * @note    uses network_d WP macro
       
   981  * @see     struct _network_lobby_window_widgets
       
   982  * @see     enum NetworkLobbyWindowWidgets
       
   983  */
   964 static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
   984 static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
   965 {
   985 {
   966 	network_d *nd = &WP(w, network_d);
   986 	network_d *nd = &WP(w, network_d);
   967 
   987 
   968 	switch (e->event) {
   988 	switch (e->event) {
   972 
   992 
   973 	case WE_PAINT: {
   993 	case WE_PAINT: {
   974 		const NetworkGameInfo *gi = &nd->server->info;
   994 		const NetworkGameInfo *gi = &nd->server->info;
   975 		int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
   995 		int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
   976 
   996 
   977 		SetWindowWidgetDisabledState(w, 7, nd->company == (byte)-1);
   997 		/* Join button is disabled when no company is selected */
   978 		SetWindowWidgetDisabledState(w, 8, gi->companies_on >= gi->companies_max);
   998 		SetWindowWidgetDisabledState(w, NLWW_JOIN, nd->company == INVALID_PLAYER);
   979 		/* You can not join a server as spectator when it has no companies active..
   999 		/* Cannot start new company if there are too many */
   980 		 * it causes some nasty crashes */
  1000 		SetWindowWidgetDisabledState(w, NLWW_NEW, gi->companies_on >= gi->companies_max);
   981 		SetWindowWidgetDisabledState(w, 9, gi->spectators_on >= gi->spectators_max ||
  1001 		/* Cannot spectate if there are too many spectators */
   982 				gi->companies_on == 0);
  1002 		SetWindowWidgetDisabledState(w, NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
   983 
  1003 
       
  1004 		/* Draw window widgets */
       
  1005 		SetDParamStr(0, gi->server_name);
   984 		DrawWindowWidgets(w);
  1006 		DrawWindowWidgets(w);
   985 
       
   986 		SetDParamStr(0, gi->server_name);
       
   987 		DrawString(10, 22, STR_NETWORK_PREPARE_TO_JOIN, TC_GOLD);
       
   988 
  1007 
   989 		/* Draw company list */
  1008 		/* Draw company list */
   990 		pos = w->vscroll.pos;
  1009 		pos = w->vscroll.pos;
   991 		while (pos < gi->companies_on) {
  1010 		while (pos < gi->companies_on) {
   992 			byte company = NetworkLobbyFindCompanyIndex(pos);
  1011 			byte company = NetworkLobbyFindCompanyIndex(pos);
  1007 		}
  1026 		}
  1008 
  1027 
  1009 		/* Draw info about selected company when it is selected in the left window */
  1028 		/* Draw info about selected company when it is selected in the left window */
  1010 		GfxFillRect(174, 39, 403, 75, 157);
  1029 		GfxFillRect(174, 39, 403, 75, 157);
  1011 		DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
  1030 		DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
  1012 		if (nd->company != (byte)-1) {
  1031 		if (nd->company != INVALID_PLAYER) {
  1013 			const uint x = 183;
  1032 			const uint x = 183;
  1014 			const uint trunc_width = w->widget[6].right - x;
  1033 			const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
  1015 			y = 80;
  1034 			y = 80;
  1016 
  1035 
  1017 			SetDParam(0, nd->server->info.clients_on);
  1036 			SetDParam(0, nd->server->info.clients_on);
  1018 			SetDParam(1, nd->server->info.clients_max);
  1037 			SetDParam(1, nd->server->info.clients_max);
  1019 			SetDParam(2, nd->server->info.companies_on);
  1038 			SetDParam(2, nd->server->info.companies_on);
  1066 		}
  1085 		}
  1067 	} break;
  1086 	} break;
  1068 
  1087 
  1069 	case WE_CLICK:
  1088 	case WE_CLICK:
  1070 		switch (e->we.click.widget) {
  1089 		switch (e->we.click.widget) {
  1071 		case 0: case 11: /* Close 'X' | Cancel button */
  1090 		case NLWW_CLOSE:    // Close 'X'
       
  1091 		case NLWW_CANCEL:   // Cancel button
  1072 			ShowNetworkGameWindow();
  1092 			ShowNetworkGameWindow();
  1073 			break;
  1093 			break;
  1074 		case 4: { /* Company list */
  1094 		case NLWW_MATRIX: { // Company list
  1075 			uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
  1095 			uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
  1076 
  1096 
  1077 			if (id_v >= w->vscroll.cap) return;
  1097 			if (id_v >= w->vscroll.cap) break;
  1078 
  1098 
  1079 			id_v += w->vscroll.pos;
  1099 			id_v += w->vscroll.pos;
  1080 			nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
  1100 			nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
  1081 			SetWindowDirty(w);
  1101 			SetWindowDirty(w);
  1082 		} break;
  1102 		} break;
  1083 		case 7: /* Join company */
  1103 		case NLWW_JOIN:     // Join company
  1084 			if (nd->company != (byte)-1) {
  1104 			/* Button can be clicked only when it is enabled */
  1085 				_network_playas = nd->company;
  1105 			_network_playas = nd->company;
  1086 				NetworkClientConnectGame(_network_last_host, _network_last_port);
  1106 			NetworkClientConnectGame(_network_last_host, _network_last_port);
  1087 			}
  1107 			break;
  1088 			break;
  1108 		case NLWW_NEW:      // New company
  1089 		case 8: /* New company */
       
  1090 			_network_playas = PLAYER_NEW_COMPANY;
  1109 			_network_playas = PLAYER_NEW_COMPANY;
  1091 			NetworkClientConnectGame(_network_last_host, _network_last_port);
  1110 			NetworkClientConnectGame(_network_last_host, _network_last_port);
  1092 			break;
  1111 			break;
  1093 		case 9: /* Spectate game */
  1112 		case NLWW_SPECTATE: // Spectate game
  1094 			_network_playas = PLAYER_SPECTATOR;
  1113 			_network_playas = PLAYER_SPECTATOR;
  1095 			NetworkClientConnectGame(_network_last_host, _network_last_port);
  1114 			NetworkClientConnectGame(_network_last_host, _network_last_port);
  1096 			break;
  1115 			break;
  1097 		case 10: /* Refresh */
  1116 		case NLWW_REFRESH:  // Refresh
  1098 			NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
  1117 			NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
  1099 			NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
  1118 			NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
  1100 			break;
  1119 			break;
  1101 		} break;
  1120 		} break;
  1102 
  1121 
  1105 		break;
  1124 		break;
  1106 	}
  1125 	}
  1107 }
  1126 }
  1108 
  1127 
  1109 static const Widget _network_lobby_window_widgets[] = {
  1128 static const Widget _network_lobby_window_widgets[] = {
  1110 {   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                  STR_018B_CLOSE_WINDOW },
  1129 {   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                    STR_018B_CLOSE_WINDOW },           // NLWW_CLOSE
  1111 {    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_GAME_LOBBY,    STR_NULL},
  1130 {    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_GAME_LOBBY,      STR_NULL},
  1112 {      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   234, 0x0,                       STR_NULL},
  1131 {      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   234, 0x0,                         STR_NULL},
  1113 
  1132 {       WWT_TEXT,   RESIZE_NONE,   BGC,    10,   419,    22,    34, STR_NETWORK_PREPARE_TO_JOIN, STR_NULL},
  1114 // company list
  1133 
  1115 {      WWT_PANEL,   RESIZE_NONE,   BTC,    10,   155,    38,    49, 0x0,                       STR_NULL},
  1134 /* company list */
  1116 {     WWT_MATRIX,   RESIZE_NONE,   BGC,    10,   155,    50,   190, (10 << 8) + 1,             STR_NETWORK_COMPANY_LIST_TIP},
  1135 {      WWT_PANEL,   RESIZE_NONE,   BTC,    10,   155,    38,    49, 0x0,                         STR_NULL},
  1117 {  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   156,   167,    38,   190, STR_NULL,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
  1136 {     WWT_MATRIX,   RESIZE_NONE,   BGC,    10,   155,    50,   190, (10 << 8) + 1,               STR_NETWORK_COMPANY_LIST_TIP},     // NLWW_MATRIX
  1118 
  1137 {  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   156,   167,    38,   190, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST},
  1119 // company/player info
  1138 
  1120 {      WWT_PANEL,   RESIZE_NONE,   BGC,   173,   404,    38,   190, 0x0,                       STR_NULL},
  1139 /* company/player info */
  1121 
  1140 {      WWT_PANEL,   RESIZE_NONE,   BGC,   173,   404,    38,   190, 0x0,                         STR_NULL},                         // NLWW_DETAILS
  1122 // buttons
  1141 
  1123 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   200,   211, STR_NETWORK_JOIN_COMPANY,  STR_NETWORK_JOIN_COMPANY_TIP},
  1142 /* buttons */
  1124 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   215,   226, STR_NETWORK_NEW_COMPANY,   STR_NETWORK_NEW_COMPANY_TIP},
  1143 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   200,   211, STR_NETWORK_JOIN_COMPANY,    STR_NETWORK_JOIN_COMPANY_TIP},     // NLWW_JOIN
  1125 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   200,   211, STR_NETWORK_SPECTATE_GAME, STR_NETWORK_SPECTATE_GAME_TIP},
  1144 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   215,   226, STR_NETWORK_NEW_COMPANY,     STR_NETWORK_NEW_COMPANY_TIP},      // NLWW_NEW
  1126 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   215,   226, STR_NETWORK_REFRESH,       STR_NETWORK_REFRESH_TIP},
  1145 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   200,   211, STR_NETWORK_SPECTATE_GAME,   STR_NETWORK_SPECTATE_GAME_TIP},    // NLWW_SPECTATE
  1127 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   278,   388,   200,   211, STR_012E_CANCEL,           STR_NULL},
  1146 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   215,   226, STR_NETWORK_REFRESH,         STR_NETWORK_REFRESH_TIP},          // NLWW_REFRESH
       
  1147 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   278,   388,   200,   211, STR_012E_CANCEL,             STR_NULL},                         // NLWW_CANCEL
  1128 
  1148 
  1129 {   WIDGETS_END},
  1149 {   WIDGETS_END},
  1130 };
  1150 };
  1131 
  1151 
  1132 static const WindowDesc _network_lobby_window_desc = {
  1152 static const WindowDesc _network_lobby_window_desc = {