summaryrefslogtreecommitdiff
path: root/src/ai
diff options
context:
space:
mode:
Diffstat (limited to 'src/ai')
-rw-r--r--src/ai/ai_gui.cpp76
1 files changed, 43 insertions, 33 deletions
diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp
index 4938b7ece..fa65f1e26 100644
--- a/src/ai/ai_gui.cpp
+++ b/src/ai/ai_gui.cpp
@@ -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);
}
};