2005-07-24 14:12:37 +00:00
/* $Id$ */
2009-08-21 20:21:05 +00:00
/*
* This file is part of OpenTTD .
* OpenTTD is free software ; you can redistribute it and / or modify it under the terms of the GNU General Public License as published by the Free Software Foundation , version 2.
* OpenTTD is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* 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 < http : //www.gnu.org/licenses/>.
*/
2008-05-06 15:11:33 +00:00
/** @file network_gui.cpp Implementation of the Network related GUIs. */
2006-10-12 14:13:39 +00:00
# ifdef ENABLE_NETWORK
2007-01-02 17:34:03 +00:00
# include "../stdafx.h"
2007-12-21 19:49:27 +00:00
# include "../strings_func.h"
2007-12-26 13:50:40 +00:00
# include "../date_func.h"
2007-01-02 17:34:03 +00:00
# include "../fios.h"
2006-06-11 16:00:56 +00:00
# include "network_client.h"
2006-10-12 14:13:39 +00:00
# include "network_gui.h"
2004-12-20 22:14:39 +00:00
# include "network_gamelist.h"
2010-01-15 16:41:15 +00:00
# include "network.h"
# include "network_base.h"
2007-01-02 17:34:03 +00:00
# include "../gui.h"
2004-12-04 17:54:56 +00:00
# include "network_udp.h"
2007-12-25 11:26:07 +00:00
# include "../window_func.h"
2008-01-09 09:45:45 +00:00
# include "../gfx_func.h"
2008-01-14 16:10:58 +00:00
# include "../widgets/dropdown_func.h"
2008-05-11 12:26:20 +00:00
# include "../querystring_gui.h"
2008-05-17 13:01:30 +00:00
# include "../sortlist_type.h"
2008-09-30 20:51:04 +00:00
# include "../company_base.h"
2009-05-19 21:20:14 +00:00
# include "../company_func.h"
2010-01-15 16:41:15 +00:00
# include "../core/geometry_func.hpp"
2004-08-09 17:04:08 +00:00
2008-01-13 01:21:35 +00:00
# include "table/strings.h"
# include "../table/sprites.h"
2006-01-26 16:19:24 +00:00
2007-03-07 11:47:46 +00:00
static void ShowNetworkStartServerWindow ( ) ;
2006-01-26 16:19:24 +00:00
static void ShowNetworkLobbyWindow ( NetworkGameList * ngl ) ;
2009-02-25 00:45:52 +00:00
extern void SwitchToMode ( SwitchMode new_mode ) ;
2004-08-09 17:04:08 +00:00
static const StringID _connection_types_dropdown [ ] = {
2009-08-05 17:59:21 +00:00
STR_NETWORK_START_SERVER_LAN_INTERNET ,
STR_NETWORK_START_SERVER_INTERNET_ADVERTISE ,
2004-08-09 17:04:08 +00:00
INVALID_STRING_ID
} ;
2004-12-22 18:42:56 +00:00
static const StringID _lan_internet_types_dropdown [ ] = {
2009-08-05 17:59:21 +00:00
STR_NETWORK_SERVER_LIST_LAN ,
STR_NETWORK_SERVER_LIST_INTERNET ,
2004-12-22 18:42:56 +00:00
INVALID_STRING_ID
} ;
2007-06-04 19:49:00 +00:00
static StringID _language_dropdown [ NETLANG_COUNT + 1 ] = { STR_NULL } ;
2007-06-04 16:07:22 +00:00
2007-07-25 00:16:30 +00:00
void SortNetworkLanguages ( )
{
2007-06-04 19:49:00 +00:00
/* Init the strings */
if ( _language_dropdown [ 0 ] = = STR_NULL ) {
for ( int i = 0 ; i < NETLANG_COUNT ; i + + ) _language_dropdown [ i ] = STR_NETWORK_LANG_ANY + i ;
_language_dropdown [ NETLANG_COUNT ] = INVALID_STRING_ID ;
2007-06-04 16:07:22 +00:00
}
2007-06-04 19:49:00 +00:00
/* Sort the strings (we don't move 'any' and the 'invalid' one) */
2009-09-13 17:38:07 +00:00
QSortT ( _language_dropdown , NETLANG_COUNT - 1 , & StringIDSorter ) ;
2007-06-04 16:07:22 +00:00
}
2007-06-01 23:06:01 +00:00
2006-11-06 00:14:36 +00:00
/** Update the network new window because a new server is
* found on the network .
* @ param unselect unselect the currently selected item */
2005-01-05 10:47:59 +00:00
void UpdateNetworkGameWindow ( bool unselect )
{
2009-01-17 16:53:32 +00:00
InvalidateWindowData ( WC_NETWORK_WINDOW , 0 , unselect ? 1 : 0 ) ;
2005-01-05 10:47:59 +00:00
}
2007-11-24 21:41:59 +00:00
/** Enum for NetworkGameWindow, referring to _network_game_window_widgets */
enum NetworkGameWindowWidgets {
2009-03-15 15:22:09 +00:00
NGWW_MAIN , ///< Main panel
2007-11-24 21:41:59 +00:00
2009-10-30 20:42:42 +00:00
NGWW_CONNECTION , ///< Label in front of connection droplist
2008-04-14 13:23:16 +00:00
NGWW_CONN_BTN , ///< 'Connection' droplist button
2009-10-30 20:42:42 +00:00
NGWW_CLIENT_LABEL , ///< Label in front of client name edit box
2008-09-30 20:39:50 +00:00
NGWW_CLIENT , ///< Panel with editbox to set client name
2008-04-14 13:23:16 +00:00
2009-10-30 20:42:42 +00:00
NGWW_HEADER , ///< Header container of the matrix
2008-04-14 13:23:16 +00:00
NGWW_NAME , ///< 'Name' button
2007-11-24 21:41:59 +00:00
NGWW_CLIENTS , ///< 'Clients' button
2008-07-18 20:44:35 +00:00
NGWW_MAPSIZE , ///< 'Map size' button
NGWW_DATE , ///< 'Date' button
NGWW_YEARS , ///< 'Years' button
2007-11-24 21:41:59 +00:00
NGWW_INFO , ///< Third button in the game list panel
2008-04-14 13:23:16 +00:00
NGWW_MATRIX , ///< Panel with list of games
NGWW_SCROLLBAR , ///< Scrollbar of matrix
2007-11-24 21:41:59 +00:00
2008-04-14 20:31:21 +00:00
NGWW_LASTJOINED_LABEL , ///< Label "Last joined server:"
NGWW_LASTJOINED , ///< Info about the last joined server
2008-04-14 13:23:16 +00:00
NGWW_DETAILS , ///< Panel with game details
2009-10-30 20:42:42 +00:00
NGWW_DETAILS_SPACER , ///< Spacer for game actual details
2008-04-14 13:23:16 +00:00
NGWW_JOIN , ///< 'Join game' button
NGWW_REFRESH , ///< 'Refresh server' button
NGWW_NEWGRF , ///< 'NewGRF Settings' button
2009-10-30 20:42:42 +00:00
NGWW_NEWGRF_SEL , ///< Selection 'widget' to hide the NewGRF settings
2007-11-24 21:41:59 +00:00
2008-04-14 13:23:16 +00:00
NGWW_FIND , ///< 'Find server' button
2007-11-24 21:41:59 +00:00
NGWW_ADD , ///< 'Add server' button
NGWW_START , ///< 'Start server' button
NGWW_CANCEL , ///< 'Cancel' button
} ;
2008-05-11 14:23:45 +00:00
typedef GUIList < NetworkGameList * > GUIGameServerList ;
2008-10-22 20:22:18 +00:00
typedef uint16 ServerListPosition ;
static const ServerListPosition SLP_INVALID = 0xFFFF ;
2008-05-11 14:23:45 +00:00
2009-10-30 20:42:42 +00:00
/** Full blown container to make it behave exactly as we want :) */
class NWidgetServerListHeader : public NWidgetContainer {
static const uint MINIMUM_NAME_WIDTH_BEFORE_NEW_HEADER = 150 ; ///< Minimum width before adding a new header
bool visible [ 6 ] ; ///< The visible headers
public :
NWidgetServerListHeader ( ) : NWidgetContainer ( NWID_HORIZONTAL )
{
NWidgetLeaf * leaf = new NWidgetLeaf ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_NAME , STR_NETWORK_SERVER_LIST_GAME_NAME , STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP ) ;
leaf - > SetResize ( 1 , 0 ) ;
2009-11-22 18:26:01 +00:00
leaf - > SetFill ( 1 , 0 ) ;
2009-10-30 20:42:42 +00:00
this - > Add ( leaf ) ;
this - > Add ( new NWidgetLeaf ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_CLIENTS , STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION , STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP ) ) ;
this - > Add ( new NWidgetLeaf ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_MAPSIZE , STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION , STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP ) ) ;
this - > Add ( new NWidgetLeaf ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_DATE , STR_NETWORK_SERVER_LIST_DATE_CAPTION , STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP ) ) ;
this - > Add ( new NWidgetLeaf ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_YEARS , STR_NETWORK_SERVER_LIST_YEARS_CAPTION , STR_NETWORK_SERVER_LIST_YEARS_CAPTION_TOOLTIP ) ) ;
leaf = new NWidgetLeaf ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_INFO , STR_EMPTY , STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP ) ;
leaf - > SetMinimalSize ( 40 , 12 ) ;
2009-11-22 18:26:01 +00:00
leaf - > SetFill ( 0 , 1 ) ;
2009-10-30 20:42:42 +00:00
this - > Add ( leaf ) ;
/* First and last are always visible, the rest is implicitly zeroed */
this - > visible [ 0 ] = true ;
* lastof ( this - > visible ) = true ;
}
void SetupSmallestSize ( Window * w , bool init_array )
{
/* Oh yeah, we ought to be findable! */
w - > nested_array [ NGWW_HEADER ] = this ;
this - > smallest_x = this - > head - > smallest_x + this - > tail - > smallest_x ; // First and last are always shown, rest not
this - > smallest_y = 0 ; // Biggest child.
2009-11-22 18:26:01 +00:00
this - > fill_x = 1 ;
this - > fill_y = 0 ;
2009-10-30 20:42:42 +00:00
this - > resize_x = 1 ; // We only resize in this direction
this - > resize_y = 0 ; // We never resize in this direction
/* First initialise some variables... */
for ( NWidgetBase * child_wid = this - > head ; child_wid ! = NULL ; child_wid = child_wid - > next ) {
child_wid - > SetupSmallestSize ( w , init_array ) ;
this - > smallest_y = max ( this - > smallest_y , child_wid - > smallest_y + child_wid - > padding_top + child_wid - > padding_bottom ) ;
}
/* ... then in a second pass make sure the 'current' sizes are set. Won't change for most widgets. */
for ( NWidgetBase * child_wid = this - > head ; child_wid ! = NULL ; child_wid = child_wid - > next ) {
child_wid - > current_x = child_wid - > smallest_x ;
child_wid - > current_y = this - > smallest_y ;
}
}
2009-11-20 20:10:06 +00:00
void AssignSizePosition ( SizingType sizing , uint x , uint y , uint given_width , uint given_height , bool rtl )
2009-10-30 20:42:42 +00:00
{
assert ( given_width > = this - > smallest_x & & given_height > = this - > smallest_y ) ;
this - > pos_x = x ;
this - > pos_y = y ;
this - > current_x = given_width ;
this - > current_y = given_height ;
given_width - = this - > tail - > smallest_x ;
NWidgetBase * child_wid = this - > head - > next ;
/* The first and last widget are always visible, determine which other should be visible */
for ( uint i = 1 ; i < lengthof ( this - > visible ) - 1 ; i + + ) {
if ( given_width - child_wid - > smallest_x > MINIMUM_NAME_WIDTH_BEFORE_NEW_HEADER & & this - > visible [ i - 1 ] ) {
this - > visible [ i ] = true ;
given_width - = child_wid - > smallest_x ;
} else {
this - > visible [ i ] = false ;
}
child_wid = child_wid - > next ;
}
/* All remaining space goes to the first (name) widget */
this - > head - > current_x = given_width ;
/* Now assign the widgets to their rightful place */
uint position = 0 ; // Place to put next child relative to origin of the container.
uint i = rtl ? lengthof ( this - > visible ) - 1 : 0 ;
child_wid = rtl ? this - > tail : this - > head ;
while ( child_wid ! = NULL ) {
if ( this - > visible [ i ] ) {
2009-11-20 20:10:06 +00:00
child_wid - > AssignSizePosition ( sizing , x + position , y , child_wid - > current_x , this - > current_y , rtl ) ;
2009-10-30 20:42:42 +00:00
position + = child_wid - > current_x ;
}
child_wid = rtl ? child_wid - > prev : child_wid - > next ;
i + = rtl ? - 1 : 1 ;
}
}
/* virtual */ void Draw ( const Window * w )
{
int i = 0 ;
for ( NWidgetBase * child_wid = this - > head ; child_wid ! = NULL ; child_wid = child_wid - > next ) {
if ( ! this - > visible [ i + + ] ) continue ;
child_wid - > Draw ( w ) ;
}
}
/* virtual */ NWidgetCore * GetWidgetFromPos ( int x , int y )
{
if ( ! IsInsideBS ( x , this - > pos_x , this - > current_x ) | | ! IsInsideBS ( y , this - > pos_y , this - > current_y ) ) return NULL ;
int i = 0 ;
for ( NWidgetBase * child_wid = this - > head ; child_wid ! = NULL ; child_wid = child_wid - > next ) {
if ( ! this - > visible [ i + + ] ) continue ;
NWidgetCore * nwid = child_wid - > GetWidgetFromPos ( x , y ) ;
if ( nwid ! = NULL ) return nwid ;
}
return NULL ;
}
/**
* Checks whether the given widget is actually visible .
* @ param widget the widget to check for visibility
* @ return true iff the widget is visible .
*/
bool IsWidgetVisible ( NetworkGameWindowWidgets widget ) const
{
assert ( ( uint ) ( widget - NGWW_NAME ) < lengthof ( this - > visible ) ) ;
return this - > visible [ widget - NGWW_NAME ] ;
}
} ;
2008-05-29 16:37:26 +00:00
class NetworkGameWindow : public QueryStringBaseWindow {
protected :
/* Runtime saved values */
static Listing last_sorting ;
/* Constants for sorting servers */
2009-03-15 16:04:39 +00:00
static GUIGameServerList : : SortFunction * const sorter_funcs [ ] ;
2008-05-29 16:37:26 +00:00
2009-04-15 20:37:00 +00:00
byte field ; ///< selected text-field
NetworkGameList * server ; ///< selected server
NetworkGameList * last_joined ; ///< the last joined server
GUIGameServerList servers ; ///< list with game servers.
ServerListPosition list_pos ; ///< position of the selected server
2008-04-14 20:31:21 +00:00
2008-05-11 12:26:20 +00:00
/**
* ( Re ) build the network game list as its amount has changed because
* an item has been added or deleted for example
*/
void BuildNetworkGameList ( )
{
2008-05-29 16:37:26 +00:00
if ( ! this - > servers . NeedRebuild ( ) ) return ;
2007-07-27 19:57:52 +00:00
2008-05-11 12:26:20 +00:00
/* Create temporary array of games to use for listing */
2008-05-26 16:23:23 +00:00
this - > servers . Clear ( ) ;
2005-11-13 13:43:55 +00:00
2008-05-26 16:23:23 +00:00
for ( NetworkGameList * ngl = _network_game_list ; ngl ! = NULL ; ngl = ngl - > next ) {
* this - > servers . Append ( ) = ngl ;
2008-05-11 12:26:20 +00:00
}
2006-01-26 17:10:11 +00:00
2008-05-26 16:23:23 +00:00
this - > servers . Compact ( ) ;
2008-05-29 16:37:26 +00:00
this - > servers . RebuildDone ( ) ;
2009-09-02 08:08:30 +00:00
this - > vscroll . SetCount ( this - > servers . Length ( ) ) ;
2008-05-29 16:37:26 +00:00
}
2008-05-26 16:23:23 +00:00
2008-05-29 16:37:26 +00:00
/** Sort servers by name. */
2009-01-10 00:31:47 +00:00
static int CDECL NGameNameSorter ( NetworkGameList * const * a , NetworkGameList * const * b )
2008-05-29 16:37:26 +00:00
{
return strcasecmp ( ( * a ) - > info . server_name , ( * b ) - > info . server_name ) ;
2008-05-11 12:26:20 +00:00
}
2008-03-26 10:38:31 +00:00
2008-05-29 16:37:26 +00:00
/** Sort servers by the amount of clients online on a
* server . If the two servers have the same amount , the one with the
* higher maximum is preferred . */
2009-01-10 00:31:47 +00:00
static int CDECL NGameClientSorter ( NetworkGameList * const * a , NetworkGameList * const * b )
2008-05-11 12:26:20 +00:00
{
2008-05-29 16:37:26 +00:00
/* Reverse as per default we are interested in most-clients first */
int r = ( * a ) - > info . clients_on - ( * b ) - > info . clients_on ;
if ( r = = 0 ) r = ( * a ) - > info . clients_max - ( * b ) - > info . clients_max ;
if ( r = = 0 ) r = NGameNameSorter ( a , b ) ;
2008-05-11 12:26:20 +00:00
2008-05-29 16:37:26 +00:00
return r ;
}
2008-05-11 12:26:20 +00:00
2008-07-18 20:44:35 +00:00
/** Sort servers by map size */
2009-01-10 00:31:47 +00:00
static int CDECL NGameMapSizeSorter ( NetworkGameList * const * a , NetworkGameList * const * b )
2008-07-18 20:44:35 +00:00
{
/* Sort by the area of the map. */
int r = ( ( * a ) - > info . map_height ) * ( ( * a ) - > info . map_width ) - ( ( * b ) - > info . map_height ) * ( ( * b ) - > info . map_width ) ;
if ( r = = 0 ) r = ( * a ) - > info . map_width - ( * b ) - > info . map_width ;
return ( r ! = 0 ) ? r : NGameClientSorter ( a , b ) ;
}
/** Sort servers by current date */
2009-01-10 00:31:47 +00:00
static int CDECL NGameDateSorter ( NetworkGameList * const * a , NetworkGameList * const * b )
2008-07-18 20:44:35 +00:00
{
int r = ( * a ) - > info . game_date - ( * b ) - > info . game_date ;
return ( r ! = 0 ) ? r : NGameClientSorter ( a , b ) ;
}
/** Sort servers by the number of days the game is running */
2009-01-10 00:31:47 +00:00
static int CDECL NGameYearsSorter ( NetworkGameList * const * a , NetworkGameList * const * b )
2008-07-18 20:44:35 +00:00
{
int r = ( * a ) - > info . game_date - ( * a ) - > info . start_date - ( * b ) - > info . game_date + ( * b ) - > info . start_date ;
return ( r ! = 0 ) ? r : NGameDateSorter ( a , b ) ;
}
2008-05-29 16:37:26 +00:00
/** Sort servers by joinability. If both servers are the
* same , prefer the non - passworded server first . */
2009-01-10 00:31:47 +00:00
static int CDECL NGameAllowedSorter ( NetworkGameList * const * a , NetworkGameList * const * b )
2008-05-29 16:37:26 +00:00
{
/* The servers we do not know anything about (the ones that did not reply) should be at the bottom) */
int r = StrEmpty ( ( * a ) - > info . server_revision ) - StrEmpty ( ( * b ) - > info . server_revision ) ;
/* Reverse default as we are interested in version-compatible clients first */
if ( r = = 0 ) r = ( * b ) - > info . version_compatible - ( * a ) - > info . version_compatible ;
/* The version-compatible ones are then sorted with NewGRF compatible first, incompatible last */
if ( r = = 0 ) r = ( * b ) - > info . compatible - ( * a ) - > info . compatible ;
/* Passworded servers should be below unpassworded servers */
if ( r = = 0 ) r = ( * a ) - > info . use_password - ( * b ) - > info . use_password ;
/* Finally sort on the name of the server */
if ( r = = 0 ) r = NGameNameSorter ( a , b ) ;
return r ;
}
2008-05-11 12:26:20 +00:00
2008-05-29 16:37:26 +00:00
/** Sort the server list */
void SortNetworkGameList ( )
{
if ( ! this - > servers . Sort ( ) ) return ;
2008-05-11 12:26:20 +00:00
/* After sorting ngl->sort_list contains the sorted items. Put these back
* into the original list . Basically nothing has changed , we are only
2008-10-22 20:22:18 +00:00
* shuffling the - > next pointers . While iterating , look for the
* currently selected server and set list_pos to its position */
this - > list_pos = SLP_INVALID ;
2008-05-26 16:23:23 +00:00
_network_game_list = this - > servers [ 0 ] ;
2008-05-29 16:37:26 +00:00
NetworkGameList * item = _network_game_list ;
2008-10-22 20:22:18 +00:00
if ( item = = this - > server ) this - > list_pos = 0 ;
2008-05-29 16:37:26 +00:00
for ( uint i = 1 ; i ! = this - > servers . Length ( ) ; i + + ) {
2008-05-26 16:23:23 +00:00
item - > next = this - > servers [ i ] ;
2008-05-11 12:26:20 +00:00
item = item - > next ;
2008-10-22 20:22:18 +00:00
if ( item = = this - > server ) this - > list_pos = i ;
2008-05-11 12:26:20 +00:00
}
item - > next = NULL ;
}
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
/**
* Draw a single server line .
* @ param cur_item the server to draw .
* @ param y from where to draw ?
* @ param highlight does the line need to be highlighted ?
*/
2009-10-30 20:42:42 +00:00
void DrawServerLine ( const NetworkGameList * cur_item , uint y , bool highlight ) const
2008-05-11 12:26:20 +00:00
{
2009-11-22 13:22:53 +00:00
const NWidgetBase * nwi_name = this - > GetWidget < NWidgetBase > ( NGWW_NAME ) ;
const NWidgetBase * nwi_info = this - > GetWidget < NWidgetBase > ( NGWW_INFO ) ;
2009-10-30 20:42:42 +00:00
2008-05-11 12:26:20 +00:00
/* show highlighted item with a different colour */
2009-10-30 20:42:42 +00:00
if ( highlight ) GfxFillRect ( nwi_name - > pos_x + 1 , y - 2 , nwi_info - > pos_x + nwi_info - > current_x - 2 , y + FONT_HEIGHT_NORMAL - 1 , 10 ) ;
2006-01-26 17:10:11 +00:00
2009-10-30 20:42:42 +00:00
DrawString ( nwi_name - > pos_x + WD_FRAMERECT_LEFT , nwi_name - > pos_x + nwi_name - > current_x - WD_FRAMERECT_RIGHT , y , cur_item - > info . server_name , TC_BLACK ) ;
2004-12-27 10:24:38 +00:00
2008-07-18 20:44:35 +00:00
/* only draw details if the server is online */
2008-05-11 12:26:20 +00:00
if ( cur_item - > online ) {
2009-10-30 20:42:42 +00:00
const NWidgetServerListHeader * nwi_header = this - > GetWidget < NWidgetServerListHeader > ( NGWW_HEADER ) ;
if ( nwi_header - > IsWidgetVisible ( NGWW_CLIENTS ) ) {
2009-11-22 13:22:53 +00:00
const NWidgetBase * nwi_clients = this - > GetWidget < NWidgetBase > ( NGWW_CLIENTS ) ;
2009-10-30 20:42:42 +00:00
SetDParam ( 0 , cur_item - > info . clients_on ) ;
SetDParam ( 1 , cur_item - > info . clients_max ) ;
SetDParam ( 2 , cur_item - > info . companies_on ) ;
SetDParam ( 3 , cur_item - > info . companies_max ) ;
DrawString ( nwi_clients - > pos_x , nwi_clients - > pos_x + nwi_clients - > current_x - 1 , y , STR_NETWORK_SERVER_LIST_GENERAL_ONLINE , TC_FROMSTRING , SA_CENTER ) ;
}
if ( nwi_header - > IsWidgetVisible ( NGWW_MAPSIZE ) ) {
/* map size */
2009-11-22 13:22:53 +00:00
const NWidgetBase * nwi_mapsize = this - > GetWidget < NWidgetBase > ( NGWW_MAPSIZE ) ;
2008-07-18 20:44:35 +00:00
SetDParam ( 0 , cur_item - > info . map_width ) ;
SetDParam ( 1 , cur_item - > info . map_height ) ;
2009-10-30 20:42:42 +00:00
DrawString ( nwi_mapsize - > pos_x , nwi_mapsize - > pos_x + nwi_mapsize - > current_x - 1 , y , STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT , TC_FROMSTRING , SA_CENTER ) ;
2008-07-18 20:44:35 +00:00
}
2009-10-30 20:42:42 +00:00
if ( nwi_header - > IsWidgetVisible ( NGWW_DATE ) ) {
/* current date */
2009-11-22 13:22:53 +00:00
const NWidgetBase * nwi_date = this - > GetWidget < NWidgetBase > ( NGWW_DATE ) ;
2008-07-18 20:44:35 +00:00
YearMonthDay ymd ;
ConvertDateToYMD ( cur_item - > info . game_date , & ymd ) ;
SetDParam ( 0 , ymd . year ) ;
2009-10-30 20:42:42 +00:00
DrawString ( nwi_date - > pos_x , nwi_date - > pos_x + nwi_date - > current_x - 1 , y , STR_JUST_INT , TC_BLACK , SA_CENTER ) ;
2008-07-18 20:44:35 +00:00
}
2009-10-30 20:42:42 +00:00
if ( nwi_header - > IsWidgetVisible ( NGWW_YEARS ) ) {
/* number of years the game is running */
2009-11-22 13:22:53 +00:00
const NWidgetBase * nwi_years = this - > GetWidget < NWidgetBase > ( NGWW_YEARS ) ;
2008-07-18 20:44:35 +00:00
YearMonthDay ymd_cur , ymd_start ;
ConvertDateToYMD ( cur_item - > info . game_date , & ymd_cur ) ;
ConvertDateToYMD ( cur_item - > info . start_date , & ymd_start ) ;
SetDParam ( 0 , ymd_cur . year - ymd_start . year ) ;
2009-10-30 20:42:42 +00:00
DrawString ( nwi_years - > pos_x , nwi_years - > pos_x + nwi_years - > current_x - 1 , y , STR_JUST_INT , TC_BLACK , SA_CENTER ) ;
2008-07-18 20:44:35 +00:00
}
2009-11-22 13:12:31 +00:00
/* Align the sprites */
y + = ( FONT_HEIGHT_NORMAL - 10 ) / 2 ;
2008-05-11 12:26:20 +00:00
/* draw a lock if the server is password protected */
2009-10-30 20:42:42 +00:00
if ( cur_item - > info . use_password ) DrawSprite ( SPR_LOCK , PAL_NONE , nwi_info - > pos_x + 5 , y - 1 ) ;
2004-12-10 22:01:17 +00:00
2008-05-11 12:26:20 +00:00
/* draw red or green icon, depending on compatibility with server */
2009-10-30 20:42:42 +00:00
DrawSprite ( SPR_BLOT , ( cur_item - > info . compatible ? PALETTE_TO_GREEN : ( cur_item - > info . version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED ) ) , nwi_info - > pos_x + 15 , y ) ;
2004-12-04 17:54:56 +00:00
2008-05-11 12:26:20 +00:00
/* draw flag according to server language */
2009-10-30 20:42:42 +00:00
DrawSprite ( SPR_FLAGS_BASE + cur_item - > info . server_lang , PAL_NONE , nwi_info - > pos_x + 25 , y ) ;
2008-05-11 12:26:20 +00:00
}
}
2008-03-26 10:38:31 +00:00
2008-10-22 20:22:18 +00:00
/**
* Scroll the list up or down to the currently selected server .
* If the server is below the currently displayed servers , it will
* scroll down an amount so that the server appears at the bottom .
* If the server is above the currently displayed servers , it will
* scroll up so that the server appears at the top .
*/
void ScrollToSelectedServer ( )
{
if ( this - > list_pos = = SLP_INVALID ) return ; // no server selected
2009-09-02 08:08:30 +00:00
this - > vscroll . ScrollTowards ( this - > list_pos ) ;
2008-10-22 20:22:18 +00:00
}
2008-05-29 16:37:26 +00:00
public :
2009-10-30 20:42:42 +00:00
NetworkGameWindow ( const WindowDesc * desc ) : QueryStringBaseWindow ( NETWORK_CLIENT_NAME_LENGTH )
2008-05-29 16:37:26 +00:00
{
2009-10-30 20:42:42 +00:00
this - > InitNested ( desc , 0 ) ;
2009-03-22 21:16:57 +00:00
2008-09-30 20:39:50 +00:00
ttd_strlcpy ( this - > edit_str_buf , _settings_client . network . client_name , this - > edit_str_size ) ;
2008-05-29 16:37:26 +00:00
this - > afilter = CS_ALPHANUMERAL ;
2008-08-11 22:08:56 +00:00
InitializeTextBuffer ( & this - > text , this - > edit_str_buf , this - > edit_str_size , 120 ) ;
2009-02-09 01:22:29 +00:00
this - > SetFocusedWidget ( NGWW_CLIENT ) ;
2008-05-29 16:37:26 +00:00
UpdateNetworkGameWindow ( true ) ;
2008-09-30 20:39:50 +00:00
this - > field = NGWW_CLIENT ;
2009-04-15 20:37:00 +00:00
this - > last_joined = NetworkGameListAddItem ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) ) ;
2009-12-20 19:18:18 +00:00
this - > server = this - > last_joined ;
2009-04-15 20:37:00 +00:00
2008-05-29 16:37:26 +00:00
this - > servers . SetListing ( this - > last_sorting ) ;
this - > servers . SetSortFuncs ( this - > sorter_funcs ) ;
this - > servers . ForceRebuild ( ) ;
this - > SortNetworkGameList ( ) ;
}
~ NetworkGameWindow ( )
{
this - > last_sorting = this - > servers . GetListing ( ) ;
}
2009-10-30 20:42:42 +00:00
virtual void SetStringParameters ( int widget ) const
2008-05-11 12:26:20 +00:00
{
2009-10-30 20:42:42 +00:00
switch ( widget ) {
case NGWW_CONN_BTN :
SetDParam ( 0 , _lan_internet_types_dropdown [ _settings_client . network . lan_internet ] ) ;
break ;
}
}
2009-11-22 18:28:14 +00:00
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
2009-10-30 20:42:42 +00:00
{
switch ( widget ) {
case NGWW_CONN_BTN :
* size = maxdim ( GetStringBoundingBox ( _lan_internet_types_dropdown [ 0 ] ) , GetStringBoundingBox ( _lan_internet_types_dropdown [ 1 ] ) ) ;
size - > width + = padding . width ;
size - > height + = padding . height ;
break ;
case NGWW_MATRIX :
resize - > height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM ;
size - > height = 10 * resize - > height ;
break ;
case NGWW_LASTJOINED :
size - > height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM ;
break ;
case NGWW_NAME :
size - > width + = 2 * WD_SORTBUTTON_ARROW_WIDTH ; // Make space for the arrow
break ;
2004-12-15 00:31:08 +00:00
2009-10-30 20:42:42 +00:00
case NGWW_CLIENTS :
size - > width + = 2 * WD_SORTBUTTON_ARROW_WIDTH ; // Make space for the arrow
SetDParam ( 0 , 255 ) ;
SetDParam ( 1 , 255 ) ;
SetDParam ( 2 , 15 ) ;
SetDParam ( 3 , 15 ) ;
* size = maxdim ( * size , GetStringBoundingBox ( STR_NETWORK_SERVER_LIST_GENERAL_ONLINE ) ) ;
break ;
case NGWW_MAPSIZE :
size - > width + = 2 * WD_SORTBUTTON_ARROW_WIDTH ; // Make space for the arrow
SetDParam ( 0 , 2048 ) ;
SetDParam ( 1 , 2048 ) ;
* size = maxdim ( * size , GetStringBoundingBox ( STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT ) ) ;
break ;
case NGWW_DATE :
case NGWW_YEARS :
size - > width + = 2 * WD_SORTBUTTON_ARROW_WIDTH ; // Make space for the arrow
SetDParam ( 0 , 99999 ) ;
* size = maxdim ( * size , GetStringBoundingBox ( STR_JUST_INT ) ) ;
break ;
case NGWW_DETAILS_SPACER :
size - > height = 20 + 12 * FONT_HEIGHT_NORMAL ;
break ;
}
}
virtual void DrawWidget ( const Rect & r , int widget ) const
{
switch ( widget ) {
case NGWW_MATRIX : {
uint16 y = r . top + WD_MATRIX_TOP ;
const int max = min ( this - > vscroll . GetPosition ( ) + this - > vscroll . GetCapacity ( ) , ( int ) this - > servers . Length ( ) ) ;
for ( int i = this - > vscroll . GetPosition ( ) ; i < max ; + + i ) {
const NetworkGameList * ngl = this - > servers [ i ] ;
this - > DrawServerLine ( ngl , y , ngl = = this - > server ) ;
y + = this - > resize . step_height ;
}
} break ;
case NGWW_LASTJOINED :
/* Draw the last joined server, if any */
if ( this - > last_joined ! = NULL ) this - > DrawServerLine ( this - > last_joined , r . top + WD_MATRIX_TOP , this - > last_joined = = this - > server ) ;
break ;
case NGWW_DETAILS :
this - > DrawDetails ( r ) ;
break ;
case NGWW_NAME :
case NGWW_CLIENTS :
case NGWW_MAPSIZE :
case NGWW_DATE :
case NGWW_YEARS :
case NGWW_INFO :
if ( widget - NGWW_NAME = = this - > servers . SortType ( ) ) this - > DrawSortButtonState ( widget , this - > servers . IsDescSortOrder ( ) ? SBS_DOWN : SBS_UP ) ;
break ;
}
}
virtual void OnPaint ( )
{
2008-05-29 16:37:26 +00:00
if ( this - > servers . NeedRebuild ( ) ) {
2008-05-11 12:26:20 +00:00
this - > BuildNetworkGameList ( ) ;
}
2008-05-29 16:37:26 +00:00
this - > SortNetworkGameList ( ) ;
2008-05-11 12:26:20 +00:00
2009-10-30 20:42:42 +00:00
NetworkGameList * sel = this - > server ;
2008-05-11 12:26:20 +00:00
/* 'Refresh' button invisible if no server selected */
this - > SetWidgetDisabledState ( NGWW_REFRESH , sel = = NULL ) ;
/* 'Join' button disabling conditions */
this - > SetWidgetDisabledState ( NGWW_JOIN , sel = = NULL | | // no Selected Server
! sel - > online | | // Server offline
sel - > info . clients_on > = sel - > info . clients_max | | // Server full
! sel - > info . compatible ) ; // Revision mismatch
/* 'NewGRF Settings' button invisible if no NewGRF is used */
2009-10-30 20:42:42 +00:00
this - > GetWidget < NWidgetStacked > ( NGWW_NEWGRF_SEL ) - > SetDisplayedPlane ( sel = = NULL | | ! sel - > online | | sel - > info . grfconfig = = NULL ) ;
2008-05-11 12:26:20 +00:00
2008-05-17 12:48:06 +00:00
this - > DrawWidgets ( ) ;
2008-09-30 20:39:50 +00:00
/* Edit box to set client name */
this - > DrawEditBox ( NGWW_CLIENT ) ;
2009-10-26 22:10:09 +00:00
}
void DrawDetails ( const Rect & r ) const
{
NetworkGameList * sel = this - > server ;
const int detail_height = 6 + 8 + 6 + 3 * FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
/* Draw the right menu */
2009-10-26 22:10:09 +00:00
GfxFillRect ( r . left + 1 , r . top + 1 , r . right - 1 , r . top + detail_height - 1 , 157 ) ;
2008-05-11 12:26:20 +00:00
if ( sel = = NULL ) {
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + 6 + 4 + FONT_HEIGHT_NORMAL , STR_NETWORK_SERVER_LIST_GAME_INFO , TC_FROMSTRING , SA_CENTER ) ;
2008-05-11 12:26:20 +00:00
} else if ( ! sel - > online ) {
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + 6 + 4 + FONT_HEIGHT_NORMAL , sel - > info . server_name , TC_ORANGE , SA_CENTER ) ; // game name
2008-04-14 20:31:21 +00:00
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + detail_height + 4 , STR_NETWORK_SERVER_LIST_SERVER_OFFLINE , TC_FROMSTRING , SA_CENTER ) ; // server offline
2008-05-11 12:26:20 +00:00
} else { // show game info
2008-03-26 10:38:31 +00:00
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + 6 , STR_NETWORK_SERVER_LIST_GAME_INFO , TC_FROMSTRING , SA_CENTER ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + 6 + 4 + FONT_HEIGHT_NORMAL , sel - > info . server_name , TC_ORANGE , SA_CENTER ) ; // game name
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + 6 + 8 + 2 * FONT_HEIGHT_NORMAL , sel - > info . map_name , TC_BLACK , SA_CENTER ) ; // map name
2008-03-26 10:38:31 +00:00
2009-10-26 22:10:09 +00:00
uint16 y = r . top + detail_height + 4 ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
SetDParam ( 0 , sel - > info . clients_on ) ;
SetDParam ( 1 , sel - > info . clients_max ) ;
SetDParam ( 2 , sel - > info . companies_on ) ;
SetDParam ( 3 , sel - > info . companies_max ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_CLIENTS ) ;
y + = FONT_HEIGHT_NORMAL ;
2004-12-04 17:54:56 +00:00
2008-05-11 12:26:20 +00:00
SetDParam ( 0 , STR_NETWORK_LANG_ANY + sel - > info . server_lang ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_LANGUAGE ) ; // server language
y + = FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
2009-08-05 17:59:21 +00:00
SetDParam ( 0 , STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE + sel - > info . map_set ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_TILESET ) ; // tileset
y + = FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
SetDParam ( 0 , sel - > info . map_width ) ;
SetDParam ( 1 , sel - > info . map_height ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_MAP_SIZE ) ; // map size
y + = FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
SetDParamStr ( 0 , sel - > info . server_revision ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_SERVER_VERSION ) ; // server version
y + = FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
2009-04-08 12:52:53 +00:00
SetDParamStr ( 0 , sel - > address . GetAddressAsString ( ) ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_SERVER_ADDRESS ) ; // server address
y + = FONT_HEIGHT_NORMAL ;
2004-09-06 22:46:02 +00:00
2008-05-11 12:26:20 +00:00
SetDParam ( 0 , sel - > info . start_date ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_START_DATE ) ; // start date
y + = FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
SetDParam ( 0 , sel - > info . game_date ) ;
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_CURRENT_DATE ) ; // current date
y + = FONT_HEIGHT_NORMAL ;
2008-05-11 12:26:20 +00:00
2009-10-26 22:10:09 +00:00
y + = WD_PAR_VSEP_NORMAL ;
2008-05-11 12:26:20 +00:00
if ( ! sel - > info . compatible ) {
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , sel - > info . version_compatible ? STR_NETWORK_SERVER_LIST_GRF_MISMATCH : STR_NETWORK_SERVER_LIST_VERSION_MISMATCH , TC_FROMSTRING , SA_CENTER ) ; // server mismatch
2008-05-11 12:26:20 +00:00
} else if ( sel - > info . clients_on = = sel - > info . clients_max ) {
2008-06-03 08:04:35 +00:00
/* Show: server full, when clients_on == max_clients */
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_SERVER_FULL , TC_FROMSTRING , SA_CENTER ) ; // server full
2008-05-11 12:26:20 +00:00
} else if ( sel - > info . use_password ) {
2009-10-26 22:10:09 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_PASSWORD , TC_FROMSTRING , SA_CENTER ) ; // password warning
2008-03-26 10:38:31 +00:00
}
2008-05-11 12:26:20 +00:00
}
}
2004-12-22 18:42:56 +00:00
2010-01-30 18:34:48 +00:00
virtual void OnClick ( Point pt , int widget , int click_count )
2008-05-11 12:26:20 +00:00
{
this - > field = widget ;
switch ( widget ) {
case NGWW_CANCEL : // Cancel button
DeleteWindowById ( WC_NETWORK_WINDOW , 0 ) ;
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NGWW_CONN_BTN : // 'Connection' droplist
2008-05-29 20:21:28 +00:00
ShowDropDownMenu ( this , _lan_internet_types_dropdown , _settings_client . network . lan_internet , NGWW_CONN_BTN , 0 , 0 ) ; // do it for widget NSSW_CONN_BTN
2008-05-11 12:26:20 +00:00
break ;
2008-07-18 20:44:35 +00:00
case NGWW_NAME : // Sort by name
2008-05-11 12:26:20 +00:00
case NGWW_CLIENTS : // Sort by connected clients
2008-07-18 20:44:35 +00:00
case NGWW_MAPSIZE : // Sort by map size
case NGWW_DATE : // Sort by date
case NGWW_YEARS : // Sort by years
case NGWW_INFO : // Connectivity (green dot)
2008-05-29 16:37:26 +00:00
if ( this - > servers . SortType ( ) = = widget - NGWW_NAME ) {
this - > servers . ToggleSortOrder ( ) ;
2008-10-22 20:22:18 +00:00
if ( this - > list_pos ! = SLP_INVALID ) this - > list_pos = this - > servers . Length ( ) - this - > list_pos - 1 ;
2008-05-29 16:37:26 +00:00
} else {
this - > servers . SetSortType ( widget - NGWW_NAME ) ;
this - > servers . ForceResort ( ) ;
2008-10-22 20:22:18 +00:00
this - > SortNetworkGameList ( ) ;
2008-05-29 16:37:26 +00:00
}
2008-10-22 20:22:18 +00:00
this - > ScrollToSelectedServer ( ) ;
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
break ;
case NGWW_MATRIX : { // Matrix to show networkgames
2009-11-22 13:22:53 +00:00
uint32 id_v = ( pt . y - this - > GetWidget < NWidgetBase > ( NGWW_MATRIX ) - > pos_y ) / this - > resize . step_height ;
2008-05-11 12:26:20 +00:00
2009-09-02 08:08:30 +00:00
if ( id_v > = this - > vscroll . GetCapacity ( ) ) return ; // click out of bounds
id_v + = this - > vscroll . GetPosition ( ) ;
2008-05-11 12:26:20 +00:00
2008-05-29 16:47:22 +00:00
this - > server = ( id_v < this - > servers . Length ( ) ) ? this - > servers [ id_v ] : NULL ;
2008-10-22 20:22:18 +00:00
this - > list_pos = ( server = = NULL ) ? SLP_INVALID : id_v ;
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
2010-01-30 18:34:48 +00:00
/* FIXME the disabling should go into some InvalidateData, which is called instead of the SetDirty */
if ( ! this - > IsWidgetDisabled ( NGWW_JOIN ) ) this - > OnClick ( pt , NGWW_JOIN , 1 ) ;
2008-05-11 12:26:20 +00:00
} break ;
case NGWW_LASTJOINED : {
2009-04-02 20:17:46 +00:00
NetworkGameList * last_joined = NetworkGameListAddItem ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) ) ;
2008-05-11 12:26:20 +00:00
if ( last_joined ! = NULL ) {
this - > server = last_joined ;
2008-10-22 20:22:18 +00:00
/* search the position of the newly selected server */
for ( uint i = 0 ; i < this - > servers . Length ( ) ; i + + ) {
if ( this - > servers [ i ] = = this - > server ) {
this - > list_pos = i ;
break ;
}
}
this - > ScrollToSelectedServer ( ) ;
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
2010-01-30 18:34:48 +00:00
/* FIXME the disabling should go into some InvalidateData, which is called instead of the SetDirty */
if ( ! this - > IsWidgetDisabled ( NGWW_JOIN ) ) this - > OnClick ( pt , NGWW_JOIN , 1 ) ;
2008-05-11 12:26:20 +00:00
}
} break ;
case NGWW_FIND : // Find server automatically
2008-05-29 20:21:28 +00:00
switch ( _settings_client . network . lan_internet ) {
2008-05-11 12:26:20 +00:00
case 0 : NetworkUDPSearchGame ( ) ; break ;
case 1 : NetworkUDPQueryMasterServer ( ) ; break ;
2004-12-20 22:14:39 +00:00
}
2008-03-26 10:38:31 +00:00
break ;
2004-12-21 14:54:27 +00:00
2008-05-11 12:26:20 +00:00
case NGWW_ADD : // Add a server
2008-07-17 13:47:04 +00:00
SetDParamStr ( 0 , _settings_client . network . connect_to_ip ) ;
2008-05-11 12:26:20 +00:00
ShowQueryString (
2008-07-17 13:47:04 +00:00
STR_JUST_RAW_STRING ,
2009-08-05 17:59:21 +00:00
STR_NETWORK_SERVER_LIST_ENTER_IP ,
2009-05-08 09:00:47 +00:00
NETWORK_HOSTNAME_LENGTH , // maximum number of characters including '\0'
0 , // no limit in pixels
2008-09-15 16:29:40 +00:00
this , CS_ALPHANUMERAL , QSF_ACCEPT_UNCHANGED ) ;
2008-05-11 12:26:20 +00:00
break ;
2004-12-04 17:54:56 +00:00
2008-05-11 12:26:20 +00:00
case NGWW_START : // Start server
ShowNetworkStartServerWindow ( ) ;
break ;
2004-12-04 17:54:56 +00:00
2008-05-11 12:26:20 +00:00
case NGWW_JOIN : // Join Game
if ( this - > server ! = NULL ) {
2009-04-02 20:17:46 +00:00
snprintf ( _settings_client . network . last_host , sizeof ( _settings_client . network . last_host ) , " %s " , this - > server - > address . GetHostname ( ) ) ;
_settings_client . network . last_port = this - > server - > address . GetPort ( ) ;
2008-05-11 12:26:20 +00:00
ShowNetworkLobbyWindow ( this - > server ) ;
}
break ;
2004-08-09 17:04:08 +00:00
2008-05-11 12:26:20 +00:00
case NGWW_REFRESH : // Refresh
2009-04-02 20:17:46 +00:00
if ( this - > server ! = NULL ) NetworkUDPQueryServer ( this - > server - > address ) ;
2008-05-11 12:26:20 +00:00
break ;
2006-01-26 17:10:11 +00:00
2008-05-11 12:26:20 +00:00
case NGWW_NEWGRF : // NewGRF Settings
if ( this - > server ! = NULL ) ShowNewGRFSettings ( false , false , false , & this - > server - > info . grfconfig ) ;
break ;
}
}
2007-07-27 19:57:52 +00:00
2008-05-11 12:26:20 +00:00
virtual void OnDropdownSelect ( int widget , int index )
{
switch ( widget ) {
case NGWW_CONN_BTN :
2008-05-29 20:21:28 +00:00
_settings_client . network . lan_internet = index ;
2008-05-11 12:26:20 +00:00
break ;
2007-07-27 19:57:52 +00:00
2008-05-11 12:26:20 +00:00
default :
NOT_REACHED ( ) ;
}
this - > SetDirty ( ) ;
}
virtual void OnMouseLoop ( )
{
2008-09-30 20:39:50 +00:00
if ( this - > field = = NGWW_CLIENT ) this - > HandleEditBox ( NGWW_CLIENT ) ;
2008-05-11 12:26:20 +00:00
}
2007-11-25 15:17:16 +00:00
2008-05-11 12:26:20 +00:00
virtual void OnInvalidateData ( int data )
{
2009-01-17 16:53:32 +00:00
switch ( data ) {
/* Remove the selection */
case 1 :
this - > server = NULL ;
this - > list_pos = SLP_INVALID ;
break ;
/* Reiterate the whole server list as we downloaded some files */
case 2 :
for ( NetworkGameList * * iter = this - > servers . Begin ( ) ; iter ! = this - > servers . End ( ) ; iter + + ) {
NetworkGameList * item = * iter ;
bool missing_grfs = false ;
for ( GRFConfig * c = item - > info . grfconfig ; c ! = NULL ; c = c - > next ) {
if ( c - > status ! = GCS_NOT_FOUND ) continue ;
const GRFConfig * f = FindGRFConfig ( c - > grfid , c - > md5sum ) ;
if ( f = = NULL ) {
missing_grfs = true ;
continue ;
}
c - > filename = f - > filename ;
c - > name = f - > name ;
c - > info = f - > info ;
c - > status = GCS_UNKNOWN ;
}
if ( ! missing_grfs ) item - > info . compatible = item - > info . version_compatible ;
}
break ;
2008-10-22 20:22:18 +00:00
}
2008-05-29 16:37:26 +00:00
this - > servers . ForceRebuild ( ) ;
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
}
2007-07-27 19:57:52 +00:00
2008-05-17 23:11:06 +00:00
virtual EventState OnKeyPress ( uint16 key , uint16 keycode )
2008-05-11 12:26:20 +00:00
{
2008-05-17 23:11:06 +00:00
EventState state = ES_NOT_HANDLED ;
2008-10-22 20:22:18 +00:00
/* handle up, down, pageup, pagedown, home and end */
2009-01-09 22:48:57 +00:00
if ( keycode = = WKC_UP | | keycode = = WKC_DOWN | | keycode = = WKC_PAGEUP | | keycode = = WKC_PAGEDOWN | | keycode = = WKC_HOME | | keycode = = WKC_END ) {
2008-10-22 20:22:18 +00:00
if ( this - > servers . Length ( ) = = 0 ) return ES_HANDLED ;
switch ( keycode ) {
case WKC_UP :
/* scroll up by one */
if ( this - > server = = NULL ) return ES_HANDLED ;
if ( this - > list_pos > 0 ) this - > list_pos - - ;
break ;
case WKC_DOWN :
/* scroll down by one */
if ( this - > server = = NULL ) return ES_HANDLED ;
if ( this - > list_pos < this - > servers . Length ( ) - 1 ) this - > list_pos + + ;
break ;
case WKC_PAGEUP :
/* scroll up a page */
if ( this - > server = = NULL ) return ES_HANDLED ;
2009-09-02 08:08:30 +00:00
this - > list_pos = ( this - > list_pos < this - > vscroll . GetCapacity ( ) ) ? 0 : this - > list_pos - this - > vscroll . GetCapacity ( ) ;
2008-10-22 20:22:18 +00:00
break ;
case WKC_PAGEDOWN :
/* scroll down a page */
if ( this - > server = = NULL ) return ES_HANDLED ;
2009-09-02 08:08:30 +00:00
this - > list_pos = min ( this - > list_pos + this - > vscroll . GetCapacity ( ) , ( int ) this - > servers . Length ( ) - 1 ) ;
2008-10-22 20:22:18 +00:00
break ;
case WKC_HOME :
/* jump to beginning */
this - > list_pos = 0 ;
break ;
case WKC_END :
/* jump to end */
this - > list_pos = this - > servers . Length ( ) - 1 ;
break ;
default : break ;
}
2009-01-09 22:48:57 +00:00
this - > server = this - > servers [ this - > list_pos ] ;
2008-10-22 20:22:18 +00:00
2009-01-09 22:48:57 +00:00
/* scroll to the new server if it is outside the current range */
this - > ScrollToSelectedServer ( ) ;
2008-10-22 20:22:18 +00:00
2009-01-09 22:48:57 +00:00
/* redraw window */
this - > SetDirty ( ) ;
return ES_HANDLED ;
}
2008-10-22 20:22:18 +00:00
2008-09-30 20:39:50 +00:00
if ( this - > field ! = NGWW_CLIENT ) {
2008-05-11 12:26:20 +00:00
if ( this - > server ! = NULL ) {
if ( keycode = = WKC_DELETE ) { // Press 'delete' to remove servers
NetworkGameListRemoveItem ( this - > server ) ;
this - > server = NULL ;
2008-10-22 20:22:18 +00:00
this - > list_pos = SLP_INVALID ;
2008-05-11 12:26:20 +00:00
}
2008-03-26 10:38:31 +00:00
}
2008-05-17 23:11:06 +00:00
return state ;
2008-05-11 12:26:20 +00:00
}
2007-07-27 19:57:52 +00:00
2008-10-25 19:59:11 +00:00
if ( this - > HandleEditBoxKey ( NGWW_CLIENT , key , keycode , state ) = = HEBR_CONFIRM ) return state ;
2008-05-11 12:26:20 +00:00
/* The name is only allowed when it starts with a letter! */
2008-05-29 17:01:42 +00:00
if ( ! StrEmpty ( this - > edit_str_buf ) & & this - > edit_str_buf [ 0 ] ! = ' ' ) {
2008-11-02 11:20:15 +00:00
strecpy ( _settings_client . network . client_name , this - > edit_str_buf , lastof ( _settings_client . network . client_name ) ) ;
2008-05-11 12:26:20 +00:00
} else {
2008-11-02 11:20:15 +00:00
strecpy ( _settings_client . network . client_name , " Player " , lastof ( _settings_client . network . client_name ) ) ;
2008-05-11 12:26:20 +00:00
}
2008-05-17 23:11:06 +00:00
return state ;
2004-08-09 17:04:08 +00:00
}
2008-05-11 12:26:20 +00:00
virtual void OnQueryTextFinished ( char * str )
{
2009-07-29 16:45:51 +00:00
if ( ! StrEmpty ( str ) ) NetworkAddServer ( str ) ;
2008-05-11 12:26:20 +00:00
}
2009-10-24 14:53:55 +00:00
virtual void OnResize ( )
2008-05-11 12:26:20 +00:00
{
2009-12-20 20:08:39 +00:00
this - > vscroll . SetCapacityFromWidget ( this , NGWW_MATRIX ) ;
this - > GetWidget < NWidgetCore > ( NGWW_MATRIX ) - > widget_data = ( this - > vscroll . GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
2008-05-11 12:26:20 +00:00
}
} ;
2004-08-09 17:04:08 +00:00
2008-07-18 20:44:35 +00:00
Listing NetworkGameWindow : : last_sorting = { false , 5 } ;
2009-03-15 16:04:39 +00:00
GUIGameServerList : : SortFunction * const NetworkGameWindow : : sorter_funcs [ ] = {
2008-05-29 16:37:26 +00:00
& NGameNameSorter ,
& NGameClientSorter ,
2008-07-18 20:44:35 +00:00
& NGameMapSizeSorter ,
& NGameDateSorter ,
& NGameYearsSorter ,
2008-05-29 16:37:26 +00:00
& NGameAllowedSorter
} ;
2009-10-30 20:42:42 +00:00
static NWidgetBase * MakeResizableHeader ( int * biggest_index )
{
* biggest_index = max < int > ( * biggest_index , NGWW_INFO ) ;
return new NWidgetServerListHeader ( ) ;
}
2004-08-09 17:04:08 +00:00
2009-09-20 23:11:01 +00:00
static const NWidgetPart _nested_network_game_widgets [ ] = {
2009-03-22 21:16:57 +00:00
/* TOP */
NWidget ( NWID_HORIZONTAL ) ,
2009-11-24 18:05:55 +00:00
NWidget ( WWT_CLOSEBOX , COLOUR_LIGHT_BLUE ) ,
2009-12-21 16:28:50 +00:00
NWidget ( WWT_CAPTION , COLOUR_LIGHT_BLUE ) , SetDataTip ( STR_NETWORK_SERVER_LIST_CAPTION , STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS ) ,
2009-03-22 21:16:57 +00:00
EndContainer ( ) ,
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NGWW_MAIN ) ,
2009-10-30 20:42:42 +00:00
NWidget ( NWID_VERTICAL ) , SetPIP ( 10 , 7 , 0 ) ,
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 10 , 7 , 10 ) ,
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NGWW_CONNECTION ) , SetDataTip ( STR_NETWORK_SERVER_LIST_CONNECTION , STR_NULL ) ,
NWidget ( WWT_DROPDOWN , COLOUR_LIGHT_BLUE , NGWW_CONN_BTN ) ,
2009-11-14 15:37:33 +00:00
SetDataTip ( STR_BLACK_STRING , STR_NETWORK_SERVER_LIST_CONNECTION_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetFill ( 1 , 0 ) , SetResize ( 1 , 0 ) ,
2009-10-30 20:42:42 +00:00
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NGWW_CLIENT_LABEL ) , SetDataTip ( STR_NETWORK_SERVER_LIST_PLAYER_NAME , STR_NULL ) ,
2009-03-22 21:16:57 +00:00
NWidget ( WWT_EDITBOX , COLOUR_LIGHT_BLUE , NGWW_CLIENT ) , SetMinimalSize ( 151 , 12 ) ,
2009-10-30 20:42:42 +00:00
SetDataTip ( STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE , STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP ) ,
2009-03-22 21:16:57 +00:00
EndContainer ( ) ,
2009-10-30 20:42:42 +00:00
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 10 , 7 , 10 ) ,
/* LEFT SIDE */
NWidget ( NWID_VERTICAL ) ,
NWidget ( NWID_HORIZONTAL ) ,
NWidget ( NWID_VERTICAL ) ,
NWidgetFunction ( MakeResizableHeader ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_MATRIX , COLOUR_LIGHT_BLUE , NGWW_MATRIX ) , SetResize ( 1 , 1 ) , SetFill ( 1 , 0 ) ,
2009-10-30 20:42:42 +00:00
SetDataTip ( 0 , STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT ) ,
EndContainer ( ) ,
2009-11-22 11:24:30 +00:00
NWidget ( WWT_SCROLLBAR , COLOUR_LIGHT_BLUE , NGWW_SCROLLBAR ) ,
2009-10-30 20:42:42 +00:00
EndContainer ( ) ,
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 7 ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 1 ) ,
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NGWW_LASTJOINED_LABEL ) , SetFill ( 1 , 0 ) ,
2009-10-30 20:42:42 +00:00
SetDataTip ( STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER , STR_NULL ) , SetResize ( 1 , 0 ) ,
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 0 , 0 , WD_VSCROLLBAR_WIDTH ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NGWW_LASTJOINED ) , SetFill ( 1 , 0 ) , SetResize ( 1 , 0 ) ,
2009-10-30 20:42:42 +00:00
SetDataTip ( 0x0 , STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST ) ,
EndContainer ( ) ,
EndContainer ( ) ,
2009-03-22 21:16:57 +00:00
EndContainer ( ) ,
2009-10-30 20:42:42 +00:00
/* RIGHT SIDE */
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NGWW_DETAILS ) ,
NWidget ( NWID_VERTICAL , NC_EQUALSIZE ) , SetPIP ( 5 , 5 , 5 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_EMPTY , INVALID_COLOUR , NGWW_DETAILS_SPACER ) , SetMinimalSize ( 140 , 155 ) , SetResize ( 0 , 1 ) , SetFill ( 1 , 1 ) , // Make sure it's at least this wide
2009-10-30 20:42:42 +00:00
NWidget ( NWID_HORIZONTAL , NC_EQUALSIZE ) , SetPIP ( 5 , 5 , 5 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetFill ( 1 , 0 ) ,
2009-10-30 20:42:42 +00:00
NWidget ( NWID_SELECTION , INVALID_COLOUR , NGWW_NEWGRF_SEL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_NEWGRF ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_INTRO_NEWGRF_SETTINGS , STR_NULL ) ,
NWidget ( NWID_SPACER ) , SetFill ( 1 , 0 ) ,
2009-10-30 20:42:42 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
NWidget ( NWID_HORIZONTAL , NC_EQUALSIZE ) , SetPIP ( 5 , 5 , 5 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_JOIN ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_JOIN_GAME , STR_NULL ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_REFRESH ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_REFRESH , STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP ) ,
2009-10-30 20:42:42 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
2009-03-22 21:16:57 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
2009-10-30 20:42:42 +00:00
/* BOTTOM */
NWidget ( NWID_HORIZONTAL ) ,
NWidget ( NWID_VERTICAL ) ,
NWidget ( NWID_HORIZONTAL , NC_EQUALSIZE ) , SetPIP ( 10 , 7 , 4 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_FIND ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_FIND_SERVER , STR_NETWORK_SERVER_LIST_FIND_SERVER_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_ADD ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_ADD_SERVER , STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_START ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_START_SERVER , STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NGWW_CANCEL ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_BUTTON_CANCEL , STR_NULL ) ,
2009-10-30 20:42:42 +00:00
EndContainer ( ) ,
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 6 ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) ,
2009-03-22 21:16:57 +00:00
EndContainer ( ) ,
2009-10-30 20:42:42 +00:00
NWidget ( NWID_VERTICAL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetFill ( 0 , 1 ) ,
2009-11-24 18:05:55 +00:00
NWidget ( WWT_RESIZEBOX , COLOUR_LIGHT_BLUE ) ,
2009-03-22 21:16:57 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
EndContainer ( ) ,
EndContainer ( ) ,
} ;
2009-03-15 15:12:06 +00:00
static const WindowDesc _network_game_window_desc (
2009-11-28 14:42:35 +00:00
WDP_CENTER , 1000 , 730 ,
2007-02-01 15:49:12 +00:00
WC_NETWORK_WINDOW , WC_NONE ,
2009-11-24 17:28:29 +00:00
WDF_UNCLICK_BUTTONS ,
2009-11-15 10:26:01 +00:00
_nested_network_game_widgets , lengthof ( _nested_network_game_widgets )
2009-03-15 15:12:06 +00:00
) ;
2004-08-09 17:04:08 +00:00
2007-03-07 11:47:46 +00:00
void ShowNetworkGameWindow ( )
2004-08-09 17:04:08 +00:00
{
2006-01-29 20:24:18 +00:00
static bool first = true ;
2004-08-09 17:04:08 +00:00
DeleteWindowById ( WC_NETWORK_WINDOW , 0 ) ;
2004-08-22 10:23:37 +00:00
2004-12-22 18:42:56 +00:00
/* Only show once */
2006-01-29 20:24:18 +00:00
if ( first ) {
first = false ;
2009-03-15 00:32:18 +00:00
/* add all servers from the config file to our list */
2009-04-03 12:49:58 +00:00
for ( char * * iter = _network_host_list . Begin ( ) ; iter ! = _network_host_list . End ( ) ; iter + + ) {
NetworkAddServer ( * iter ) ;
2009-10-04 20:51:50 +00:00
}
2004-12-22 18:42:56 +00:00
}
2008-05-11 12:26:20 +00:00
new NetworkGameWindow ( & _network_game_window_desc ) ;
2004-12-04 17:54:56 +00:00
}
2007-11-24 18:09:02 +00:00
/** Enum for NetworkStartServerWindow, referring to _network_start_server_window_widgets */
enum NetworkStartServerWidgets {
2009-05-05 20:36:16 +00:00
NSSW_BACKGROUND ,
NSSW_GAMENAME_LABEL ,
NSSW_GAMENAME , ///< Background for editbox to set game name
NSSW_SETPWD , ///< 'Set password' button
NSSW_SELECT_MAP_LABEL ,
NSSW_SELMAP , ///< 'Select map' list
NSSW_SCROLLBAR ,
NSSW_CONNTYPE_LABEL ,
NSSW_CONNTYPE_BTN , ///< 'Connection type' droplist button
NSSW_CLIENTS_LABEL ,
NSSW_CLIENTS_BTND , ///< 'Max clients' downarrow
NSSW_CLIENTS_TXT , ///< 'Max clients' text
NSSW_CLIENTS_BTNU , ///< 'Max clients' uparrow
NSSW_COMPANIES_LABEL ,
NSSW_COMPANIES_BTND , ///< 'Max companies' downarrow
NSSW_COMPANIES_TXT , ///< 'Max companies' text
NSSW_COMPANIES_BTNU , ///< 'Max companies' uparrow
NSSW_SPECTATORS_LABEL ,
NSSW_SPECTATORS_BTND , ///< 'Max spectators' downarrow
NSSW_SPECTATORS_TXT , ///< 'Max spectators' text
NSSW_SPECTATORS_BTNU , ///< 'Max spectators' uparrow
NSSW_LANGUAGE_LABEL ,
NSSW_LANGUAGE_BTN , ///< 'Language spoken' droplist button
NSSW_START , ///< 'Start' button
NSSW_LOAD , ///< 'Load' button
NSSW_CANCEL , ///< 'Cancel' button
2007-11-24 18:09:02 +00:00
} ;
2008-05-11 12:26:20 +00:00
struct NetworkStartServerWindow : public QueryStringBaseWindow {
byte field ; ///< Selected text-field
FiosItem * map ; ///< Selected map
byte widget_id ; ///< The widget that has the pop-up input menu
2006-01-26 16:19:24 +00:00
2009-10-27 14:39:37 +00:00
NetworkStartServerWindow ( const WindowDesc * desc ) : QueryStringBaseWindow ( NETWORK_NAME_LENGTH )
2008-05-11 12:26:20 +00:00
{
2009-10-27 14:39:37 +00:00
this - > InitNested ( desc , 0 ) ;
2008-08-11 22:08:56 +00:00
ttd_strlcpy ( this - > edit_str_buf , _settings_client . network . server_name , this - > edit_str_size ) ;
2005-11-14 19:48:04 +00:00
2008-05-11 12:26:20 +00:00
_saveload_mode = SLD_NEW_GAME ;
BuildFileList ( ) ;
2009-10-27 14:39:37 +00:00
this - > vscroll . SetCapacity ( 14 ) ;
2009-09-02 08:08:30 +00:00
this - > vscroll . SetCount ( _fios_items . Length ( ) + 1 ) ;
2005-07-17 16:01:26 +00:00
2008-05-11 12:26:20 +00:00
this - > afilter = CS_ALPHANUMERAL ;
2008-08-11 22:08:56 +00:00
InitializeTextBuffer ( & this - > text , this - > edit_str_buf , this - > edit_str_size , 160 ) ;
2009-02-09 01:22:29 +00:00
this - > SetFocusedWidget ( NSSW_GAMENAME ) ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
this - > field = NSSW_GAMENAME ;
2009-10-27 14:39:37 +00:00
}
2008-03-26 10:38:31 +00:00
2009-10-27 14:39:37 +00:00
virtual void SetStringParameters ( int widget ) const
{
switch ( widget ) {
case NSSW_CONNTYPE_BTN :
2009-10-27 14:46:59 +00:00
SetDParam ( 0 , _connection_types_dropdown [ _settings_client . network . server_advertise ] ) ;
2009-10-27 14:39:37 +00:00
break ;
case NSSW_CLIENTS_TXT :
2009-10-27 14:46:59 +00:00
SetDParam ( 0 , _settings_client . network . max_clients ) ;
2009-10-27 14:39:37 +00:00
break ;
case NSSW_COMPANIES_TXT :
2009-10-27 14:46:59 +00:00
SetDParam ( 0 , _settings_client . network . max_companies ) ;
2009-10-27 14:39:37 +00:00
break ;
case NSSW_SPECTATORS_TXT :
2009-10-27 14:46:59 +00:00
SetDParam ( 0 , _settings_client . network . max_spectators ) ;
2009-10-27 14:39:37 +00:00
break ;
case NSSW_LANGUAGE_BTN :
2009-10-27 14:46:59 +00:00
SetDParam ( 0 , STR_NETWORK_LANG_ANY + _settings_client . network . server_lang ) ;
2009-10-27 14:39:37 +00:00
break ;
}
2008-05-11 12:26:20 +00:00
}
2008-03-26 10:38:31 +00:00
2009-11-22 18:28:14 +00:00
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
2008-05-11 12:26:20 +00:00
{
2009-10-27 14:39:37 +00:00
switch ( widget ) {
case NSSW_CONNTYPE_BTN :
* size = maxdim ( GetStringBoundingBox ( _connection_types_dropdown [ 0 ] ) , GetStringBoundingBox ( _connection_types_dropdown [ 1 ] ) ) ;
size - > width + = padding . width ;
size - > height + = padding . height ;
break ;
2008-05-11 12:26:20 +00:00
2009-10-27 14:39:37 +00:00
case NSSW_SELMAP :
resize - > height = FONT_HEIGHT_NORMAL ;
size - > height = 14 * resize - > height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM ;
break ;
}
}
virtual void DrawWidget ( const Rect & r , int widget ) const
{
switch ( widget ) {
case NSSW_SELMAP :
this - > DrawMapSelection ( r ) ;
break ;
case NSSW_SETPWD :
/* if password is set, draw red '*' next to 'Set password' button */
if ( ! StrEmpty ( _settings_client . network . server_password ) ) DrawString ( r . right + WD_FRAMERECT_LEFT , this - > width - WD_FRAMERECT_RIGHT , r . top , " * " , TC_RED ) ;
}
}
virtual void OnPaint ( )
{
2008-05-11 12:26:20 +00:00
/* draw basic widgets */
2008-05-17 12:48:06 +00:00
this - > DrawWidgets ( ) ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
/* editbox to set game name */
this - > DrawEditBox ( NSSW_GAMENAME ) ;
2009-10-27 14:39:37 +00:00
}
2008-05-11 12:26:20 +00:00
2009-10-27 14:39:37 +00:00
void DrawMapSelection ( const Rect & r ) const
{
int y = r . top + WD_FRAMERECT_TOP ;
2008-05-11 12:26:20 +00:00
/* draw list of maps */
2009-10-27 14:39:37 +00:00
GfxFillRect ( r . left + 1 , r . top + 1 , r . right - 1 , r . bottom - 1 , 0xD7 ) ; // black background of maps list
2008-03-26 10:38:31 +00:00
2009-09-02 08:08:30 +00:00
for ( uint pos = this - > vscroll . GetPosition ( ) ; pos < _fios_items . Length ( ) + 1 ; pos + + ) {
2009-12-27 13:38:08 +00:00
const FiosItem * item = ( pos = = 0 ) ? NULL : _fios_items . Get ( pos - 1 ) ;
if ( item = = this - > map ) { // this->map == NULL for first item
2009-10-27 14:39:37 +00:00
GfxFillRect ( r . left + 1 , y , r . right - 1 , y + FONT_HEIGHT_NORMAL - 1 , 155 ) ; // show highlighted item with a different colour
2009-03-22 23:38:29 +00:00
}
2008-05-11 12:26:20 +00:00
if ( pos = = 0 ) {
2009-10-27 14:39:37 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_START_SERVER_SERVER_RANDOM_GAME , TC_DARK_GREEN ) ;
2008-05-11 12:26:20 +00:00
} else {
2009-10-27 14:39:37 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , item - > title , _fios_colours [ item - > type ] ) ;
2007-08-14 10:46:38 +00:00
}
2009-10-27 14:39:37 +00:00
y + = FONT_HEIGHT_NORMAL ;
2008-03-26 10:38:31 +00:00
2009-10-27 14:39:37 +00:00
if ( y > = this - > vscroll . GetCapacity ( ) * FONT_HEIGHT_NORMAL + r . top ) break ;
2008-05-11 12:26:20 +00:00
}
}
2005-07-17 16:01:26 +00:00
2010-01-30 18:34:48 +00:00
virtual void OnClick ( Point pt , int widget , int click_count )
2008-05-11 12:26:20 +00:00
{
this - > field = widget ;
switch ( widget ) {
case NSSW_CANCEL : // Cancel button
ShowNetworkGameWindow ( ) ;
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_SETPWD : // Set password button
this - > widget_id = NSSW_SETPWD ;
2008-07-17 13:47:04 +00:00
SetDParamStr ( 0 , _settings_client . network . server_password ) ;
2009-08-05 17:59:21 +00:00
ShowQueryString ( STR_JUST_RAW_STRING , STR_NETWORK_START_SERVER_SET_PASSWORD , 20 , 250 , this , CS_ALPHANUMERAL , QSF_NONE ) ;
2008-05-11 12:26:20 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_SELMAP : { // Select map
2009-11-22 13:22:53 +00:00
int y = ( pt . y - this - > GetWidget < NWidgetBase > ( NSSW_SELMAP ) - > pos_y - WD_FRAMERECT_TOP ) / FONT_HEIGHT_NORMAL ;
2008-03-26 10:38:31 +00:00
2009-09-02 08:08:30 +00:00
y + = this - > vscroll . GetPosition ( ) ;
if ( y > = this - > vscroll . GetCount ( ) ) return ;
2008-03-26 10:38:31 +00:00
2008-06-02 14:19:27 +00:00
this - > map = ( y = = 0 ) ? NULL : _fios_items . Get ( y - 1 ) ;
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
} break ;
case NSSW_CONNTYPE_BTN : // Connection type
2008-06-09 12:17:01 +00:00
ShowDropDownMenu ( this , _connection_types_dropdown , _settings_client . network . server_advertise , NSSW_CONNTYPE_BTN , 0 , 0 ) ; // do it for widget NSSW_CONNTYPE_BTN
2008-05-11 12:26:20 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_CLIENTS_BTND : case NSSW_CLIENTS_BTNU : // Click on up/down button for number of clients
case NSSW_COMPANIES_BTND : case NSSW_COMPANIES_BTNU : // Click on up/down button for number of companies
case NSSW_SPECTATORS_BTND : case NSSW_SPECTATORS_BTNU : // Click on up/down button for number of spectators
/* Don't allow too fast scrolling */
2008-09-23 15:24:15 +00:00
if ( ( this - > flags4 & WF_TIMEOUT_MASK ) < = WF_TIMEOUT_TRIGGER ) {
2008-05-11 12:26:20 +00:00
this - > HandleButtonClick ( widget ) ;
this - > SetDirty ( ) ;
switch ( widget ) {
default : NOT_REACHED ( ) ;
case NSSW_CLIENTS_BTND : case NSSW_CLIENTS_BTNU :
2008-06-03 08:04:35 +00:00
_settings_client . network . max_clients = Clamp ( _settings_client . network . max_clients + widget - NSSW_CLIENTS_TXT , 2 , MAX_CLIENTS ) ;
2008-05-11 12:26:20 +00:00
break ;
case NSSW_COMPANIES_BTND : case NSSW_COMPANIES_BTNU :
2008-09-30 20:39:50 +00:00
_settings_client . network . max_companies = Clamp ( _settings_client . network . max_companies + widget - NSSW_COMPANIES_TXT , 1 , MAX_COMPANIES ) ;
2008-05-11 12:26:20 +00:00
break ;
case NSSW_SPECTATORS_BTND : case NSSW_SPECTATORS_BTNU :
2008-06-03 08:04:35 +00:00
_settings_client . network . max_spectators = Clamp ( _settings_client . network . max_spectators + widget - NSSW_SPECTATORS_TXT , 0 , MAX_CLIENTS ) ;
2008-05-11 12:26:20 +00:00
break ;
2008-03-26 10:38:31 +00:00
}
2008-05-11 12:26:20 +00:00
}
_left_button_clicked = false ;
break ;
2008-03-26 10:38:31 +00:00
2008-09-30 20:39:50 +00:00
case NSSW_CLIENTS_TXT : // Click on number of clients
2008-05-11 12:26:20 +00:00
this - > widget_id = NSSW_CLIENTS_TXT ;
2008-06-03 08:04:35 +00:00
SetDParam ( 0 , _settings_client . network . max_clients ) ;
2009-08-05 17:59:21 +00:00
ShowQueryString ( STR_JUST_INT , STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS , 4 , 50 , this , CS_NUMERAL , QSF_NONE ) ;
2008-05-11 12:26:20 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_COMPANIES_TXT : // Click on number of companies
this - > widget_id = NSSW_COMPANIES_TXT ;
2008-06-03 08:04:35 +00:00
SetDParam ( 0 , _settings_client . network . max_companies ) ;
2009-08-05 17:59:21 +00:00
ShowQueryString ( STR_JUST_INT , STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES , 3 , 50 , this , CS_NUMERAL , QSF_NONE ) ;
2008-05-11 12:26:20 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_SPECTATORS_TXT : // Click on number of spectators
this - > widget_id = NSSW_SPECTATORS_TXT ;
2008-06-03 08:04:35 +00:00
SetDParam ( 0 , _settings_client . network . max_spectators ) ;
2009-08-05 17:59:21 +00:00
ShowQueryString ( STR_JUST_INT , STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS , 4 , 50 , this , CS_NUMERAL , QSF_NONE ) ;
2008-05-11 12:26:20 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_LANGUAGE_BTN : { // Language
uint sel = 0 ;
for ( uint i = 0 ; i < lengthof ( _language_dropdown ) - 1 ; i + + ) {
2008-06-03 08:04:35 +00:00
if ( _language_dropdown [ i ] = = STR_NETWORK_LANG_ANY + _settings_client . network . server_lang ) {
2008-05-11 12:26:20 +00:00
sel = i ;
break ;
2008-03-26 10:38:31 +00:00
}
2008-05-11 12:26:20 +00:00
}
ShowDropDownMenu ( this , _language_dropdown , sel , NSSW_LANGUAGE_BTN , 0 , 0 ) ;
} break ;
case NSSW_START : // Start game
_is_network_server = true ;
if ( this - > map = = NULL ) { // start random new game
ShowGenerateLandscape ( ) ;
} else { // load a scenario
2009-03-04 00:13:52 +00:00
const char * name = FiosBrowseTo ( this - > map ) ;
2008-05-11 12:26:20 +00:00
if ( name ! = NULL ) {
SetFiosType ( this - > map - > type ) ;
_file_to_saveload . filetype = FT_SCENARIO ;
2008-11-02 11:20:15 +00:00
strecpy ( _file_to_saveload . name , name , lastof ( _file_to_saveload . name ) ) ;
strecpy ( _file_to_saveload . title , this - > map - > title , lastof ( _file_to_saveload . title ) ) ;
2008-05-11 12:26:20 +00:00
delete this ;
2009-02-25 00:45:52 +00:00
SwitchToMode ( SM_START_SCENARIO ) ;
2008-03-26 10:38:31 +00:00
}
2008-05-11 12:26:20 +00:00
}
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 12:26:20 +00:00
case NSSW_LOAD : // Load game
_is_network_server = true ;
/* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets
2009-03-14 18:16:29 +00:00
* copied all the elements of ' load game ' and upon closing that , it segfaults */
2008-05-11 12:26:20 +00:00
delete this ;
ShowSaveLoadDialog ( SLD_LOAD_GAME ) ;
break ;
}
}
2004-09-06 22:46:02 +00:00
2008-05-11 12:26:20 +00:00
virtual void OnDropdownSelect ( int widget , int index )
{
switch ( widget ) {
case NSSW_CONNTYPE_BTN :
2008-06-09 12:17:01 +00:00
_settings_client . network . server_advertise = ( index ! = 0 ) ;
2008-05-11 12:26:20 +00:00
break ;
case NSSW_LANGUAGE_BTN :
2008-06-03 08:04:35 +00:00
_settings_client . network . server_lang = _language_dropdown [ index ] - STR_NETWORK_LANG_ANY ;
2008-05-11 12:26:20 +00:00
break ;
default :
NOT_REACHED ( ) ;
}
2004-09-06 22:46:02 +00:00
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
}
2004-09-06 22:46:02 +00:00
2008-05-11 12:26:20 +00:00
virtual void OnMouseLoop ( )
{
if ( this - > field = = NSSW_GAMENAME ) this - > HandleEditBox ( NSSW_GAMENAME ) ;
}
2004-08-09 17:04:08 +00:00
2008-05-17 23:11:06 +00:00
virtual EventState OnKeyPress ( uint16 key , uint16 keycode )
2008-05-11 12:26:20 +00:00
{
2008-05-17 23:11:06 +00:00
EventState state = ES_NOT_HANDLED ;
2008-05-11 12:26:20 +00:00
if ( this - > field = = NSSW_GAMENAME ) {
2008-10-25 19:59:11 +00:00
if ( this - > HandleEditBoxKey ( NSSW_GAMENAME , key , keycode , state ) = = HEBR_CONFIRM ) return state ;
2006-01-26 16:19:24 +00:00
2008-11-02 11:20:15 +00:00
strecpy ( _settings_client . network . server_name , this - > text . buf , lastof ( _settings_client . network . server_name ) ) ;
2008-05-11 12:26:20 +00:00
}
2004-09-10 19:02:27 +00:00
2008-05-17 23:11:06 +00:00
return state ;
2008-05-11 12:26:20 +00:00
}
2007-08-14 10:46:38 +00:00
2009-11-22 13:20:26 +00:00
virtual void OnTimeout ( )
{
static const int raise_widgets [ ] = { NSSW_CLIENTS_BTND , NSSW_CLIENTS_BTNU , NSSW_COMPANIES_BTND , NSSW_COMPANIES_BTNU , NSSW_SPECTATORS_BTND , NSSW_SPECTATORS_BTNU , WIDGET_LIST_END } ;
for ( const int * widget = raise_widgets ; * widget ! = WIDGET_LIST_END ; widget + + ) {
if ( this - > IsWidgetLowered ( * widget ) ) {
this - > RaiseWidget ( * widget ) ;
this - > SetWidgetDirty ( * widget ) ;
}
}
}
2008-05-11 12:26:20 +00:00
virtual void OnQueryTextFinished ( char * str )
{
if ( str = = NULL ) return ;
if ( this - > widget_id = = NSSW_SETPWD ) {
2008-11-02 11:20:15 +00:00
strecpy ( _settings_client . network . server_password , str , lastof ( _settings_client . network . server_password ) ) ;
2008-05-11 12:26:20 +00:00
} else {
int32 value = atoi ( str ) ;
2009-09-13 19:15:59 +00:00
this - > SetWidgetDirty ( this - > widget_id ) ;
2008-05-11 12:26:20 +00:00
switch ( this - > widget_id ) {
default : NOT_REACHED ( ) ;
2008-06-03 08:04:35 +00:00
case NSSW_CLIENTS_TXT : _settings_client . network . max_clients = Clamp ( value , 2 , MAX_CLIENTS ) ; break ;
2008-09-30 20:39:50 +00:00
case NSSW_COMPANIES_TXT : _settings_client . network . max_companies = Clamp ( value , 1 , MAX_COMPANIES ) ; break ;
2008-06-03 08:04:35 +00:00
case NSSW_SPECTATORS_TXT : _settings_client . network . max_spectators = Clamp ( value , 0 , MAX_CLIENTS ) ; break ;
2007-08-14 10:46:38 +00:00
}
2008-05-11 12:26:20 +00:00
}
2007-08-14 10:46:38 +00:00
2008-05-11 12:26:20 +00:00
this - > SetDirty ( ) ;
2004-08-09 17:04:08 +00:00
}
2008-05-11 12:26:20 +00:00
} ;
2004-08-09 17:04:08 +00:00
2009-05-05 20:40:08 +00:00
static const NWidgetPart _nested_network_start_server_window_widgets [ ] = {
NWidget ( NWID_HORIZONTAL ) ,
2009-11-24 18:05:55 +00:00
NWidget ( WWT_CLOSEBOX , COLOUR_LIGHT_BLUE ) ,
2009-12-21 16:28:50 +00:00
NWidget ( WWT_CAPTION , COLOUR_LIGHT_BLUE ) , SetDataTip ( STR_NETWORK_START_SERVER_CAPTION , STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NSSW_BACKGROUND ) ,
2009-10-27 14:39:37 +00:00
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 10 , 8 , 10 ) ,
NWidget ( NWID_VERTICAL ) , SetPIP ( 10 , 0 , 10 ) ,
/* Game name widgets */
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 0 , 2 , 0 ) ,
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_GAMENAME_LABEL ) , SetDataTip ( STR_NETWORK_START_SERVER_NEW_GAME_NAME , STR_NULL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_EDITBOX , COLOUR_LIGHT_BLUE , NSSW_GAMENAME ) , SetMinimalSize ( 10 , 12 ) , SetFill ( 1 , 0 ) ,
2009-10-27 14:39:37 +00:00
SetDataTip ( STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE , STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP ) ,
EndContainer ( ) ,
2009-05-05 20:40:08 +00:00
/* List of playable scenarios. */
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 8 ) , SetFill ( 1 , 0 ) ,
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_SELECT_MAP_LABEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_SELECT_MAP , STR_NULL ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 6 ) , SetFill ( 1 , 0 ) ,
2009-10-27 14:39:37 +00:00
NWidget ( NWID_HORIZONTAL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NSSW_SELMAP ) , SetMinimalSize ( 250 , 0 ) , SetFill ( 1 , 1 ) , SetDataTip ( STR_NULL , STR_NETWORK_START_SERVER_SELECT_MAP_TOOLTIP ) , EndContainer ( ) ,
2009-10-27 14:39:37 +00:00
NWidget ( WWT_SCROLLBAR , COLOUR_LIGHT_BLUE , NSSW_SCROLLBAR ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
2009-10-27 14:39:37 +00:00
NWidget ( NWID_VERTICAL ) , SetPIP ( 10 , 0 , 10 ) ,
/* Password widgets. */
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NSSW_SETPWD ) , SetFill ( 1 , 0 ) ,
2009-10-27 14:39:37 +00:00
SetDataTip ( STR_NETWORK_START_SERVER_SET_PASSWORD , STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
/* Combo/selection boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetFill ( 1 , 1 ) ,
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_CONNTYPE_LABEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_CONNECTION , STR_NULL ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 1 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_DROPDOWN , COLOUR_LIGHT_BLUE , NSSW_CONNTYPE_BTN ) , SetFill ( 1 , 0 ) ,
2009-11-14 15:37:33 +00:00
SetDataTip ( STR_BLACK_STRING , STR_NETWORK_SERVER_LIST_CONNECTION_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 6 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_CLIENTS_LABEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS , STR_NULL ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 1 ) ,
NWidget ( NWID_HORIZONTAL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_IMGBTN , COLOUR_LIGHT_BLUE , NSSW_CLIENTS_BTND ) , SetMinimalSize ( 12 , 12 ) , SetFill ( 0 , 1 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( SPR_ARROW_DOWN , STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_LIGHT_BLUE , NSSW_CLIENTS_TXT ) , SetFill ( 1 , 0 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( STR_NETWORK_START_SERVER_CLIENTS_SELECT , STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_IMGBTN , COLOUR_LIGHT_BLUE , NSSW_CLIENTS_BTNU ) , SetMinimalSize ( 12 , 12 ) , SetFill ( 0 , 1 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( SPR_ARROW_UP , STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 6 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_COMPANIES_LABEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES , STR_NULL ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 1 ) ,
NWidget ( NWID_HORIZONTAL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_IMGBTN , COLOUR_LIGHT_BLUE , NSSW_COMPANIES_BTND ) , SetMinimalSize ( 12 , 12 ) , SetFill ( 0 , 1 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( SPR_ARROW_DOWN , STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_LIGHT_BLUE , NSSW_COMPANIES_TXT ) , SetFill ( 1 , 0 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( STR_NETWORK_START_SERVER_COMPANIES_SELECT , STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_IMGBTN , COLOUR_LIGHT_BLUE , NSSW_COMPANIES_BTNU ) , SetMinimalSize ( 12 , 12 ) , SetFill ( 0 , 1 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( SPR_ARROW_UP , STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 6 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_SPECTATORS_LABEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS , STR_NULL ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 1 ) ,
NWidget ( NWID_HORIZONTAL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_IMGBTN , COLOUR_LIGHT_BLUE , NSSW_SPECTATORS_BTND ) , SetMinimalSize ( 12 , 12 ) , SetFill ( 0 , 1 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( SPR_ARROW_DOWN , STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_LIGHT_BLUE , NSSW_SPECTATORS_TXT ) , SetFill ( 1 , 0 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( STR_NETWORK_START_SERVER_SPECTATORS_SELECT , STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_IMGBTN , COLOUR_LIGHT_BLUE , NSSW_SPECTATORS_BTNU ) , SetMinimalSize ( 12 , 12 ) , SetFill ( 0 , 1 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( SPR_ARROW_UP , STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 6 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NSSW_LANGUAGE_LABEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN , STR_NULL ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 1 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_DROPDOWN , COLOUR_LIGHT_BLUE , NSSW_LANGUAGE_BTN ) , SetFill ( 1 , 0 ) ,
2009-11-14 15:37:33 +00:00
SetDataTip ( STR_BLACK_STRING , STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
/* Buttons Start / Load / Cancel. */
2009-10-27 14:39:37 +00:00
NWidget ( NWID_HORIZONTAL , NC_EQUALSIZE ) , SetPIP ( 10 , 5 , 10 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NSSW_START ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_START_GAME , STR_NETWORK_START_SERVER_START_GAME_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NSSW_LOAD ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_START_SERVER_LOAD_GAME , STR_NETWORK_START_SERVER_LOAD_GAME_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NSSW_CANCEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_BUTTON_CANCEL , STR_NULL ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
2009-10-27 14:39:37 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 10 ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
} ;
2009-03-15 15:12:06 +00:00
static const WindowDesc _network_start_server_window_desc (
2009-11-28 15:01:49 +00:00
WDP_CENTER , 0 , 0 ,
2007-02-01 15:49:12 +00:00
WC_NETWORK_WINDOW , WC_NONE ,
2009-11-24 17:28:29 +00:00
WDF_UNCLICK_BUTTONS ,
2009-11-15 10:26:01 +00:00
_nested_network_start_server_window_widgets , lengthof ( _nested_network_start_server_window_widgets )
2009-03-15 15:12:06 +00:00
) ;
2004-08-09 17:04:08 +00:00
2007-03-07 11:47:46 +00:00
static void ShowNetworkStartServerWindow ( )
2004-08-09 17:04:08 +00:00
{
DeleteWindowById ( WC_NETWORK_WINDOW , 0 ) ;
2004-09-10 19:02:27 +00:00
2008-05-11 12:26:20 +00:00
new NetworkStartServerWindow ( & _network_start_server_window_desc ) ;
2004-08-09 17:04:08 +00:00
}
2007-11-25 11:36:45 +00:00
/** Enum for NetworkLobbyWindow, referring to _network_lobby_window_widgets */
enum NetworkLobbyWindowWidgets {
2009-05-05 20:36:16 +00:00
NLWW_BACKGROUND , ///< Background panel
NLWW_TEXT , ///< Heading text
NLWW_HEADER , ///< Header above list of companies
NLWW_MATRIX , ///< List of companies
NLWW_SCROLLBAR , ///< Scroll bar
NLWW_DETAILS , ///< Company details
NLWW_JOIN , ///< 'Join company' button
NLWW_NEW , ///< 'New company' button
NLWW_SPECTATE , ///< 'Spectate game' button
NLWW_REFRESH , ///< 'Refresh server' button
NLWW_CANCEL , ///< 'Cancel' button
2007-11-25 11:36:45 +00:00
} ;
2008-05-11 07:22:13 +00:00
struct NetworkLobbyWindow : public Window {
2008-09-30 20:39:50 +00:00
CompanyID company ; ///< Select company
2008-05-11 07:22:13 +00:00
NetworkGameList * server ; ///< Selected server
2008-12-22 18:40:57 +00:00
NetworkCompanyInfo company_info [ MAX_COMPANIES ] ;
2004-08-09 17:04:08 +00:00
2008-05-11 07:22:13 +00:00
NetworkLobbyWindow ( const WindowDesc * desc , NetworkGameList * ngl ) :
2009-10-27 12:43:08 +00:00
Window ( ) , company ( INVALID_COMPANY ) , server ( ngl )
2008-05-11 07:22:13 +00:00
{
2009-10-27 12:43:08 +00:00
this - > InitNested ( desc , 0 ) ;
this - > OnResize ( ) ;
2008-05-11 07:22:13 +00:00
}
2008-03-26 10:38:31 +00:00
2009-10-27 12:43:08 +00:00
CompanyID NetworkLobbyFindCompanyIndex ( byte pos ) const
2008-12-22 18:40:57 +00:00
{
/* Scroll through all this->company_info and get the 'pos' item that is not empty */
for ( CompanyID i = COMPANY_FIRST ; i < MAX_COMPANIES ; i + + ) {
if ( ! StrEmpty ( this - > company_info [ i ] . company_name ) ) {
if ( pos - - = = 0 ) return i ;
}
}
return COMPANY_FIRST ;
}
2009-11-22 18:28:14 +00:00
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
2009-10-27 12:43:08 +00:00
{
switch ( widget ) {
case NLWW_HEADER :
size - > height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM ; ;
break ;
case NLWW_MATRIX :
resize - > height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM ;
size - > height = 10 * resize - > height ;
break ;
case NLWW_DETAILS :
size - > height = 30 + 11 * FONT_HEIGHT_NORMAL ;
break ;
}
}
virtual void SetStringParameters ( int widget ) const
{
switch ( widget ) {
case NLWW_TEXT :
SetDParamStr ( 0 , this - > server - > info . server_name ) ;
break ;
}
}
virtual void DrawWidget ( const Rect & r , int widget ) const
{
switch ( widget ) {
case NLWW_DETAILS :
this - > DrawDetails ( r ) ;
break ;
case NLWW_MATRIX :
this - > DrawMatrix ( r ) ;
break ;
}
}
2008-05-11 07:22:13 +00:00
virtual void OnPaint ( )
{
const NetworkGameInfo * gi = & this - > server - > info ;
2009-01-12 17:11:45 +00:00
/* Join button is disabled when no company is selected and for AI companies*/
this - > SetWidgetDisabledState ( NLWW_JOIN , this - > company = = INVALID_COMPANY | | GetLobbyCompanyInfo ( this - > company ) - > ai ) ;
2008-05-11 07:22:13 +00:00
/* 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 ) ;
2009-10-27 12:43:08 +00:00
this - > vscroll . SetCount ( gi - > companies_on ) ;
2008-05-11 07:22:13 +00:00
/* Draw window widgets */
2008-05-17 12:48:06 +00:00
this - > DrawWidgets ( ) ;
2009-10-27 12:43:08 +00:00
}
2008-05-11 07:22:13 +00:00
2009-10-27 12:43:08 +00:00
void DrawMatrix ( const Rect & r ) const
{
2009-11-18 22:00:04 +00:00
bool rtl = _dynlang . text_dir = = TD_RTL ;
uint left = r . left + WD_FRAMERECT_LEFT ;
uint right = r . right - WD_FRAMERECT_RIGHT ;
uint text_left = left + ( rtl ? 20 : 0 ) ;
uint text_right = right - ( rtl ? 0 : 20 ) ;
uint blob_left = rtl ? left : right - 10 ;
uint lock_left = rtl ? left + 10 : right - 20 ;
2009-10-27 12:43:08 +00:00
int y = r . top + WD_MATRIX_TOP ;
2008-05-11 07:22:13 +00:00
/* Draw company list */
2009-10-27 12:43:08 +00:00
int pos = this - > vscroll . GetPosition ( ) ;
while ( pos < this - > server - > info . companies_on ) {
2008-05-11 07:22:13 +00:00
byte company = NetworkLobbyFindCompanyIndex ( pos ) ;
bool income = false ;
if ( this - > company = = company ) {
2009-10-27 12:43:08 +00:00
GfxFillRect ( r . left + 1 , y - 2 , r . right - 1 , y + FONT_HEIGHT_NORMAL , 10 ) ; // show highlighted item with a different colour
2008-03-26 10:38:31 +00:00
}
2004-12-20 16:02:01 +00:00
2009-11-18 22:00:04 +00:00
DrawString ( text_left , text_right , y , this - > company_info [ company ] . company_name , TC_BLACK ) ;
if ( this - > company_info [ company ] . use_password ! = 0 ) DrawSprite ( SPR_LOCK , PAL_NONE , lock_left , y ) ;
2008-03-26 10:38:31 +00:00
2008-05-11 07:22:13 +00:00
/* If the company's income was positive puts a green dot else a red dot */
2008-12-22 18:40:57 +00:00
if ( this - > company_info [ company ] . income > = 0 ) income = true ;
2009-11-22 13:12:31 +00:00
DrawSprite ( SPR_BLOT , income ? PALETTE_TO_GREEN : PALETTE_TO_RED , blob_left , y + ( FONT_HEIGHT_NORMAL - 10 ) / 2 ) ;
2008-03-26 10:38:31 +00:00
2008-05-11 07:22:13 +00:00
pos + + ;
2009-10-27 12:03:12 +00:00
y + = this - > resize . step_height ;
2009-09-02 08:08:30 +00:00
if ( pos > = this - > vscroll . GetPosition ( ) + this - > vscroll . GetCapacity ( ) ) break ;
2008-05-11 07:22:13 +00:00
}
2009-10-27 12:03:12 +00:00
}
void DrawDetails ( const Rect & r ) const
{
const int detail_height = 12 + FONT_HEIGHT_NORMAL + 12 ;
2008-05-11 07:22:13 +00:00
/* Draw info about selected company when it is selected in the left window */
2009-10-27 12:03:12 +00:00
GfxFillRect ( r . left + 1 , r . top + 1 , r . right - 1 , r . top + detail_height - 1 , 157 ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , r . top + 12 , STR_NETWORK_GAME_LOBBY_COMPANY_INFO , TC_FROMSTRING , SA_CENTER ) ;
if ( this - > company = = INVALID_COMPANY | | StrEmpty ( this - > company_info [ this - > company ] . company_name ) ) return ;
int y = r . top + detail_height + 4 ;
const NetworkGameInfo * gi = & this - > server - > info ;
SetDParam ( 0 , gi - > clients_on ) ;
SetDParam ( 1 , gi - > clients_max ) ;
SetDParam ( 2 , gi - > companies_on ) ;
SetDParam ( 3 , gi - > companies_max ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_SERVER_LIST_CLIENTS ) ;
y + = FONT_HEIGHT_NORMAL ;
SetDParamStr ( 0 , this - > company_info [ this - > company ] . company_name ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_COMPANY_NAME ) ;
y + = FONT_HEIGHT_NORMAL ;
SetDParam ( 0 , this - > company_info [ this - > company ] . inaugurated_year ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR ) ; // inauguration year
y + = FONT_HEIGHT_NORMAL ;
SetDParam ( 0 , this - > company_info [ this - > company ] . company_value ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_VALUE ) ; // company value
y + = FONT_HEIGHT_NORMAL ;
SetDParam ( 0 , this - > company_info [ this - > company ] . money ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE ) ; // current balance
y + = FONT_HEIGHT_NORMAL ;
SetDParam ( 0 , this - > company_info [ this - > company ] . income ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME ) ; // last year's income
y + = FONT_HEIGHT_NORMAL ;
SetDParam ( 0 , this - > company_info [ this - > company ] . performance ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_PERFORMANCE ) ; // performance
y + = FONT_HEIGHT_NORMAL ;
for ( uint i = 0 ; i < lengthof ( this - > company_info [ this - > company ] . num_vehicle ) ; i + + ) {
SetDParam ( i , this - > company_info [ this - > company ] . num_vehicle [ i ] ) ;
2008-05-11 07:22:13 +00:00
}
2009-10-27 12:03:12 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_VEHICLES ) ; // vehicles
y + = FONT_HEIGHT_NORMAL ;
for ( uint i = 0 ; i < lengthof ( this - > company_info [ this - > company ] . num_station ) ; i + + ) {
SetDParam ( i , this - > company_info [ this - > company ] . num_station [ i ] ) ;
}
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_STATIONS ) ; // stations
y + = FONT_HEIGHT_NORMAL ;
SetDParamStr ( 0 , this - > company_info [ this - > company ] . clients ) ;
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , STR_NETWORK_GAME_LOBBY_PLAYERS ) ; // players
2008-05-11 07:22:13 +00:00
}
2008-03-26 10:38:31 +00:00
2010-01-30 18:34:48 +00:00
virtual void OnClick ( Point pt , int widget , int click_count )
2008-05-11 07:22:13 +00:00
{
switch ( widget ) {
case NLWW_CANCEL : // Cancel button
ShowNetworkGameWindow ( ) ;
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 07:22:13 +00:00
case NLWW_MATRIX : { // Company list
2009-11-22 13:22:53 +00:00
uint32 id_v = ( pt . y - this - > GetWidget < NWidgetBase > ( NLWW_MATRIX ) - > pos_y ) / this - > resize . step_height ;
2008-03-26 10:38:31 +00:00
2009-09-02 08:08:30 +00:00
if ( id_v > = this - > vscroll . GetCapacity ( ) ) break ;
2008-03-26 10:38:31 +00:00
2009-09-02 08:08:30 +00:00
id_v + = this - > vscroll . GetPosition ( ) ;
2008-09-30 20:39:50 +00:00
this - > company = ( id_v > = this - > server - > info . companies_on ) ? INVALID_COMPANY : NetworkLobbyFindCompanyIndex ( id_v ) ;
2008-05-11 07:22:13 +00:00
this - > SetDirty ( ) ;
2010-01-30 18:34:48 +00:00
/* FIXME the disabling should go into some InvalidateData, which is called instead of the SetDirty */
if ( ! this - > IsWidgetDisabled ( NLWW_JOIN ) ) this - > OnClick ( pt , NLWW_JOIN , 1 ) ;
2008-05-11 07:22:13 +00:00
} break ;
2008-03-26 10:38:31 +00:00
2008-05-11 07:22:13 +00:00
case NLWW_JOIN : // Join company
/* Button can be clicked only when it is enabled */
2009-05-19 21:20:14 +00:00
NetworkClientConnectGame ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) , this - > company ) ;
2008-05-11 07:22:13 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 07:22:13 +00:00
case NLWW_NEW : // New company
2009-05-19 21:20:14 +00:00
NetworkClientConnectGame ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) , COMPANY_NEW_COMPANY ) ;
2008-05-11 07:22:13 +00:00
break ;
2008-03-26 10:38:31 +00:00
2008-05-11 07:22:13 +00:00
case NLWW_SPECTATE : // Spectate game
2009-05-19 21:20:14 +00:00
NetworkClientConnectGame ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) , COMPANY_SPECTATOR ) ;
2008-05-11 07:22:13 +00:00
break ;
2006-01-26 12:56:05 +00:00
2008-05-11 07:22:13 +00:00
case NLWW_REFRESH : // Refresh
2009-01-20 01:32:06 +00:00
NetworkTCPQueryServer ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) ) ; // company info
NetworkUDPQueryServer ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) ) ; // general data
2008-12-22 18:40:57 +00:00
/* Clear the information so removed companies don't remain */
2009-02-24 22:25:23 +00:00
memset ( this - > company_info , 0 , sizeof ( this - > company_info ) ) ;
2008-05-11 07:22:13 +00:00
break ;
}
2004-08-09 17:04:08 +00:00
}
2008-08-31 20:54:01 +00:00
2009-10-27 12:43:08 +00:00
virtual void OnResize ( )
{
2009-12-20 20:08:39 +00:00
this - > vscroll . SetCapacityFromWidget ( this , NLWW_MATRIX ) ;
this - > GetWidget < NWidgetCore > ( NLWW_MATRIX ) - > widget_data = ( this - > vscroll . GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
2009-10-27 12:43:08 +00:00
}
2004-08-09 17:04:08 +00:00
} ;
2009-05-05 20:40:08 +00:00
static const NWidgetPart _nested_network_lobby_window_widgets [ ] = {
NWidget ( NWID_HORIZONTAL ) ,
2009-11-24 18:05:55 +00:00
NWidget ( WWT_CLOSEBOX , COLOUR_LIGHT_BLUE ) ,
2009-12-21 16:28:50 +00:00
NWidget ( WWT_CAPTION , COLOUR_LIGHT_BLUE ) , SetDataTip ( STR_NETWORK_GAME_LOBBY_CAPTION , STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NLWW_BACKGROUND ) ,
2009-10-27 12:43:08 +00:00
NWidget ( WWT_TEXT , COLOUR_LIGHT_BLUE , NLWW_TEXT ) , SetDataTip ( STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN , STR_NULL ) , SetResize ( 1 , 0 ) , SetPadding ( 10 , 10 , 0 , 10 ) ,
2009-05-05 20:40:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 3 ) ,
2009-10-27 12:43:08 +00:00
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 10 , 0 , 10 ) ,
2009-05-05 20:40:08 +00:00
/* Company list. */
NWidget ( NWID_VERTICAL ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PANEL , COLOUR_WHITE , NLWW_HEADER ) , SetMinimalSize ( 146 , 0 ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , EndContainer ( ) ,
NWidget ( WWT_MATRIX , COLOUR_LIGHT_BLUE , NLWW_MATRIX ) , SetMinimalSize ( 146 , 0 ) , SetResize ( 1 , 1 ) , SetFill ( 1 , 1 ) , SetDataTip ( 0 , STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( WWT_SCROLLBAR , COLOUR_LIGHT_BLUE , NLWW_SCROLLBAR ) ,
2009-10-27 12:43:08 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 5 , 0 ) , SetResize ( 0 , 1 ) ,
2009-05-05 20:40:08 +00:00
/* Company info. */
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PANEL , COLOUR_LIGHT_BLUE , NLWW_DETAILS ) , SetMinimalSize ( 232 , 0 ) , SetResize ( 1 , 1 ) , SetFill ( 1 , 1 ) , EndContainer ( ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
2009-07-16 10:13:33 +00:00
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 9 ) ,
2009-05-05 20:40:08 +00:00
/* Buttons. */
2009-10-27 12:43:08 +00:00
NWidget ( NWID_HORIZONTAL , NC_EQUALSIZE ) , SetPIP ( 10 , 3 , 10 ) ,
NWidget ( NWID_VERTICAL , NC_EQUALSIZE ) , SetPIP ( 0 , 3 , 0 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NLWW_JOIN ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_GAME_LOBBY_JOIN_COMPANY , STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NLWW_NEW ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_GAME_LOBBY_NEW_COMPANY , STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
2009-10-27 12:43:08 +00:00
NWidget ( NWID_VERTICAL , NC_EQUALSIZE ) , SetPIP ( 0 , 3 , 0 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NLWW_SPECTATE ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_GAME_LOBBY_SPECTATE_GAME , STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NLWW_REFRESH ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_NETWORK_SERVER_LIST_REFRESH , STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
2009-10-27 12:43:08 +00:00
NWidget ( NWID_VERTICAL , NC_EQUALSIZE ) , SetPIP ( 0 , 3 , 0 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NLWW_CANCEL ) , SetResize ( 1 , 0 ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_BUTTON_CANCEL , STR_NULL ) ,
NWidget ( NWID_SPACER ) , SetFill ( 1 , 1 ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 8 ) ,
EndContainer ( ) ,
} ;
2009-03-15 15:12:06 +00:00
static const WindowDesc _network_lobby_window_desc (
2009-11-28 14:42:35 +00:00
WDP_CENTER , 0 , 0 ,
2007-02-01 15:49:12 +00:00
WC_NETWORK_WINDOW , WC_NONE ,
2009-11-24 17:28:29 +00:00
WDF_UNCLICK_BUTTONS ,
2009-11-15 10:26:01 +00:00
_nested_network_lobby_window_widgets , lengthof ( _nested_network_lobby_window_widgets )
2009-03-15 15:12:06 +00:00
) ;
2004-08-09 17:04:08 +00:00
2006-01-26 17:10:11 +00:00
/* Show the networklobbywindow with the selected server
* @ param ngl Selected game pointer which is passed to the new window */
2006-01-26 16:19:24 +00:00
static void ShowNetworkLobbyWindow ( NetworkGameList * ngl )
2004-08-09 17:04:08 +00:00
{
DeleteWindowById ( WC_NETWORK_WINDOW , 0 ) ;
2004-09-10 19:02:27 +00:00
2009-01-20 01:32:06 +00:00
NetworkTCPQueryServer ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) ) ; // company info
NetworkUDPQueryServer ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) ) ; // general data
2004-12-04 17:54:56 +00:00
2008-05-11 07:22:13 +00:00
new NetworkLobbyWindow ( & _network_lobby_window_desc , ngl ) ;
2004-12-04 17:54:56 +00:00
}
2004-08-09 17:04:08 +00:00
2008-12-22 18:40:57 +00:00
/**
* Get the company information of a given company to fill for the lobby .
* @ param company the company to get the company info struct from .
* @ return the company info struct to write the ( downloaded ) data to .
*/
NetworkCompanyInfo * GetLobbyCompanyInfo ( CompanyID company )
{
NetworkLobbyWindow * lobby = dynamic_cast < NetworkLobbyWindow * > ( FindWindowById ( WC_NETWORK_WINDOW , 0 ) ) ;
return ( lobby ! = NULL & & company < MAX_COMPANIES ) ? & lobby - > company_info [ company ] : NULL ;
}
2009-03-15 00:32:18 +00:00
/* The window below gives information about the connected clients
* and also makes able to give money to them , kick them ( if server )
* and stuff like that . */
2004-12-04 17:54:56 +00:00
2008-09-30 20:39:50 +00:00
extern void DrawCompanyIcon ( CompanyID cid , int x , int y ) ;
2004-12-04 17:54:56 +00:00
2009-03-15 00:32:18 +00:00
/* Every action must be of this form */
2004-12-04 17:54:56 +00:00
typedef void ClientList_Action_Proc ( byte client_no ) ;
2009-05-05 20:40:08 +00:00
static const NWidgetPart _nested_client_list_popup_widgets [ ] = {
2009-11-02 15:37:54 +00:00
NWidget ( WWT_PANEL , COLOUR_GREY , 0 ) , EndContainer ( ) ,
2009-05-05 20:40:08 +00:00
} ;
2009-11-02 15:37:54 +00:00
static const WindowDesc _client_list_popup_desc (
2009-11-28 15:01:49 +00:00
WDP_AUTO , 0 , 0 ,
2009-11-02 15:37:54 +00:00
WC_TOOLBAR_MENU , WC_CLIENT_LIST ,
2009-11-24 17:28:29 +00:00
0 ,
2009-11-15 10:26:01 +00:00
_nested_client_list_popup_widgets , lengthof ( _nested_client_list_popup_widgets )
2009-11-02 15:37:54 +00:00
) ;
2009-03-15 00:32:18 +00:00
/* Finds the Xth client-info that is active */
2009-04-04 00:48:48 +00:00
static NetworkClientInfo * NetworkFindClientInfo ( byte client_no )
2004-12-04 17:54:56 +00:00
{
2009-04-04 00:48:48 +00:00
NetworkClientInfo * ci ;
2005-11-13 13:43:55 +00:00
2008-12-23 08:39:30 +00:00
FOR_ALL_CLIENT_INFOS ( ci ) {
2004-12-04 17:54:56 +00:00
if ( client_no = = 0 ) return ci ;
client_no - - ;
}
return NULL ;
2004-08-09 17:04:08 +00:00
}
2004-12-04 17:54:56 +00:00
2009-03-15 00:32:18 +00:00
/* Here we start to define the options out of the menu */
2004-12-04 17:54:56 +00:00
static void ClientList_Kick ( byte client_no )
{
2009-03-06 12:42:01 +00:00
const NetworkClientInfo * ci = NetworkFindClientInfo ( client_no ) ;
if ( ci = = NULL ) return ;
NetworkServerKickClient ( ci - > client_id ) ;
2004-12-04 17:54:56 +00:00
}
2005-01-02 12:03:43 +00:00
static void ClientList_Ban ( byte client_no )
2004-12-04 17:54:56 +00:00
{
2009-04-04 00:48:48 +00:00
NetworkClientInfo * ci = NetworkFindClientInfo ( client_no ) ;
2005-01-02 12:03:43 +00:00
2009-03-06 12:42:01 +00:00
if ( ci = = NULL ) return ;
2005-01-02 12:03:43 +00:00
2009-03-06 12:42:01 +00:00
NetworkServerBanIP ( GetClientIP ( ci ) ) ;
2005-01-02 12:03:43 +00:00
}
2004-12-04 17:54:56 +00:00
static void ClientList_GiveMoney ( byte client_no )
{
2008-03-26 10:38:31 +00:00
if ( NetworkFindClientInfo ( client_no ) ! = NULL ) {
2006-10-17 22:16:46 +00:00
ShowNetworkGiveMoneyWindow ( NetworkFindClientInfo ( client_no ) - > client_playas ) ;
2008-03-26 10:38:31 +00:00
}
2004-12-04 17:54:56 +00:00
}
static void ClientList_SpeakToClient ( byte client_no )
{
2008-03-26 10:38:31 +00:00
if ( NetworkFindClientInfo ( client_no ) ! = NULL ) {
2008-12-22 12:59:31 +00:00
ShowNetworkChatQueryWindow ( DESTTYPE_CLIENT , NetworkFindClientInfo ( client_no ) - > client_id ) ;
2008-03-26 10:38:31 +00:00
}
2004-12-04 17:54:56 +00:00
}
2006-10-21 22:29:14 +00:00
static void ClientList_SpeakToCompany ( byte client_no )
2004-12-04 17:54:56 +00:00
{
2008-03-26 10:38:31 +00:00
if ( NetworkFindClientInfo ( client_no ) ! = NULL ) {
2006-10-21 22:29:14 +00:00
ShowNetworkChatQueryWindow ( DESTTYPE_TEAM , NetworkFindClientInfo ( client_no ) - > client_playas ) ;
2008-03-26 10:38:31 +00:00
}
2004-12-04 17:54:56 +00:00
}
static void ClientList_SpeakToAll ( byte client_no )
{
ShowNetworkChatQueryWindow ( DESTTYPE_BROADCAST , 0 ) ;
}
2009-11-02 15:27:05 +00:00
/** Popup selection window to chose an action to perform */
2008-05-15 20:04:10 +00:00
struct NetworkClientListPopupWindow : Window {
2009-11-02 15:27:05 +00:00
/** Container for actions that can be executed. */
struct ClientListAction {
StringID name ; ///< Name of the action to execute
ClientList_Action_Proc * proc ; ///< Action to execute
} ;
uint sel_index ;
2008-05-15 20:04:10 +00:00
int client_no ;
2009-11-02 15:37:54 +00:00
Point desired_location ;
2009-11-02 15:27:05 +00:00
SmallVector < ClientListAction , 2 > actions ; ///< Actions to execute
/**
* Add an action to the list of actions to execute .
* @ param name the name of the action
* @ param proc the procedure to execute for the action
*/
inline void AddAction ( StringID name , ClientList_Action_Proc * proc )
{
ClientListAction * action = this - > actions . Append ( ) ;
action - > name = name ;
action - > proc = proc ;
}
2004-12-04 17:54:56 +00:00
2009-11-02 15:37:54 +00:00
NetworkClientListPopupWindow ( const WindowDesc * desc , int x , int y , int client_no ) :
Window ( ) ,
2008-05-15 20:04:10 +00:00
sel_index ( 0 ) , client_no ( client_no )
{
2009-11-02 15:37:54 +00:00
this - > desired_location . x = x ;
this - > desired_location . y = y ;
2008-05-15 20:04:10 +00:00
const NetworkClientInfo * ci = NetworkFindClientInfo ( client_no ) ;
2004-12-04 17:54:56 +00:00
2008-12-22 12:59:31 +00:00
if ( _network_own_client_id ! = ci - > client_id ) {
2009-11-02 15:27:05 +00:00
this - > AddAction ( STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT , & ClientList_SpeakToClient ) ;
2008-05-15 20:04:10 +00:00
}
2004-12-04 17:54:56 +00:00
2009-05-17 01:00:56 +00:00
if ( Company : : IsValidID ( ci - > client_playas ) | | ci - > client_playas = = COMPANY_SPECTATOR ) {
2009-11-02 15:27:05 +00:00
this - > AddAction ( STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY , & ClientList_SpeakToCompany ) ;
2008-05-15 20:04:10 +00:00
}
2009-11-02 15:27:05 +00:00
this - > AddAction ( STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL , & ClientList_SpeakToAll ) ;
2008-05-15 20:04:10 +00:00
2008-12-22 12:59:31 +00:00
if ( _network_own_client_id ! = ci - > client_id ) {
2008-09-30 20:39:50 +00:00
/* We are no spectator and the company we want to give money to is no spectator and money gifts are allowed */
2009-05-19 21:20:14 +00:00
if ( Company : : IsValidID ( _local_company ) & & Company : : IsValidID ( ci - > client_playas ) & & _settings_game . economy . give_money ) {
2009-11-02 15:27:05 +00:00
this - > AddAction ( STR_NETWORK_CLIENTLIST_GIVE_MONEY , & ClientList_GiveMoney ) ;
2008-05-15 20:04:10 +00:00
}
}
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
/* A server can kick clients (but not himself) */
2008-12-22 12:59:31 +00:00
if ( _network_server & & _network_own_client_id ! = ci - > client_id ) {
2009-11-02 15:27:05 +00:00
this - > AddAction ( STR_NETWORK_CLIENTLIST_KICK , & ClientList_Kick ) ;
this - > AddAction ( STR_NETWORK_CLIENTLIST_BAN , & ClientList_Ban ) ;
2008-05-15 20:04:10 +00:00
}
2005-01-03 19:45:18 +00:00
2008-05-15 20:04:10 +00:00
this - > flags4 & = ~ WF_WHITE_BORDER_MASK ;
2009-11-02 15:37:54 +00:00
this - > InitNested ( desc , 0 ) ;
}
2004-12-04 17:54:56 +00:00
2009-11-02 15:37:54 +00:00
virtual Point OnInitialPosition ( const WindowDesc * desc , int16 sm_width , int16 sm_height , int window_number )
{
return this - > desired_location ;
2004-12-04 17:54:56 +00:00
}
2009-11-22 18:28:14 +00:00
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
2008-05-15 20:04:10 +00:00
{
2009-11-02 15:37:54 +00:00
Dimension d = * size ;
for ( const ClientListAction * action = this - > actions . Begin ( ) ; action ! = this - > actions . End ( ) ; action + + ) {
d = maxdim ( GetStringBoundingBox ( action - > name ) , d ) ;
}
d . height * = this - > actions . Length ( ) ;
d . width + = WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT ;
d . height + = WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM ;
* size = d ;
}
2004-12-04 17:54:56 +00:00
2009-11-02 15:37:54 +00:00
virtual void DrawWidget ( const Rect & r , int widget ) const
{
2008-05-15 20:04:10 +00:00
/* Draw the actions */
int sel = this - > sel_index ;
2009-11-02 15:37:54 +00:00
int y = r . top + WD_FRAMERECT_TOP ;
2009-11-02 15:27:05 +00:00
for ( const ClientListAction * action = this - > actions . Begin ( ) ; action ! = this - > actions . End ( ) ; action + + , y + = FONT_HEIGHT_NORMAL ) {
2008-05-15 20:04:10 +00:00
TextColour colour ;
if ( sel - - = = 0 ) { // Selected item, highlight it
2009-11-02 15:37:54 +00:00
GfxFillRect ( r . left + 1 , y , r . right - 1 , y + FONT_HEIGHT_NORMAL - 1 , 0 ) ;
2008-05-15 20:04:10 +00:00
colour = TC_WHITE ;
} else {
colour = TC_BLACK ;
}
2005-01-03 19:45:18 +00:00
2009-11-02 15:37:54 +00:00
DrawString ( r . left + WD_FRAMERECT_LEFT , r . right - WD_FRAMERECT_RIGHT , y , action - > name , colour ) ;
2008-05-15 20:04:10 +00:00
}
}
2004-12-04 17:54:56 +00:00
2009-11-02 15:37:54 +00:00
virtual void OnPaint ( )
{
this - > DrawWidgets ( ) ;
}
2008-05-15 20:04:10 +00:00
virtual void OnMouseLoop ( )
{
/* We selected an action */
2009-11-02 15:27:05 +00:00
uint index = ( _cursor . pos . y - this - > top - WD_FRAMERECT_TOP ) / FONT_HEIGHT_NORMAL ;
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
if ( _left_button_down ) {
2009-11-02 15:27:05 +00:00
if ( index = = this - > sel_index | | index > = this - > actions . Length ( ) ) return ;
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
this - > sel_index = index ;
this - > SetDirty ( ) ;
} else {
2009-11-02 15:27:05 +00:00
if ( index < this - > actions . Length ( ) & & _cursor . pos . y > = this - > top ) {
this - > actions [ index ] . proc ( this - > client_no ) ;
2008-03-26 10:38:31 +00:00
}
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
DeleteWindowById ( WC_TOOLBAR_MENU , 0 ) ;
}
}
} ;
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
/**
* Show the popup ( action list )
*/
static void PopupClientList ( int client_no , int x , int y )
{
DeleteWindowById ( WC_TOOLBAR_MENU , 0 ) ;
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
if ( NetworkFindClientInfo ( client_no ) = = NULL ) return ;
2004-12-04 17:54:56 +00:00
2009-11-02 15:37:54 +00:00
new NetworkClientListPopupWindow ( & _client_list_popup_desc , x , y , client_no ) ;
2004-12-04 17:54:56 +00:00
}
2009-11-02 09:58:08 +00:00
/** Widget numbers of the client list window. */
enum ClientListWidgets {
CLW_PANEL ,
} ;
static const NWidgetPart _nested_client_list_widgets [ ] = {
NWidget ( NWID_HORIZONTAL ) ,
2009-11-24 18:05:55 +00:00
NWidget ( WWT_CLOSEBOX , COLOUR_GREY ) ,
NWidget ( WWT_CAPTION , COLOUR_GREY ) , SetDataTip ( STR_NETWORK_COMPANY_LIST_CLIENT_LIST , STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS ) ,
NWidget ( WWT_STICKYBOX , COLOUR_GREY ) ,
2009-11-02 09:58:08 +00:00
EndContainer ( ) ,
2009-11-02 10:52:57 +00:00
NWidget ( WWT_PANEL , COLOUR_GREY , CLW_PANEL ) , SetMinimalSize ( 250 , WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM ) , SetResize ( 1 , 1 ) , EndContainer ( ) ,
2009-11-02 09:58:08 +00:00
} ;
static const WindowDesc _client_list_desc (
2009-11-28 15:01:49 +00:00
WDP_AUTO , 0 , 0 ,
2009-11-02 09:58:08 +00:00
WC_CLIENT_LIST , WC_NONE ,
2009-11-24 17:28:29 +00:00
0 ,
2009-11-15 10:26:01 +00:00
_nested_client_list_widgets , lengthof ( _nested_client_list_widgets )
2009-11-02 09:58:08 +00:00
) ;
2008-03-26 10:38:31 +00:00
/**
* Main handle for clientlist
*/
2009-11-02 10:52:57 +00:00
struct NetworkClientListWindow : Window {
2008-12-23 17:12:20 +00:00
int selected_item ;
2009-11-02 16:03:17 +00:00
uint server_client_width ;
uint company_icon_width ;
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
NetworkClientListWindow ( const WindowDesc * desc , WindowNumber window_number ) :
2009-11-02 16:03:17 +00:00
Window ( ) ,
selected_item ( - 1 )
2008-05-15 20:04:10 +00:00
{
2009-11-02 16:03:17 +00:00
this - > InitNested ( desc , window_number ) ;
2008-05-15 20:04:10 +00:00
}
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
/**
* Finds the amount of clients and set the height correct
*/
bool CheckClientListHeight ( )
{
int num = 0 ;
const NetworkClientInfo * ci ;
2004-12-04 17:54:56 +00:00
2008-05-15 20:04:10 +00:00
/* Should be replaced with a loop through all clients */
2008-12-23 08:39:30 +00:00
FOR_ALL_CLIENT_INFOS ( ci ) {
2008-12-23 17:12:20 +00:00
if ( ci - > client_playas ! = COMPANY_INACTIVE_CLIENT ) num + + ;
2008-05-15 20:04:10 +00:00
}
2004-12-04 17:54:56 +00:00
2009-11-02 10:52:57 +00:00
num * = FONT_HEIGHT_NORMAL ;
2004-12-04 17:54:56 +00:00
2009-11-02 16:03:17 +00:00
int diff = ( num + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM ) - ( this - > GetWidget < NWidgetBase > ( CLW_PANEL ) - > current_y ) ;
2008-05-15 20:04:10 +00:00
/* If height is changed */
2009-11-02 10:52:57 +00:00
if ( diff ! = 0 ) {
ResizeWindow ( this , 0 , diff ) ;
2008-05-15 20:04:10 +00:00
return false ;
}
return true ;
}
2004-12-04 17:54:56 +00:00
2009-11-22 18:28:14 +00:00
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
2008-05-15 20:04:10 +00:00
{
2009-11-02 16:03:17 +00:00
if ( widget ! = CLW_PANEL ) return ;
this - > server_client_width = max ( GetStringBoundingBox ( STR_NETWORK_SERVER ) . width , GetStringBoundingBox ( STR_NETWORK_CLIENT ) . width ) + WD_FRAMERECT_RIGHT ;
2009-11-02 16:07:09 +00:00
this - > company_icon_width = GetSpriteSize ( SPR_COMPANY_ICON ) . width + WD_FRAMERECT_LEFT ;
2004-12-04 17:54:56 +00:00
2009-12-05 13:53:58 +00:00
uint width = 100 ; // Default width
2009-11-02 16:03:17 +00:00
const NetworkClientInfo * ci ;
FOR_ALL_CLIENT_INFOS ( ci ) {
width = max ( width , GetStringBoundingBox ( ci - > client_name ) . width ) ;
}
2009-12-05 13:53:58 +00:00
size - > width = WD_FRAMERECT_LEFT + this - > server_client_width + this - > company_icon_width + width + WD_FRAMERECT_RIGHT ;
2009-11-02 16:03:17 +00:00
}
virtual void OnPaint ( )
{
2008-05-15 20:04:10 +00:00
/* Check if we need to reset the height */
if ( ! this - > CheckClientListHeight ( ) ) return ;
2004-12-04 17:54:56 +00:00
2008-05-17 12:48:06 +00:00
this - > DrawWidgets ( ) ;
2009-11-02 16:03:17 +00:00
}
2004-12-04 17:54:56 +00:00
2009-11-02 16:03:17 +00:00
virtual void DrawWidget ( const Rect & r , int widget ) const
{
if ( widget ! = CLW_PANEL ) return ;
2004-12-04 17:54:56 +00:00
2009-11-18 22:00:04 +00:00
bool rtl = _dynlang . text_dir = = TD_RTL ;
2009-11-22 22:17:06 +00:00
int icon_y_offset = 1 + ( FONT_HEIGHT_NORMAL - 10 ) / 2 ;
2009-11-18 22:00:04 +00:00
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 - > company_icon_width ;
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 ;
2009-11-02 16:03:17 +00:00
int i = 0 ;
const NetworkClientInfo * ci ;
2008-12-23 08:39:30 +00:00
FOR_ALL_CLIENT_INFOS ( ci ) {
2008-05-15 20:04:10 +00:00
TextColour colour ;
if ( this - > selected_item = = i + + ) { // Selected item, highlight it
2009-11-02 16:03:17 +00:00
GfxFillRect ( r . left + 1 , y , r . right - 1 , y + FONT_HEIGHT_NORMAL - 1 , 0 ) ;
2008-05-15 20:04:10 +00:00
colour = TC_WHITE ;
} else {
colour = TC_BLACK ;
2008-03-26 10:38:31 +00:00
}
2004-12-04 17:54:56 +00:00
2008-12-22 12:59:31 +00:00
if ( ci - > client_id = = CLIENT_ID_SERVER ) {
2009-11-18 22:00:04 +00:00
DrawString ( type_left , type_right , y , STR_NETWORK_SERVER , colour ) ;
2008-03-26 10:38:31 +00:00
} else {
2009-11-18 22:00:04 +00:00
DrawString ( type_left , type_right , y , STR_NETWORK_CLIENT , colour ) ;
2008-03-26 10:38:31 +00:00
}
2008-05-15 20:04:10 +00:00
/* Filter out spectators */
2009-11-22 22:17:06 +00:00
if ( Company : : IsValidID ( ci - > client_playas ) ) DrawCompanyIcon ( ci - > client_playas , icon_left , y + icon_y_offset ) ;
2004-12-04 17:54:56 +00:00
2009-11-18 22:00:04 +00:00
DrawString ( name_left , name_right , y , ci - > client_name , colour ) ;
2008-05-15 20:04:10 +00:00
2009-11-02 10:52:57 +00:00
y + = FONT_HEIGHT_NORMAL ;
2008-05-15 20:04:10 +00:00
}
2004-12-04 17:54:56 +00:00
}
2008-05-15 20:04:10 +00:00
2010-01-30 18:34:48 +00:00
virtual void OnClick ( Point pt , int widget , int click_count )
2008-05-15 20:04:10 +00:00
{
/* Show the popup with option */
2008-12-23 17:12:20 +00:00
if ( this - > selected_item ! = - 1 ) {
2008-05-15 20:04:10 +00:00
PopupClientList ( this - > selected_item , pt . x + this - > left , pt . y + this - > top ) ;
}
}
virtual void OnMouseOver ( Point pt , int widget )
{
/* -1 means we left the current window */
if ( pt . y = = - 1 ) {
2008-12-23 17:12:20 +00:00
this - > selected_item = - 1 ;
2008-05-15 20:04:10 +00:00
this - > SetDirty ( ) ;
return ;
}
/* Find the new selected item (if any) */
2009-11-02 16:03:17 +00:00
pt . y - = this - > GetWidget < NWidgetBase > ( CLW_PANEL ) - > pos_y ;
int item = - 1 ;
if ( IsInsideMM ( pt . y , WD_FRAMERECT_TOP , this - > GetWidget < NWidgetBase > ( CLW_PANEL ) - > current_y - WD_FRAMERECT_BOTTOM ) ) {
item = ( pt . y - WD_FRAMERECT_TOP ) / FONT_HEIGHT_NORMAL ;
}
/* It did not change.. no update! */
if ( item = = this - > selected_item ) return ;
this - > selected_item = item ;
2008-05-15 20:04:10 +00:00
/* Repaint */
this - > SetDirty ( ) ;
}
} ;
2004-12-04 17:54:56 +00:00
2007-03-07 11:47:46 +00:00
void ShowClientList ( )
2004-12-04 17:54:56 +00:00
{
2008-05-15 20:04:10 +00:00
AllocateWindowDescFront < NetworkClientListWindow > ( & _client_list_desc , 0 ) ;
2004-12-04 17:54:56 +00:00
}
2006-09-01 13:35:43 +00:00
static NetworkPasswordType pw_type ;
void ShowNetworkNeedPassword ( NetworkPasswordType npt )
{
StringID caption ;
pw_type = npt ;
switch ( npt ) {
default : NOT_REACHED ( ) ;
2006-10-08 11:54:47 +00:00
case NETWORK_GAME_PASSWORD : caption = STR_NETWORK_NEED_GAME_PASSWORD_CAPTION ; break ;
case NETWORK_COMPANY_PASSWORD : caption = STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION ; break ;
2006-09-01 13:35:43 +00:00
}
2008-09-15 16:29:40 +00:00
ShowQueryString ( STR_EMPTY , caption , 20 , 180 , FindWindowById ( WC_NETWORK_STATUS_WINDOW , 0 ) , CS_ALPHANUMERAL , QSF_NONE ) ;
2006-09-01 13:35:43 +00:00
}
2009-03-15 00:32:18 +00:00
/* Vars needed for the join-GUI */
2008-05-30 18:20:26 +00:00
NetworkJoinStatus _network_join_status ;
uint8 _network_join_waiting ;
2009-01-16 12:59:47 +00:00
uint32 _network_join_bytes ;
uint32 _network_join_bytes_total ;
2008-05-30 18:20:26 +00:00
2009-03-21 21:26:10 +00:00
/** Widgets used for the join status window. */
enum NetworkJoinStatusWidgets {
NJSW_BACKGROUND , ///< Background
NJSW_CANCELOK , ///< Cancel/OK button
} ;
2008-05-17 08:00:13 +00:00
struct NetworkJoinStatusWindow : Window {
2009-11-02 19:42:09 +00:00
NetworkJoinStatusWindow ( const WindowDesc * desc ) : Window ( )
2008-05-17 08:00:13 +00:00
{
this - > parent = FindWindowById ( WC_NETWORK_WINDOW , 0 ) ;
2009-11-02 19:42:09 +00:00
this - > InitNested ( desc , 0 ) ;
2008-05-17 08:00:13 +00:00
}
2006-09-01 13:35:43 +00:00
2008-05-17 08:00:13 +00:00
virtual void OnPaint ( )
{
2008-05-17 12:48:06 +00:00
this - > DrawWidgets ( ) ;
2009-11-02 19:42:09 +00:00
}
2004-12-04 17:54:56 +00:00
2009-11-02 19:42:09 +00:00
virtual void DrawWidget ( const Rect & r , int widget ) const
{
if ( widget ! = NJSW_BACKGROUND ) return ;
uint8 progress ; // used for progress bar
DrawString ( r . left + 2 , r . right - 2 , r . top + 20 , STR_NETWORK_CONNECTING_1 + _network_join_status , TC_FROMSTRING , SA_CENTER ) ;
2008-05-17 08:00:13 +00:00
switch ( _network_join_status ) {
case NETWORK_JOIN_STATUS_CONNECTING : case NETWORK_JOIN_STATUS_AUTHORIZING :
case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO :
progress = 10 ; // first two stages 10%
break ;
case NETWORK_JOIN_STATUS_WAITING :
SetDParam ( 0 , _network_join_waiting ) ;
2009-11-02 19:42:09 +00:00
DrawString ( r . left + 2 , r . right - 2 , r . top + 20 + FONT_HEIGHT_NORMAL , STR_NETWORK_CONNECTING_WAITING , TC_FROMSTRING , SA_CENTER ) ;
2008-05-17 08:00:13 +00:00
progress = 15 ; // third stage is 15%
break ;
case NETWORK_JOIN_STATUS_DOWNLOADING :
2009-01-16 12:59:47 +00:00
SetDParam ( 0 , _network_join_bytes ) ;
SetDParam ( 1 , _network_join_bytes_total ) ;
2009-11-02 19:42:09 +00:00
DrawString ( r . left + 2 , r . right - 2 , r . top + 20 + FONT_HEIGHT_NORMAL , STR_NETWORK_CONNECTING_DOWNLOADING , TC_FROMSTRING , SA_CENTER ) ;
2008-05-17 08:00:13 +00:00
/* Fallthrough */
2009-03-15 00:32:18 +00:00
default : // Waiting is 15%, so the resting receivement of map is maximum 70%
2009-01-16 12:59:47 +00:00
progress = 15 + _network_join_bytes * ( 100 - 15 ) / _network_join_bytes_total ;
2008-05-17 08:00:13 +00:00
}
2004-12-04 17:54:56 +00:00
2008-05-17 08:00:13 +00:00
/* Draw nice progress bar :) */
2009-11-02 19:42:09 +00:00
DrawFrameRect ( r . left + 20 , r . top + 5 , ( int ) ( ( this - > width - 20 ) * progress / 100 ) , r . top + 15 , COLOUR_MAUVE , FR_NONE ) ;
2008-05-17 08:00:13 +00:00
}
2006-09-01 13:35:43 +00:00
2009-11-23 12:45:01 +00:00
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
{
if ( widget ! = NJSW_BACKGROUND ) return ;
size - > height = 25 + 2 * FONT_HEIGHT_NORMAL ;
/* Account for the statuses */
uint width = 0 ;
for ( uint i = 0 ; i < NETWORK_JOIN_STATUS_END ; i + + ) {
width = max ( width , GetStringBoundingBox ( STR_NETWORK_CONNECTING_1 + i ) . width ) ;
}
/* For the number of waiting (other) players */
SetDParam ( 0 , 255 ) ;
width = max ( width , GetStringBoundingBox ( STR_NETWORK_CONNECTING_WAITING ) . width ) ;
/* Account for downloading ~ 10 MiB */
SetDParam ( 0 , 10000000 ) ;
SetDParam ( 1 , 10000000 ) ;
width = max ( width , GetStringBoundingBox ( STR_NETWORK_CONNECTING_DOWNLOADING ) . width ) ;
/* Give a bit more clearing for the widest strings than strictly needed */
size - > width = width + WD_FRAMERECT_LEFT + WD_FRAMERECT_BOTTOM + 10 ;
}
2010-01-30 18:34:48 +00:00
virtual void OnClick ( Point pt , int widget , int click_count )
2008-05-17 08:00:13 +00:00
{
2009-03-21 21:26:10 +00:00
if ( widget = = NJSW_CANCELOK ) { // Disconnect button
2008-05-17 08:00:13 +00:00
NetworkDisconnect ( ) ;
2009-02-25 00:45:52 +00:00
SwitchToMode ( SM_MENU ) ;
2008-05-17 08:00:13 +00:00
ShowNetworkGameWindow ( ) ;
}
2004-12-04 17:54:56 +00:00
}
2008-05-17 08:00:13 +00:00
virtual void OnQueryTextFinished ( char * str )
{
if ( StrEmpty ( str ) ) {
NetworkDisconnect ( ) ;
ShowNetworkGameWindow ( ) ;
} else {
SEND_COMMAND ( PACKET_CLIENT_PASSWORD ) ( pw_type , str ) ;
}
}
} ;
2004-12-04 17:54:56 +00:00
2009-05-05 20:40:08 +00:00
static const NWidgetPart _nested_network_join_status_window_widgets [ ] = {
2009-11-24 18:05:55 +00:00
NWidget ( WWT_CAPTION , COLOUR_GREY ) , SetDataTip ( STR_NETWORK_CONNECTING_CAPTION , STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS ) ,
NWidget ( WWT_PANEL , COLOUR_GREY ) ,
2009-11-23 12:45:01 +00:00
NWidget ( WWT_EMPTY , COLOUR_GREY , NJSW_BACKGROUND ) ,
NWidget ( NWID_HORIZONTAL ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 75 , 0 ) , SetFill ( 1 , 0 ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_WHITE , NJSW_CANCELOK ) , SetMinimalSize ( 101 , 12 ) , SetDataTip ( STR_NETWORK_CONNECTION_DISCONNECT , STR_NULL ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 75 , 0 ) , SetFill ( 1 , 0 ) ,
EndContainer ( ) ,
NWidget ( NWID_SPACER ) , SetMinimalSize ( 0 , 4 ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
} ;
2009-03-15 15:12:06 +00:00
static const WindowDesc _network_join_status_window_desc (
2009-11-28 15:01:49 +00:00
WDP_CENTER , 0 , 0 ,
2007-02-01 15:49:12 +00:00
WC_NETWORK_STATUS_WINDOW , WC_NONE ,
2009-11-24 17:28:29 +00:00
WDF_MODAL ,
2009-11-15 10:26:01 +00:00
_nested_network_join_status_window_widgets , lengthof ( _nested_network_join_status_window_widgets )
2009-03-15 15:12:06 +00:00
) ;
2004-12-04 17:54:56 +00:00
2007-03-07 11:47:46 +00:00
void ShowJoinStatusWindow ( )
2004-12-04 17:54:56 +00:00
{
DeleteWindowById ( WC_NETWORK_STATUS_WINDOW , 0 ) ;
2008-05-17 08:00:13 +00:00
new NetworkJoinStatusWindow ( & _network_join_status_window_desc ) ;
2004-12-15 21:13:52 +00:00
}
2004-12-04 17:54:56 +00:00
2004-12-14 16:53:38 +00:00
2007-12-02 14:48:26 +00:00
/** Enum for NetworkGameWindow, referring to _network_game_window_widgets */
enum NetworkCompanyPasswordWindowWidgets {
NCPWW_BACKGROUND , ///< The background of the interface
NCPWW_LABEL , ///< Label in front of the password field
NCPWW_PASSWORD , ///< Input field for the password
NCPWW_SAVE_AS_DEFAULT_PASSWORD , ///< Toggle 'button' for saving the current password as default password
NCPWW_CANCEL , ///< Close the window without changing anything
NCPWW_OK , ///< Safe the password etc.
} ;
2008-05-11 12:26:20 +00:00
struct NetworkCompanyPasswordWindow : public QueryStringBaseWindow {
2009-10-26 12:24:14 +00:00
NetworkCompanyPasswordWindow ( const WindowDesc * desc , Window * parent ) : QueryStringBaseWindow ( lengthof ( _settings_client . network . default_company_pass ) )
2008-05-11 12:26:20 +00:00
{
2009-10-26 12:24:14 +00:00
this - > InitNested ( desc , 0 ) ;
2008-05-15 19:24:15 +00:00
this - > parent = parent ;
2008-05-11 12:26:20 +00:00
this - > afilter = CS_ALPHANUMERAL ;
2008-08-11 22:08:56 +00:00
InitializeTextBuffer ( & this - > text , this - > edit_str_buf , this - > edit_str_size , 0 ) ;
2009-02-09 01:22:29 +00:00
this - > SetFocusedWidget ( NCPWW_PASSWORD ) ;
2008-05-11 12:26:20 +00:00
}
2007-12-02 14:48:26 +00:00
2008-05-11 12:26:20 +00:00
void OnOk ( )
{
if ( this - > IsWidgetLowered ( NCPWW_SAVE_AS_DEFAULT_PASSWORD ) ) {
2008-05-29 20:21:28 +00:00
snprintf ( _settings_client . network . default_company_pass , lengthof ( _settings_client . network . default_company_pass ) , " %s " , this - > edit_str_buf ) ;
2008-05-11 12:26:20 +00:00
}
2007-12-02 14:48:26 +00:00
2008-05-11 12:26:20 +00:00
/* empty password is a '*' because of console argument */
2008-08-11 22:08:56 +00:00
if ( StrEmpty ( this - > edit_str_buf ) ) snprintf ( this - > edit_str_buf , this - > edit_str_size , " * " ) ;
2008-05-11 12:26:20 +00:00
char * password = this - > edit_str_buf ;
NetworkChangeCompanyPassword ( 1 , & password ) ;
}
2007-12-02 14:48:26 +00:00
2008-05-11 12:26:20 +00:00
virtual void OnPaint ( )
{
2008-05-17 12:48:06 +00:00
this - > DrawWidgets ( ) ;
2009-09-14 20:24:17 +00:00
this - > DrawEditBox ( NCPWW_PASSWORD ) ;
2008-05-11 12:26:20 +00:00
}
2007-12-02 14:48:26 +00:00
2010-01-30 18:34:48 +00:00
virtual void OnClick ( Point pt , int widget , int click_count )
2008-05-11 12:26:20 +00:00
{
switch ( widget ) {
case NCPWW_OK :
this - > OnOk ( ) ;
2007-12-02 14:48:26 +00:00
2008-05-11 12:26:20 +00:00
/* FALL THROUGH */
case NCPWW_CANCEL :
delete this ;
break ;
2007-12-16 19:28:07 +00:00
2008-05-11 12:26:20 +00:00
case NCPWW_SAVE_AS_DEFAULT_PASSWORD :
this - > ToggleWidgetLoweredState ( NCPWW_SAVE_AS_DEFAULT_PASSWORD ) ;
this - > SetDirty ( ) ;
break ;
}
2007-12-02 14:48:26 +00:00
}
2008-05-11 12:26:20 +00:00
virtual void OnMouseLoop ( )
{
this - > HandleEditBox ( 4 ) ;
}
2008-05-17 23:11:06 +00:00
virtual EventState OnKeyPress ( uint16 key , uint16 keycode )
2008-05-11 12:26:20 +00:00
{
2009-03-11 09:21:11 +00:00
EventState state = ES_NOT_HANDLED ;
2009-12-21 20:32:20 +00:00
switch ( this - > HandleEditBoxKey ( NCPWW_PASSWORD , key , keycode , state ) ) {
2008-10-25 19:59:11 +00:00
default : break ;
case HEBR_CONFIRM :
2008-05-11 12:26:20 +00:00
this - > OnOk ( ) ;
/* FALL THROUGH */
2008-10-25 19:59:11 +00:00
case HEBR_CANCEL :
2008-05-11 12:26:20 +00:00
delete this ;
break ;
}
2008-05-17 23:11:06 +00:00
return state ;
2008-05-11 12:26:20 +00:00
}
2009-01-03 13:59:05 +00:00
virtual void OnOpenOSKWindow ( int wid )
{
ShowOnScreenKeyboard ( this , wid , NCPWW_CANCEL , NCPWW_OK ) ;
}
2008-05-11 12:26:20 +00:00
} ;
2007-12-02 14:48:26 +00:00
2009-10-26 12:24:14 +00:00
static const NWidgetPart _nested_network_company_password_window_widgets [ ] = {
2009-05-05 20:40:08 +00:00
NWidget ( NWID_HORIZONTAL ) ,
2009-11-24 18:05:55 +00:00
NWidget ( WWT_CLOSEBOX , COLOUR_GREY ) ,
NWidget ( WWT_CAPTION , COLOUR_GREY ) , SetDataTip ( STR_COMPANY_PASSWORD_CAPTION , STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
NWidget ( WWT_PANEL , COLOUR_GREY , NCPWW_BACKGROUND ) ,
2009-10-26 12:24:14 +00:00
NWidget ( NWID_VERTICAL ) , SetPIP ( 5 , 5 , 5 ) ,
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 5 , 5 , 5 ) ,
NWidget ( WWT_TEXT , COLOUR_GREY , NCPWW_LABEL ) , SetDataTip ( STR_COMPANY_VIEW_PASSWORD , STR_NULL ) ,
2009-08-05 17:59:21 +00:00
NWidget ( WWT_EDITBOX , COLOUR_GREY , NCPWW_PASSWORD ) , SetMinimalSize ( 194 , 12 ) , SetDataTip ( STR_COMPANY_VIEW_SET_PASSWORD , STR_NULL ) ,
2009-10-26 12:24:14 +00:00
EndContainer ( ) ,
NWidget ( NWID_HORIZONTAL ) , SetPIP ( 5 , 0 , 5 ) ,
2009-11-22 18:26:01 +00:00
NWidget ( NWID_SPACER ) , SetFill ( 1 , 0 ) ,
2009-05-05 20:40:08 +00:00
NWidget ( WWT_TEXTBTN , COLOUR_GREY , NCPWW_SAVE_AS_DEFAULT_PASSWORD ) , SetMinimalSize ( 194 , 12 ) ,
2009-08-05 17:59:21 +00:00
SetDataTip ( STR_COMPANY_PASSWORD_MAKE_DEFAULT , STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
EndContainer ( ) ,
EndContainer ( ) ,
2009-10-26 12:24:14 +00:00
NWidget ( NWID_HORIZONTAL , NC_EQUALSIZE ) ,
2009-11-22 18:26:01 +00:00
NWidget ( WWT_PUSHTXTBTN , COLOUR_GREY , NCPWW_CANCEL ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_BUTTON_CANCEL , STR_COMPANY_PASSWORD_CANCEL ) ,
NWidget ( WWT_PUSHTXTBTN , COLOUR_GREY , NCPWW_OK ) , SetFill ( 1 , 0 ) , SetDataTip ( STR_BUTTON_OK , STR_COMPANY_PASSWORD_OK ) ,
2009-05-05 20:40:08 +00:00
EndContainer ( ) ,
} ;
2009-10-26 12:24:14 +00:00
static const WindowDesc _network_company_password_window_desc (
2009-11-28 15:01:49 +00:00
WDP_AUTO , 0 , 0 ,
2007-12-02 14:48:26 +00:00
WC_COMPANY_PASSWORD_WINDOW , WC_NONE ,
2009-11-24 17:28:29 +00:00
WDF_UNCLICK_BUTTONS ,
2009-11-15 10:26:01 +00:00
_nested_network_company_password_window_widgets , lengthof ( _nested_network_company_password_window_widgets )
2009-03-15 15:12:06 +00:00
) ;
2007-12-02 14:48:26 +00:00
2008-05-15 19:24:15 +00:00
void ShowNetworkCompanyPasswordWindow ( Window * parent )
2007-12-02 14:48:26 +00:00
{
DeleteWindowById ( WC_COMPANY_PASSWORD_WINDOW , 0 ) ;
2009-10-26 12:24:14 +00:00
new NetworkCompanyPasswordWindow ( & _network_company_password_window_desc , parent ) ;
2007-12-02 14:48:26 +00:00
}
2004-12-04 17:54:56 +00:00
# endif /* ENABLE_NETWORK */