@ -52,15 +52,18 @@ struct AIListWindow : public Window {
int selected ;
CompanyID slot ;
int line_height ; // Height of a row in the matrix widget.
Scrollbar * vscroll ;
AIListWindow ( const WindowDesc * desc , CompanyID slot ) : Window ( ) ,
slot ( slot )
{
this - > ai_info_list = AI : : GetUniqueInfoList ( ) ;
this - > InitNested ( desc ) ; // Initializes 'this->line_height' as side effect.
this - > CreateNestedTree ( desc ) ;
this - > vscroll = this - > GetScrollbar ( AIL_WIDGET_SCROLLBAR ) ;
this - > FinishInitNested ( desc ) ; // Initializes 'this->line_height' as side effect.
this - > vscroll . SetCount ( ( int ) this - > ai_info_list - > size ( ) + 1 ) ;
this - > vscroll - > SetCount ( ( int ) this - > ai_info_list - > size ( ) + 1 ) ;
/* Try if we can find the currently selected AI */
this - > selected = - 1 ;
@ -99,13 +102,13 @@ struct AIListWindow : public Window {
/* Draw a list of all available AIs. */
int y = this - > GetWidget < NWidgetBase > ( AIL_WIDGET_LIST ) - > pos_y ;
/* First AI in the list is hardcoded to random */
if ( this - > vscroll . IsVisible ( 0 ) ) {
if ( this - > vscroll - > IsVisible ( 0 ) ) {
DrawString ( r . left + WD_MATRIX_LEFT , r . right - WD_MATRIX_LEFT , y + WD_MATRIX_TOP , STR_AI_CONFIG_RANDOM_AI , this - > selected = = - 1 ? TC_WHITE : TC_BLACK ) ;
y + = this - > line_height ;
}
AIInfoList : : const_iterator it = this - > ai_info_list - > begin ( ) ;
for ( int i = 1 ; it ! = this - > ai_info_list - > end ( ) ; i + + , it + + ) {
if ( this - > vscroll . IsVisible ( i ) ) {
if ( this - > vscroll - > IsVisible ( i ) ) {
DrawString ( r . left + WD_MATRIX_LEFT , r . right - WD_MATRIX_RIGHT , y + WD_MATRIX_TOP , ( * it ) . second - > GetName ( ) , ( this - > selected = = i - 1 ) ? TC_WHITE : TC_BLACK ) ;
y + = this - > line_height ;
}
@ -156,7 +159,7 @@ struct AIListWindow : public Window {
{
switch ( widget ) {
case AIL_WIDGET_LIST : { // Select one of the AIs
int sel = this - > vscroll . GetScrolledRowFromWidget ( pt . y , this , AIL_WIDGET_LIST , 0 , this - > line_height ) - 1 ;
int sel = this - > vscroll - > GetScrolledRowFromWidget ( pt . y , this , AIL_WIDGET_LIST , 0 , this - > line_height ) - 1 ;
if ( sel < ( int ) this - > ai_info_list - > size ( ) ) {
this - > selected = sel ;
this - > SetDirty ( ) ;
@ -183,8 +186,8 @@ struct AIListWindow : public Window {
virtual void OnResize ( )
{
NWidgetCore * nwi = this - > GetWidget < NWidgetCore > ( AIL_WIDGET_LIST ) ;
this - > vscroll . SetCapacity ( nwi - > current_y / this - > line_height ) ;
nwi - > widget_data = ( this - > vscroll . GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
this - > vscroll - > SetCapacity ( nwi - > current_y / this - > line_height ) ;
nwi - > widget_data = ( this - > vscroll - > GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
}
} ;
@ -246,6 +249,7 @@ struct AISettingsWindow : public Window {
int timeout ;
int clicked_row ;
int line_height ; // Height of a row in the matrix widget.
Scrollbar * vscroll ;
AISettingsWindow ( const WindowDesc * desc , CompanyID slot ) : Window ( ) ,
slot ( slot ) ,
@ -254,11 +258,13 @@ struct AISettingsWindow : public Window {
{
this - > ai_config = AIConfig : : GetConfig ( slot ) ;
this - > InitNested ( desc , slot ) ; // Initializes 'this->line_height' as side effect.
this - > CreateNestedTree ( desc ) ;
this - > vscroll = this - > GetScrollbar ( AIS_WIDGET_SCROLLBAR ) ;
this - > FinishInitNested ( desc , slot ) ; // Initializes 'this->line_height' as side effect.
this - > SetWidgetDisabledState ( AIS_WIDGET_RESET , _game_mode ! = GM_MENU ) ;
this - > vscroll . SetCount ( ( int ) this - > ai_config - > GetConfigList ( ) - > size ( ) ) ;
this - > vscroll - > SetCount ( ( int ) this - > ai_config - > GetConfigList ( ) - > size ( ) ) ;
}
virtual void UpdateWidgetSize ( int widget , Dimension * size , const Dimension & padding , Dimension * fill , Dimension * resize )
@ -284,7 +290,7 @@ struct AISettingsWindow : public Window {
AIConfig * config = this - > ai_config ;
AIConfigItemList : : const_iterator it = config - > GetConfigList ( ) - > begin ( ) ;
int i = 0 ;
for ( ; ! this - > vscroll . IsVisible ( i ) ; i + + ) it + + ;
for ( ; ! this - > vscroll - > IsVisible ( i ) ; i + + ) it + + ;
bool rtl = _dynlang . text_dir = = TD_RTL ;
uint buttons_left = rtl ? r . right - 23 : r . left + 4 ;
@ -295,7 +301,7 @@ struct AISettingsWindow : public Window {
int y = r . top ;
for ( ; this - > vscroll . IsVisible ( i ) & & it ! = config - > GetConfigList ( ) - > end ( ) ; i + + , it + + ) {
for ( ; this - > vscroll - > IsVisible ( i ) & & it ! = config - > GetConfigList ( ) - > end ( ) ; i + + , it + + ) {
int current_value = config - > GetSetting ( ( * it ) . name ) ;
bool editable = ( _game_mode = = GM_MENU ) | | ( ( it - > flags & AICONFIG_INGAME ) ! = 0 ) ;
@ -334,7 +340,7 @@ struct AISettingsWindow : public Window {
switch ( widget ) {
case AIS_WIDGET_BACKGROUND : {
const NWidgetBase * wid = this - > GetWidget < NWidgetBase > ( AIS_WIDGET_BACKGROUND ) ;
int num = ( pt . y - wid - > pos_y ) / this - > line_height + this - > vscroll . GetPosition ( ) ;
int num = ( pt . y - wid - > pos_y ) / this - > line_height + this - > vscroll - > GetPosition ( ) ;
if ( num > = ( int ) this - > ai_config - > GetConfigList ( ) - > size ( ) ) break ;
AIConfigItemList : : const_iterator it = this - > ai_config - > GetConfigList ( ) - > begin ( ) ;
@ -405,8 +411,8 @@ struct AISettingsWindow : public Window {
virtual void OnResize ( )
{
NWidgetCore * nwi = this - > GetWidget < NWidgetCore > ( AIS_WIDGET_BACKGROUND ) ;
this - > vscroll . SetCapacity ( nwi - > current_y / this - > line_height ) ;
nwi - > widget_data = ( this - > vscroll . GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
this - > vscroll - > SetCapacity ( nwi - > current_y / this - > line_height ) ;
nwi - > widget_data = ( this - > vscroll - > GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
}
virtual void OnTick ( )
@ -519,15 +525,17 @@ static const WindowDesc _ai_config_desc(
struct AIConfigWindow : public Window {
CompanyID selected_slot ; ///< The currently selected AI slot or \c INVALID_COMPANY.
int line_height ; ///< Height of a single AI-name line.
Scrollbar * vscroll ;
AIConfigWindow ( ) : Window ( )
{
this - > InitNested ( & _ai_config_desc ) ; // Initializes 'this->line_height' as a side effect.
this - > vscroll = this - > GetScrollbar ( AIC_WIDGET_SCROLLBAR ) ;
this - > selected_slot = INVALID_COMPANY ;
NWidgetCore * nwi = this - > GetWidget < NWidgetCore > ( AIC_WIDGET_LIST ) ;
this - > vscroll . SetCapacity ( nwi - > current_y / this - > line_height ) ;
this - > vscroll . SetCount ( MAX_COMPANIES ) ;
nwi - > widget_data = ( this - > vscroll . GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
this - > vscroll - > SetCapacity ( nwi - > current_y / this - > line_height ) ;
this - > vscroll - > SetCount ( MAX_COMPANIES ) ;
nwi - > widget_data = ( this - > vscroll - > GetCapacity ( ) < < MAT_ROW_START ) + ( 1 < < MAT_COL_START ) ;
this - > OnInvalidateData ( 0 ) ;
}
@ -566,7 +574,7 @@ struct AIConfigWindow : public Window {
switch ( widget ) {
case AIC_WIDGET_LIST : {
int y = r . top ;
for ( int i = this - > vscroll . GetPosition ( ) ; this - > vscroll . IsVisible ( i ) & & i < MAX_COMPANIES ; i + + ) {
for ( int i = this - > vscroll - > GetPosition ( ) ; this - > vscroll - > IsVisible ( i ) & & i < MAX_COMPANIES ; i + + ) {
StringID text ;
if ( AIConfig : : GetConfig ( ( CompanyID ) i ) - > GetInfo ( ) ! = NULL ) {
@ -603,7 +611,7 @@ struct AIConfigWindow : public Window {
}
case AIC_WIDGET_LIST : { // Select a slot
this - > selected_slot = ( CompanyID ) this - > vscroll . GetScrolledRowFromWidget ( pt . y , this , widget , 0 , this - > line_height ) ;
this - > selected_slot = ( CompanyID ) this - > vscroll - > GetScrolledRowFromWidget ( pt . y , this , widget , 0 , this - > line_height ) ;
this - > InvalidateData ( ) ;
if ( click_count > 1 & & this - > selected_slot ! = INVALID_COMPANY ) ShowAIListWindow ( ( CompanyID ) this - > selected_slot ) ;
break ;
@ -613,7 +621,7 @@ struct AIConfigWindow : public Window {
if ( this - > selected_slot > 1 ) {
Swap ( _settings_newgame . ai_config [ this - > selected_slot ] , _settings_newgame . ai_config [ this - > selected_slot - 1 ] ) ;
this - > selected_slot - - ;
this - > vscroll . ScrollTowards ( this - > selected_slot ) ;
this - > vscroll - > ScrollTowards ( this - > selected_slot ) ;
this - > InvalidateData ( ) ;
}
break ;
@ -622,7 +630,7 @@ struct AIConfigWindow : public Window {
if ( this - > selected_slot < _settings_newgame . difficulty . max_no_competitors ) {
Swap ( _settings_newgame . ai_config [ this - > selected_slot ] , _settings_newgame . ai_config [ this - > selected_slot + 1 ] ) ;
this - > selected_slot + + ;
this - > vscroll . ScrollTowards ( this - > selected_slot ) ;
this - > vscroll - > ScrollTowards ( this - > selected_slot ) ;
this - > InvalidateData ( ) ;
}
break ;
@ -708,10 +716,12 @@ struct AIDebugWindow : public QueryStringBaseWindow {
static char break_string [ MAX_BREAK_STR_STRING_LENGTH ] ; ///< The string to match to the AI output
static bool case_sensitive_break_check ; ///< Is the matching done case-sensitive
int highlight_row ; ///< The output row that matches the given string, or -1
Scrollbar * vscroll ;
AIDebugWindow ( const WindowDesc * desc , WindowNumber number ) : QueryStringBaseWindow ( MAX_BREAK_STR_STRING_LENGTH )
{
this - > CreateNestedTree ( desc ) ;
this - > vscroll = this - > GetScrollbar ( AID_WIDGET_SCROLLBAR ) ;
this - > show_break_box = _settings_client . gui . ai_developer_tools ;
this - > GetWidget < NWidgetStacked > ( AID_BREAK_STRING_WIDGETS ) - > SetDisplayedPlane ( this - > show_break_box ? 0 : SZSP_HORIZONTAL ) ;
this - > FinishInitNested ( desc , number ) ;
@ -824,8 +834,8 @@ struct AIDebugWindow : public QueryStringBaseWindow {
cur_company . Restore ( ) ;
int scroll_count = ( log = = NULL ) ? 0 : log - > used ;
if ( this - > vscroll . GetCount ( ) ! = scroll_count ) {
this - > vscroll . SetCount ( scroll_count ) ;
if ( this - > vscroll - > GetCount ( ) ! = scroll_count ) {
this - > vscroll - > SetCount ( scroll_count ) ;
/* We need a repaint */
this - > SetWidgetDirty ( AID_WIDGET_SCROLLBAR ) ;
@ -835,20 +845,20 @@ struct AIDebugWindow : public QueryStringBaseWindow {
/* Detect when the user scrolls the window. Enable autoscroll when the
* bottom - most line becomes visible . */
if ( this - > last_vscroll_pos ! = this - > vscroll . GetPosition ( ) ) {
this - > autoscroll = this - > vscroll . GetPosition ( ) > = log - > used - this - > vscroll . GetCapacity ( ) ;
if ( this - > last_vscroll_pos ! = this - > vscroll - > GetPosition ( ) ) {
this - > autoscroll = this - > vscroll - > GetPosition ( ) > = log - > used - this - > vscroll - > GetCapacity ( ) ;
}
if ( this - > autoscroll ) {
int scroll_pos = max ( 0 , log - > used - this - > vscroll . GetCapacity ( ) ) ;
if ( scroll_pos ! = this - > vscroll . GetPosition ( ) ) {
this - > vscroll . SetPosition ( scroll_pos ) ;
int scroll_pos = max ( 0 , log - > used - this - > vscroll - > GetCapacity ( ) ) ;
if ( scroll_pos ! = this - > vscroll - > GetPosition ( ) ) {
this - > vscroll - > SetPosition ( scroll_pos ) ;
/* We need a repaint */
this - > SetWidgetDirty ( AID_WIDGET_SCROLLBAR ) ;
this - > SetWidgetDirty ( AID_WIDGET_LOG_PANEL ) ;
}
}
this - > last_vscroll_pos = this - > vscroll . GetPosition ( ) ;
this - > last_vscroll_pos = this - > vscroll - > GetPosition ( ) ;
}
virtual void SetStringParameters ( int widget ) const
@ -880,7 +890,7 @@ struct AIDebugWindow : public QueryStringBaseWindow {
if ( log = = NULL ) return ;
int y = this - > top_offset ;
for ( int i = this - > vscroll . GetPosition ( ) ; this - > vscroll . IsVisible ( i ) & & i < log - > used ; i + + ) {
for ( int i = this - > vscroll - > GetPosition ( ) ; this - > vscroll - > IsVisible ( i ) & & i < log - > used ; i + + ) {
int pos = ( i + log - > pos + 1 - log - > used + log - > count ) % log - > count ;
if ( log - > lines [ pos ] = = NULL ) break ;
@ -916,11 +926,11 @@ struct AIDebugWindow : public QueryStringBaseWindow {
Backup < CompanyByte > cur_company ( _current_company , ai_debug_company , FILE_LINE ) ;
AILog : : LogData * log = ( AILog : : LogData * ) AIObject : : GetLogPointer ( ) ;
cur_company . Restore ( ) ;
this - > vscroll . SetCount ( ( log = = NULL ) ? 0 : log - > used ) ;
this - > vscroll - > SetCount ( ( log = = NULL ) ? 0 : log - > used ) ;
this - > LowerWidget ( ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START ) ;
this - > autoscroll = true ;
this - > last_vscroll_pos = this - > vscroll . GetPosition ( ) ;
this - > last_vscroll_pos = this - > vscroll - > GetPosition ( ) ;
this - > SetDirty ( ) ;
/* Close AI settings window to prevent confusion */
DeleteWindowByClass ( WC_AI_SETTINGS ) ;
@ -1034,7 +1044,7 @@ struct AIDebugWindow : public QueryStringBaseWindow {
virtual void OnResize ( )
{
this - > vscroll . SetCapacityFromWidget ( this , AID_WIDGET_LOG_PANEL ) ;
this - > vscroll - > SetCapacityFromWidget ( this , AID_WIDGET_LOG_PANEL ) ;
}
} ;