diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -62,9 +62,9 @@ struct AIListWindow : public Window { this->InitNested(desc); // Initializes 'this->line_height' as side effect. - this->vscroll.SetCapacity(this->nested_array[AIL_WIDGET_LIST]->current_y / this->line_height); + this->vscroll.SetCapacity(this->GetWidget(AIL_WIDGET_LIST)->current_y / this->line_height); this->vscroll.SetCount((int)this->ai_info_list->size() + 1); - this->nested_array[AIL_WIDGET_LIST]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(AIL_WIDGET_LIST)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); /* Try if we can find the currently selected AI */ this->selected = -1; @@ -87,7 +87,7 @@ struct AIListWindow : public Window { resize->width = 1; resize->height = this->line_height; - size->height = GB(this->nested_array[widget]->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; + size->height = GB(this->GetWidget(widget)->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; } } @@ -101,7 +101,7 @@ struct AIListWindow : public Window { switch (widget) { case AIL_WIDGET_LIST: { /* Draw a list of all available AIs. */ - int y = this->nested_array[AIL_WIDGET_LIST]->pos_y; + int y = this->GetWidget(AIL_WIDGET_LIST)->pos_y; /* First AI in the list is hardcoded to random */ 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); @@ -160,7 +160,7 @@ struct AIListWindow : public Window { { switch (widget) { case AIL_WIDGET_LIST: { // Select one of the AIs - int sel = (pt.y - this->nested_array[AIL_WIDGET_LIST]->pos_y) / this->line_height + this->vscroll.GetPosition() - 1; + int sel = (pt.y - this->GetWidget(AIL_WIDGET_LIST)->pos_y) / this->line_height + this->vscroll.GetPosition() - 1; if (sel < (int)this->ai_info_list->size()) { this->selected = sel; this->SetDirty(); @@ -194,7 +194,7 @@ struct AIListWindow : public Window { { switch (widget) { case AIL_WIDGET_LIST: { - int sel = (pt.y - this->nested_array[AIL_WIDGET_LIST]->pos_y) / this->line_height + this->vscroll.GetPosition() - 1; + int sel = (pt.y - this->GetWidget(AIL_WIDGET_LIST)->pos_y) / this->line_height + this->vscroll.GetPosition() - 1; if (sel < (int)this->ai_info_list->size()) { this->selected = sel; this->ChangeAI(); @@ -208,7 +208,7 @@ struct AIListWindow : public Window { virtual void OnResize(Point delta) { this->vscroll.UpdateCapacity(delta.y / this->line_height); - this->nested_array[AIL_WIDGET_LIST]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(AIL_WIDGET_LIST)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); } }; @@ -279,9 +279,9 @@ struct AISettingsWindow : public Window this->InitNested(desc); // Initializes 'this->line_height' as side effect. - this->vscroll.SetCapacity(this->nested_array[AIS_WIDGET_BACKGROUND]->current_y / this->line_height); + this->vscroll.SetCapacity(this->GetWidget(AIS_WIDGET_BACKGROUND)->current_y / this->line_height); this->vscroll.SetCount((int)this->ai_config->GetConfigList()->size()); - this->nested_array[AIS_WIDGET_BACKGROUND]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(AIS_WIDGET_BACKGROUND)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); } virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize) @@ -291,7 +291,7 @@ struct AISettingsWindow : public Window resize->width = 1; resize->height = this->line_height; - size->height = GB(this->nested_array[widget]->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; + size->height = GB(this->GetWidget(widget)->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; } } @@ -335,7 +335,7 @@ struct AISettingsWindow : public Window { switch (widget) { case AIS_WIDGET_BACKGROUND: { - int num = (pt.y - this->nested_array[AIS_WIDGET_BACKGROUND]->pos_y) / this->line_height + this->vscroll.GetPosition(); + int num = (pt.y - this->GetWidget(AIS_WIDGET_BACKGROUND)->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(); @@ -404,7 +404,7 @@ struct AISettingsWindow : public Window virtual void OnResize(Point delta) { this->vscroll.UpdateCapacity(delta.y / this->line_height); - this->nested_array[AIS_WIDGET_BACKGROUND]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(AIS_WIDGET_BACKGROUND)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); } virtual void OnTick() @@ -505,9 +505,9 @@ struct AIConfigWindow : public Window { { this->InitNested(&_ai_config_desc); // Initializes 'this->line_height' as a side effect. this->selected_slot = INVALID_COMPANY; - this->vscroll.SetCapacity(this->nested_array[AIC_WIDGET_LIST]->current_y / this->line_height); + this->vscroll.SetCapacity(this->GetWidget(AIC_WIDGET_LIST)->current_y / this->line_height); this->vscroll.SetCount(MAX_COMPANIES); - this->nested_array[AIC_WIDGET_LIST]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(AIC_WIDGET_LIST)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); this->OnInvalidateData(0); } @@ -521,7 +521,7 @@ struct AIConfigWindow : public Window { { if (widget == AIC_WIDGET_LIST) { this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; - size->height = GB(this->nested_array[widget]->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; + size->height = GB(this->GetWidget(widget)->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; } } @@ -582,7 +582,7 @@ struct AIConfigWindow : public Window { } case AIC_WIDGET_LIST: { // Select a slot - uint slot = (pt.y - this->nested_array[widget]->pos_y) / this->line_height + this->vscroll.GetPosition(); + uint slot = (pt.y - this->GetWidget(widget)->pos_y) / this->line_height + this->vscroll.GetPosition(); if (slot == 0 || slot > _settings_newgame.difficulty.max_no_competitors) slot = INVALID_COMPANY; this->selected_slot = (CompanyID)slot; @@ -724,7 +724,7 @@ struct AIDebugWindow : public Window { /* Paint the company icons */ for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { /* Background is grey by default, will be changed to red for dead AIs */ - this->nested_array[i + AID_WIDGET_COMPANY_BUTTON_START]->colour = COLOUR_GREY; + this->GetWidget(i + AID_WIDGET_COMPANY_BUTTON_START)->colour = COLOUR_GREY; const Company *c = Company::GetIfValid(i); if (c == NULL || !c->is_ai) { @@ -741,7 +741,7 @@ struct AIDebugWindow : public Window { /* Mark dead AIs by red background */ if (c->ai_instance->IsDead()) { - this->nested_array[i + AID_WIDGET_COMPANY_BUTTON_START]->colour = COLOUR_RED; + this->GetWidget(i + AID_WIDGET_COMPANY_BUTTON_START)->colour = COLOUR_RED; } /* Check if we have the company marked as inactive */ @@ -754,7 +754,7 @@ struct AIDebugWindow : public Window { } byte offset = (i == ai_debug_company) ? 1 : 0; - DrawCompanyIcon(i, this->nested_array[AID_WIDGET_COMPANY_BUTTON_START + i]->pos_x + 11 + offset, this->nested_array[AID_WIDGET_COMPANY_BUTTON_START + i]->pos_y + 2 + offset); + DrawCompanyIcon(i, this->GetWidget(AID_WIDGET_COMPANY_BUTTON_START + i)->pos_x + 11 + offset, this->GetWidget(AID_WIDGET_COMPANY_BUTTON_START + i)->pos_y + 2 + offset); } CompanyID old_company = _current_company; diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -223,8 +223,8 @@ public: const AirportFTAClass *airport = GetAirport(_selected_airport_type); int rad = _settings_game.station.modified_catchment ? airport->catchment : (uint)CA_UNMODIFIED; - uint16 top = this->nested_array[BAW_BTN_DOHILIGHT]->pos_y + this->nested_array[BAW_BTN_DOHILIGHT]->current_y + WD_PAR_VSEP_NORMAL; - NWidgetCore *panel_nwi = this->nested_array[BAW_BOTTOMPANEL]; + uint16 top = this->GetWidget(BAW_BTN_DOHILIGHT)->pos_y + this->GetWidget(BAW_BTN_DOHILIGHT)->current_y + WD_PAR_VSEP_NORMAL; + NWidgetBase *panel_nwi = this->GetWidget(BAW_BOTTOMPANEL); int right = panel_nwi->pos_x + panel_nwi->current_x; int bottom = panel_nwi->pos_y + panel_nwi->current_y; /* only show the station (airport) noise, if the noise option is activated */ diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -118,7 +118,7 @@ private: this->bridges->Sort(); /* Display the current sort variant */ - this->nested_array[BBSW_DROPDOWN_CRITERIA]->widget_data = this->sorter_names[this->bridges->SortType()]; + this->GetWidget(BBSW_DROPDOWN_CRITERIA)->widget_data = this->sorter_names[this->bridges->SortType()]; /* Set the modified widgets dirty */ this->SetWidgetDirty(BBSW_DROPDOWN_CRITERIA); @@ -134,7 +134,7 @@ public: { this->CreateNestedTree(desc); /* Change the data, or the caption of the gui. Set it to road or rail, accordingly. */ - this->nested_array[BBSW_CAPTION]->widget_data = (GB(this->type, 15, 2) == TRANSPORT_ROAD) ? STR_SELECT_ROAD_BRIDGE_CAPTION : STR_SELECT_RAIL_BRIDGE_CAPTION; + this->GetWidget(BBSW_CAPTION)->widget_data = (GB(this->type, 15, 2) == TRANSPORT_ROAD) ? STR_SELECT_ROAD_BRIDGE_CAPTION : STR_SELECT_RAIL_BRIDGE_CAPTION; this->FinishInitNested(desc, GB(br_type, 15, 2)); // Initializes 'this->bridgetext_offset'. this->parent = FindWindowById(WC_BUILD_TOOLBAR, GB(this->type, 15, 2)); @@ -144,7 +144,7 @@ public: this->SortBridgeList(); this->vscroll.SetCount(bl->Length()); - this->vscroll.SetCapacity(this->nested_array[BBSW_BRIDGE_LIST]->current_y / this->resize.step_height); + this->vscroll.SetCapacity(this->GetWidget(BBSW_BRIDGE_LIST)->current_y / this->resize.step_height); if (this->last_size < this->vscroll.GetCapacity()) this->last_size = this->vscroll.GetCapacity(); if (this->last_size > this->vscroll.GetCount()) this->last_size = this->vscroll.GetCount(); /* Resize the bridge selection window if we used a bigger one the last time. */ @@ -152,7 +152,7 @@ public: ResizeWindow(this, 0, (this->last_size - this->vscroll.GetCapacity()) * this->resize.step_height); this->vscroll.SetCapacity(this->last_size); } - this->nested_array[BBSW_BRIDGE_LIST]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(BBSW_BRIDGE_LIST)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); } ~BuildBridgeWindow() @@ -171,7 +171,7 @@ public: { switch (widget) { case BBSW_DROPDOWN_ORDER: { - Dimension d = GetStringBoundingBox(this->nested_array[widget]->widget_data); + Dimension d = GetStringBoundingBox(this->GetWidget(widget)->widget_data); d.width += padding.width + WD_SORTBUTTON_ARROW_WIDTH * 2; // Doubled since the word is centered, also looks nice. d.height += padding.height; *size = maxdim(*size, d); @@ -253,7 +253,7 @@ public: switch (widget) { default: break; case BBSW_BRIDGE_LIST: { - uint i = ((int)pt.y - this->nested_array[BBSW_BRIDGE_LIST]->pos_y) / this->resize.step_height; + uint i = ((int)pt.y - this->GetWidget(BBSW_BRIDGE_LIST)->pos_y) / this->resize.step_height; if (i < this->vscroll.GetCapacity()) { i += this->vscroll.GetPosition(); if (i < this->bridges->Length()) { @@ -286,7 +286,7 @@ public: virtual void OnResize(Point delta) { this->vscroll.UpdateCapacity(delta.y / (int)this->resize.step_height); - this->nested_array[BBSW_BRIDGE_LIST]->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + this->GetWidget(BBSW_BRIDGE_LIST)->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); this->last_size = max(this->vscroll.GetCapacity(), this->last_size); } diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -370,8 +370,8 @@ public: } /* strings such as 'Size' and 'Coverage Area' */ - int top = this->nested_array[BDSW_LT_OFF]->pos_y + this->nested_array[BDSW_LT_OFF]->current_y + WD_PAR_VSEP_NORMAL; - NWidgetCore *back_nwi = this->nested_array[BDSW_BACKGROUND]; + int top = this->GetWidget(BDSW_LT_OFF)->pos_y + this->GetWidget(BDSW_LT_OFF)->current_y + WD_PAR_VSEP_NORMAL; + NWidgetBase *back_nwi = this->GetWidget(BDSW_BACKGROUND); int right = back_nwi->pos_x + back_nwi->current_x; int bottom = back_nwi->pos_y + back_nwi->current_y; top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL; @@ -463,10 +463,10 @@ public: { this->DrawWidgets(); - DrawShipDepotSprite(this->nested_array[BDDW_X]->pos_x + 64, this->nested_array[BDDW_X]->pos_y + 18, 0); - DrawShipDepotSprite(this->nested_array[BDDW_X]->pos_x + 32, this->nested_array[BDDW_X]->pos_y + 34, 1); - DrawShipDepotSprite(this->nested_array[BDDW_Y]->pos_x + 32, this->nested_array[BDDW_Y]->pos_y + 18, 2); - DrawShipDepotSprite(this->nested_array[BDDW_Y]->pos_x + 64, this->nested_array[BDDW_Y]->pos_y + 34, 3); + DrawShipDepotSprite(this->GetWidget(BDDW_X)->pos_x + 64, this->GetWidget(BDDW_X)->pos_y + 18, 0); + DrawShipDepotSprite(this->GetWidget(BDDW_X)->pos_x + 32, this->GetWidget(BDDW_X)->pos_y + 34, 1); + DrawShipDepotSprite(this->GetWidget(BDDW_Y)->pos_x + 32, this->GetWidget(BDDW_Y)->pos_y + 18, 2); + DrawShipDepotSprite(this->GetWidget(BDDW_Y)->pos_x + 64, this->GetWidget(BDDW_Y)->pos_y + 34, 3); } virtual void OnClick(Point pt, int widget) diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -934,7 +934,7 @@ public: this->BuildSortIndustriesList(); this->InitNested(desc, 0); - this->vscroll.SetCapacity(this->nested_array[IDW_INDUSTRY_LIST]->current_y / this->resize.step_height); + this->vscroll.SetCapacity(this->GetWidget(IDW_INDUSTRY_LIST)->current_y / this->resize.step_height); } ~IndustryDirectoryWindow() @@ -980,7 +980,7 @@ public: { switch (widget) { case IDW_DROPDOWN_ORDER: { - Dimension d = GetStringBoundingBox(this->nested_array[widget]->widget_data); + Dimension d = GetStringBoundingBox(this->GetWidget(widget)->widget_data); d.width += padding.width + WD_SORTBUTTON_ARROW_WIDTH * 2; // Doubled since the word is centered, also looks nice. d.height += padding.height; *size = maxdim(*size, d); @@ -1026,7 +1026,7 @@ public: break; case IDW_INDUSTRY_LIST: { - int y = (pt.y - this->nested_array[widget]->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; + int y = (pt.y - this->GetWidget(widget)->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; uint16 p; if (!IsInsideMM(y, 0, this->vscroll.GetCapacity())) return; diff --git a/src/main_gui.cpp b/src/main_gui.cpp --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -215,7 +215,7 @@ struct MainWindow : Window this->InitNested(&_main_window_desc, 0); ResizeWindow(this, _screen.width, _screen.height); - NWidgetViewport *nvp = (NWidgetViewport *)this->nested_array[MW_VIEWPORT]; + NWidgetViewport *nvp = this->GetWidget(MW_VIEWPORT); nvp->InitializeViewport(this, TileXY(32, 32), ZOOM_LVL_VIEWPORT); } @@ -386,7 +386,7 @@ struct MainWindow : Window virtual void OnResize(Point delta) { if (this->viewport != NULL) { - NWidgetViewport *nvp = (NWidgetViewport *)this->nested_array[MW_VIEWPORT]; + NWidgetViewport *nvp = this->GetWidget(MW_VIEWPORT); nvp->UpdateViewportCoordinates(this); } } diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -416,7 +416,7 @@ struct AboutWindow : public Window { this->InitNested(&_about_desc); this->counter = 5; - this->text_position = this->nested_array[AW_FRAME]->pos_y + this->nested_array[AW_FRAME]->current_y; + this->text_position = this->GetWidget(AW_FRAME)->pos_y + this->GetWidget(AW_FRAME)->current_y; } virtual void SetStringParameters(int widget) const @@ -468,8 +468,8 @@ struct AboutWindow : public Window { this->counter = 5; this->text_position--; /* If the last text has scrolled start a new from the start */ - if (this->text_position < (int)(this->nested_array[AW_FRAME]->pos_y - lengthof(_credits) * this->line_height)) { - this->text_position = this->nested_array[AW_FRAME]->pos_y + this->nested_array[AW_FRAME]->current_y; + if (this->text_position < (int)(this->GetWidget(AW_FRAME)->pos_y - lengthof(_credits) * this->line_height)) { + this->text_position = this->GetWidget(AW_FRAME)->pos_y + this->GetWidget(AW_FRAME)->current_y; } this->SetDirty(); } @@ -1188,7 +1188,7 @@ void QueryString::DrawEditBox(Window *w, int top; int bottom; if (w->widget == NULL) { - const NWidgetCore *wi = w->nested_array[wid]; + const NWidgetBase *wi = w->GetWidget(wid); assert((wi->type & WWT_MASK) == WWT_EDITBOX); diff --git a/src/music_gui.cpp b/src/music_gui.cpp --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -325,7 +325,7 @@ struct MusicTrackSelectionWindow : publi { switch (widget) { case MTSW_LIST_LEFT: { // add to playlist - int y = (pt.y - this->nested_array[widget]->pos_y) / FONT_HEIGHT_SMALL; + int y = (pt.y - this->GetWidget(widget)->pos_y) / FONT_HEIGHT_SMALL; if (msf.playlist < 4) return; if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return; @@ -343,7 +343,7 @@ struct MusicTrackSelectionWindow : publi } break; case MTSW_LIST_RIGHT: { // remove from playlist - int y = (pt.y - this->nested_array[widget]->pos_y) / FONT_HEIGHT_SMALL; + int y = (pt.y - this->GetWidget(widget)->pos_y) / FONT_HEIGHT_SMALL; if (msf.playlist < 4) return; if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return; @@ -583,11 +583,11 @@ struct MusicWindow : public Window { break; case MW_MUSIC_VOL: case MW_EFFECT_VOL: { // volume sliders - int x = pt.x - this->nested_array[widget]->pos_x; + int x = pt.x - this->GetWidget(widget)->pos_x; byte *vol = (widget == MW_MUSIC_VOL) ? &msf.music_vol : &msf.effect_vol; - byte new_vol = x * 127 / this->nested_array[widget]->current_x; + byte new_vol = x * 127 / this->GetWidget(widget)->current_x; if (new_vol != *vol) { *vol = new_vol; if (widget == MW_MUSIC_VOL) MusicVolumeChanged(new_vol); diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -180,7 +180,7 @@ public: /* When downloading is finished change cancel in ok */ if (this->downloaded_bytes == this->total_bytes) { - this->nested_array[NCDSWW_CANCELOK]->widget_data = STR_BUTTON_OK; + this->GetWidget(NCDSWW_CANCELOK)->widget_data = STR_BUTTON_OK; } this->SetDirty(); diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -265,7 +265,7 @@ public: this->BuildGrfList(); this->SetWidgetDisabledState(ANGRFW_ADD, this->sel == NULL || this->sel->IsOpenTTDBaseGRF()); - this->vscroll.SetCapacity((this->nested_array[ANGRFW_GRF_LIST]->current_y - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM) / this->resize.step_height); + this->vscroll.SetCapacity((this->GetWidget(ANGRFW_GRF_LIST)->current_y - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM) / this->resize.step_height); } virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize) @@ -335,7 +335,7 @@ public: switch (widget) { case ANGRFW_GRF_LIST: { /* Get row... */ - uint i = (pt.y - this->nested_array[ANGRFW_GRF_LIST]->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height + this->vscroll.GetPosition(); + uint i = (pt.y - this->GetWidget(ANGRFW_GRF_LIST)->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height + this->vscroll.GetPosition(); if (i < this->grfs.Length()) { this->sel = this->grfs[i]; diff --git a/src/news_gui.cpp b/src/news_gui.cpp --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -296,19 +296,19 @@ struct NewsWindow : Window { this->CreateNestedTree(desc); switch (this->ni->subtype) { case NS_COMPANY_TROUBLE: - this->nested_array[NTW_TITLE]->widget_data = STR_NEWS_COMPANY_IN_TROUBLE_TITLE; + this->GetWidget(NTW_TITLE)->widget_data = STR_NEWS_COMPANY_IN_TROUBLE_TITLE; break; case NS_COMPANY_MERGER: - this->nested_array[NTW_TITLE]->widget_data = STR_NEWS_COMPANY_MERGER_TITLE; + this->GetWidget(NTW_TITLE)->widget_data = STR_NEWS_COMPANY_MERGER_TITLE; break; case NS_COMPANY_BANKRUPT: - this->nested_array[NTW_TITLE]->widget_data = STR_NEWS_COMPANY_BANKRUPT_TITLE; + this->GetWidget(NTW_TITLE)->widget_data = STR_NEWS_COMPANY_BANKRUPT_TITLE; break; case NS_COMPANY_NEW: - this->nested_array[NTW_TITLE]->widget_data = STR_NEWS_COMPANY_LAUNCH_TITLE; + this->GetWidget(NTW_TITLE)->widget_data = STR_NEWS_COMPANY_LAUNCH_TITLE; break; default: @@ -317,7 +317,7 @@ struct NewsWindow : Window { this->FinishInitNested(desc, 0); /* Initialize viewport if it exists. */ - NWidgetViewport *nvp = (NWidgetViewport *)this->nested_array[NTW_VIEWPORT]; + NWidgetViewport *nvp = this->GetWidget(NTW_VIEWPORT); if (nvp != NULL) { nvp->InitializeViewport(this, ni->reftype1 == NR_VEHICLE ? 0x80000000 | ni->ref1 : GetReferenceTile(ni->reftype1, ni->ref1), ZOOM_LVL_NEWS); if (this->ni->flags & NF_NO_TRANSPARENT) nvp->disp_flags |= ND_NO_TRANSPARENCY; @@ -922,7 +922,7 @@ struct MessageHistoryWindow : Window { MessageHistoryWindow(const WindowDesc *desc) : Window() { this->InitNested(desc); // Initializes 'this->line_height' and 'this->date_width'. - this->vscroll.SetCapacity((this->nested_array[MHW_BACKGROUND]->current_y - this->top_spacing - this->bottom_spacing) / this->line_height); + this->vscroll.SetCapacity((this->GetWidget(MHW_BACKGROUND)->current_y - this->top_spacing - this->bottom_spacing) / this->line_height); this->OnInvalidateData(0); } @@ -984,7 +984,7 @@ struct MessageHistoryWindow : Window { NewsItem *ni = _latest_news; if (ni == NULL) return; - for (int n = (pt.y - this->nested_array[MHW_BACKGROUND]->pos_y - WD_FRAMERECT_TOP) / this->line_height + this->vscroll.GetPosition(); n > 0; n--) { + for (int n = (pt.y - this->GetWidget(MHW_BACKGROUND)->pos_y - WD_FRAMERECT_TOP) / this->line_height + this->vscroll.GetPosition(); n > 0; n--) { ni = ni->prev; if (ni == NULL) return; } @@ -1145,7 +1145,7 @@ struct MessageOptionsWindow : Window { virtual void OnInvalidateData(int data) { /* Update the dropdown value for 'set all categories'. */ - this->nested_array[WIDGET_NEWSOPT_DROP_SUMMARY]->widget_data = this->message_opt[this->state]; + this->GetWidget(WIDGET_NEWSOPT_DROP_SUMMARY)->widget_data = this->message_opt[this->state]; /* Update widget to reflect the value of the #_news_ticker_sound variable. */ this->SetWidgetLoweredState(WIDGET_NEWSOPT_SOUNDTICKER, _news_ticker_sound); diff --git a/src/osk_gui.cpp b/src/osk_gui.cpp --- a/src/osk_gui.cpp +++ b/src/osk_gui.cpp @@ -79,8 +79,9 @@ struct OskWindow : public Window { this->caption = (parent->widget[button].data != STR_NULL) ? parent->widget[button].data : parent->caption; } if (parent->nested_array != NULL) { - assert(parent->nested_array[button] != NULL); - this->caption = (parent->nested_array[button]->widget_data != STR_NULL) ? parent->nested_array[button]->widget_data : parent->caption; + NWidgetCore *par_wid = parent->GetWidget(button); + assert(par_wid != NULL); + this->caption = (par_wid->widget_data != STR_NULL) ? par_wid->widget_data : parent->caption; } this->qs = parent; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -643,15 +643,15 @@ struct BuildRailToolbarWindow : Window { const RailtypeInfo *rti = GetRailTypeInfo(railtype); assert(railtype < RAILTYPE_END); - this->nested_array[RTW_CAPTION]->widget_data = rti->strings.toolbar_caption; - this->nested_array[RTW_BUILD_NS]->widget_data = rti->gui_sprites.build_ns_rail; - this->nested_array[RTW_BUILD_X]->widget_data = rti->gui_sprites.build_x_rail; - this->nested_array[RTW_BUILD_EW]->widget_data = rti->gui_sprites.build_ew_rail; - this->nested_array[RTW_BUILD_Y]->widget_data = rti->gui_sprites.build_y_rail; - this->nested_array[RTW_AUTORAIL]->widget_data = rti->gui_sprites.auto_rail; - this->nested_array[RTW_BUILD_DEPOT]->widget_data = rti->gui_sprites.build_depot; - this->nested_array[RTW_CONVERT_RAIL]->widget_data = rti->gui_sprites.convert_rail; - this->nested_array[RTW_BUILD_TUNNEL]->widget_data = rti->gui_sprites.build_tunnel; + this->GetWidget(RTW_CAPTION)->widget_data = rti->strings.toolbar_caption; + this->GetWidget(RTW_BUILD_NS)->widget_data = rti->gui_sprites.build_ns_rail; + this->GetWidget(RTW_BUILD_X)->widget_data = rti->gui_sprites.build_x_rail; + this->GetWidget(RTW_BUILD_EW)->widget_data = rti->gui_sprites.build_ew_rail; + this->GetWidget(RTW_BUILD_Y)->widget_data = rti->gui_sprites.build_y_rail; + this->GetWidget(RTW_AUTORAIL)->widget_data = rti->gui_sprites.auto_rail; + this->GetWidget(RTW_BUILD_DEPOT)->widget_data = rti->gui_sprites.build_depot; + this->GetWidget(RTW_CONVERT_RAIL)->widget_data = rti->gui_sprites.convert_rail; + this->GetWidget(RTW_BUILD_TUNNEL)->widget_data = rti->gui_sprites.build_tunnel; } /** Switch to another rail type. @@ -1025,7 +1025,7 @@ public: _railstation.station_count = GetNumCustomStations(_railstation.station_class); this->vscroll.SetCount(_railstation.station_count); - this->vscroll.SetCapacity(GB(this->nested_array[BRSW_NEWST_LIST]->widget_data, MAT_ROW_START, MAT_ROW_BITS)); + this->vscroll.SetCapacity(GB(this->GetWidget(BRSW_NEWST_LIST)->widget_data, MAT_ROW_START, MAT_ROW_BITS)); this->vscroll.SetPosition(Clamp(_railstation.station_type - 2, 0, this->vscroll.GetCount() - this->vscroll.GetCapacity())); } else { /* New stations are not available, so ensure the default station @@ -1074,8 +1074,8 @@ public: this->DrawWidgets(); /* 'Accepts' and 'Supplies' texts. */ - int top = this->nested_array[BRSW_HIGHLIGHT_ON]->pos_y + this->nested_array[BRSW_HIGHLIGHT_ON]->current_y + WD_PAR_VSEP_NORMAL; - NWidgetCore *back_nwi = this->nested_array[BRSW_BACKGROUND]; + int top = this->GetWidget(BRSW_HIGHLIGHT_ON)->pos_y + this->GetWidget(BRSW_HIGHLIGHT_ON)->current_y + WD_PAR_VSEP_NORMAL; + NWidgetBase *back_nwi = this->GetWidget(BRSW_BACKGROUND); int right = back_nwi->pos_x + back_nwi->current_x; int bottom = back_nwi->pos_y + back_nwi->current_y; top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL; @@ -1113,7 +1113,7 @@ public: size->width = max(size->width, d.width + padding.width); this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; - size->height = GB(this->nested_array[widget]->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; + size->height = GB(this->GetWidget(widget)->widget_data, MAT_ROW_START, MAT_ROW_BITS) * this->line_height; break; } } @@ -1306,7 +1306,7 @@ public: case BRSW_NEWST_LIST: { const StationSpec *statspec; - int y = (pt.y - this->nested_array[BRSW_NEWST_LIST]->pos_y) / this->line_height; + int y = (pt.y - this->GetWidget(BRSW_NEWST_LIST)->pos_y) / this->line_height; if (y >= this->vscroll.GetCapacity()) return; y += this->vscroll.GetPosition(); @@ -1529,9 +1529,9 @@ private: */ void DrawSignalSprite(byte widget_index, SpriteID image, int8 xrel, uint8 xsize) { - int bottom = this->nested_array[widget_index]->pos_y + this->nested_array[widget_index]->current_y - 1; + int bottom = this->GetWidget(widget_index)->pos_y + this->GetWidget(widget_index)->current_y - 1; DrawSprite(image + this->IsWidgetLowered(widget_index), PAL_NONE, - this->nested_array[widget_index]->pos_x + this->nested_array[widget_index]->current_x / 2 - xrel - xsize / 2 + this->IsWidgetLowered(widget_index), + this->GetWidget(widget_index)->pos_x + this->GetWidget(widget_index)->current_x / 2 - xrel - xsize / 2 + this->IsWidgetLowered(widget_index), bottom - 3 + this->IsWidgetLowered(widget_index)); } @@ -1568,9 +1568,9 @@ public: /* Draw dragging signal density value in the BSW_DRAG_SIGNALS_DENSITY widget */ SetDParam(0, _settings_client.gui.drag_signals_density); - int right = this->nested_array[BSW_DRAG_SIGNALS_DENSITY]->pos_x + this->nested_array[BSW_DRAG_SIGNALS_DENSITY]->current_x - 1; - DrawString(this->nested_array[BSW_DRAG_SIGNALS_DENSITY]->pos_x, right, - this->nested_array[BSW_DRAG_SIGNALS_DENSITY]->pos_y + 2, STR_JUST_INT, TC_ORANGE, SA_CENTER); + int right = this->GetWidget(BSW_DRAG_SIGNALS_DENSITY)->pos_x + this->GetWidget(BSW_DRAG_SIGNALS_DENSITY)->current_x - 1; + DrawString(this->GetWidget(BSW_DRAG_SIGNALS_DENSITY)->pos_x, right, + this->GetWidget(BSW_DRAG_SIGNALS_DENSITY)->pos_y + 2, STR_JUST_INT, TC_ORANGE, SA_CENTER); } virtual void OnClick(Point pt, int widget) @@ -1791,8 +1791,8 @@ struct BuildRailWaypointWindow : PickerW if (this->hscroll.GetPosition() + i < this->hscroll.GetCount()) { const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, this->hscroll.GetPosition() + i); - int bottom = this->nested_array[BRWW_WAYPOINT_1 + i]->pos_y + this->nested_array[BRWW_WAYPOINT_1 + i]->current_y; - DrawWaypointSprite(this->nested_array[BRWW_WAYPOINT_1 + i]->pos_x + TILE_PIXELS, bottom - TILE_PIXELS, this->hscroll.GetPosition() + i, _cur_railtype); + int bottom = this->GetWidget(BRWW_WAYPOINT_1 + i)->pos_y + this->GetWidget(BRWW_WAYPOINT_1 + i)->current_y; + DrawWaypointSprite(this->GetWidget(BRWW_WAYPOINT_1 + i)->pos_x + TILE_PIXELS, bottom - TILE_PIXELS, this->hscroll.GetPosition() + i, _cur_railtype); if (statspec != NULL && HasBit(statspec->callback_mask, CBM_STATION_AVAIL) && diff --git a/src/road_gui.cpp b/src/road_gui.cpp --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -774,8 +774,8 @@ struct BuildRoadDepotWindow : public Pic this->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE); if ( _cur_roadtype == ROADTYPE_TRAM) { - this->nested_array[BRDW_CAPTION]->widget_data = STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION; - for (int i = BRDW_DEPOT_NE; i <= BRDW_DEPOT_NW; i++) this->nested_array[i]->tool_tip = STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP; + this->GetWidget(BRDW_CAPTION)->widget_data = STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION; + for (int i = BRDW_DEPOT_NE; i <= BRDW_DEPOT_NW; i++) this->GetWidget(i)->tool_tip = STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP; } this->FinishInitNested(desc, TRANSPORT_ROAD); @@ -887,8 +887,8 @@ struct BuildRoadStationWindow : public P BRSW_STATION_NW, WIDGET_LIST_END); - this->nested_array[BRSW_CAPTION]->widget_data = _road_type_infos[_cur_roadtype].picker_title[rs]; - for (uint i = BRSW_STATION_NE; i < BRSW_LT_OFF; i++) this->nested_array[i]->tool_tip = _road_type_infos[_cur_roadtype].picker_tooltip[rs]; + this->GetWidget(BRSW_CAPTION)->widget_data = _road_type_infos[_cur_roadtype].picker_title[rs]; + for (uint i = BRSW_STATION_NE; i < BRSW_LT_OFF; i++) this->GetWidget(i)->tool_tip = _road_type_infos[_cur_roadtype].picker_tooltip[rs]; this->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE); this->LowerWidget(_settings_client.gui.station_show_coverage + BRSW_LT_OFF); @@ -916,8 +916,8 @@ struct BuildRoadStationWindow : public P /* 'Accepts' and 'Supplies' texts. */ StationCoverageType sct = (this->window_class == WC_BUS_STATION) ? SCT_PASSENGERS_ONLY : SCT_NON_PASSENGERS_ONLY; - int top = this->nested_array[BRSW_LT_ON]->pos_y + this->nested_array[BRSW_LT_ON]->current_y + WD_PAR_VSEP_NORMAL; - NWidgetCore *back_nwi = this->nested_array[BRSW_BACKGROUND]; + int top = this->GetWidget(BRSW_LT_ON)->pos_y + this->GetWidget(BRSW_LT_ON)->current_y + WD_PAR_VSEP_NORMAL; + NWidgetBase *back_nwi = this->GetWidget(BRSW_BACKGROUND); int right = back_nwi->pos_x + back_nwi->current_x; int bottom = back_nwi->pos_y + back_nwi->current_y; top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, sct, rad, false) + WD_PAR_VSEP_NORMAL; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -426,7 +426,7 @@ struct GameOptionsWindow : Window { this->SetWidgetLoweredState(GOW_FULLSCREEN_BUTTON, _fullscreen); bool missing_files = BaseGraphics::GetUsedSet()->GetNumMissing() == 0; - this->nested_array[GOW_BASE_GRF_STATUS]->SetDataTip(missing_files ? STR_EMPTY : STR_GAME_OPTIONS_BASE_GRF_STATUS, STR_NULL); + this->GetWidget(GOW_BASE_GRF_STATUS)->SetDataTip(missing_files ? STR_EMPTY : STR_GAME_OPTIONS_BASE_GRF_STATUS, STR_NULL); } }; diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -95,7 +95,7 @@ struct SignListWindow : Window, SignList { this->InitNested(desc, window_number); - this->vscroll.SetCapacity((this->nested_array[SLW_LIST]->current_y - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM) / this->resize.step_height); + this->vscroll.SetCapacity((this->GetWidget(SLW_LIST)->current_y - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM) / this->resize.step_height); /* Create initial list. */ this->signs.ForceRebuild(); @@ -144,7 +144,7 @@ struct SignListWindow : Window, SignList virtual void OnClick(Point pt, int widget) { if (widget == SLW_LIST) { - uint id_v = (pt.y - this->nested_array[SLW_LIST]->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; + uint id_v = (pt.y - this->GetWidget(SLW_LIST)->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; if (id_v >= this->vscroll.GetCapacity()) return; id_v += this->vscroll.GetPosition(); diff --git a/src/subsidy_gui.cpp b/src/subsidy_gui.cpp --- a/src/subsidy_gui.cpp +++ b/src/subsidy_gui.cpp @@ -41,14 +41,14 @@ struct SubsidyListWindow : Window { { this->InitNested(desc, window_number); this->OnInvalidateData(0); - this->vscroll.SetCapacity(this->nested_array[SLW_PANEL]->current_y / this->resize.step_height); + this->vscroll.SetCapacity(this->GetWidget(SLW_PANEL)->current_y / this->resize.step_height); } virtual void OnClick(Point pt, int widget) { if (widget != SLW_PANEL) return; - int y = (pt.y - this->nested_array[SLW_PANEL]->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; + int y = (pt.y - this->GetWidget(SLW_PANEL)->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; if (!IsInsideMM(y, 0, this->vscroll.GetCapacity())) return; y += this->vscroll.GetPosition(); diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -657,7 +657,7 @@ struct ScenarioEditorLandscapeGeneration ScenarioEditorLandscapeGenerationWindow(const WindowDesc *desc, WindowNumber window_number) : Window() { this->InitNested(desc, window_number); - this->nested_array[ETTW_PLACE_DESERT_LIGHTHOUSE]->tool_tip = (_settings_game.game_creation.landscape == LT_TROPIC) ? STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA : STR_TERRAFORM_TOOLTIP_PLACE_LIGHTHOUSE; + this->GetWidget(ETTW_PLACE_DESERT_LIGHTHOUSE)->tool_tip = (_settings_game.game_creation.landscape == LT_TROPIC) ? STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA : STR_TERRAFORM_TOOLTIP_PLACE_LIGHTHOUSE; } virtual void OnPaint() { diff --git a/src/town_gui.cpp b/src/town_gui.cpp --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -271,12 +271,12 @@ public: this->CreateNestedTree(desc); this->town = Town::Get(window_number); - if (this->town->larger_town) this->nested_array[TVW_CAPTION]->widget_data = STR_TOWN_VIEW_CITY_CAPTION; + if (this->town->larger_town) this->GetWidget(TVW_CAPTION)->widget_data = STR_TOWN_VIEW_CITY_CAPTION; this->FinishInitNested(desc, window_number); this->flags4 |= WF_DISABLE_VP_SCROLL; - NWidgetViewport *nvp = (NWidgetViewport *)this->nested_array[TVW_VIEWPORT]; + NWidgetViewport *nvp = this->GetWidget(TVW_VIEWPORT); nvp->InitializeViewport(this, this->town->xy, ZOOM_LVL_NEWS); this->ResizeWindowAsNeeded(); @@ -422,7 +422,7 @@ public: if (_settings_game.economy.station_noise_level) aimed_height += FONT_HEIGHT_NORMAL; - NWidgetCore *nwid_info = this->nested_array[TVW_INFOPANEL]; + NWidgetBase *nwid_info = this->GetWidget(TVW_INFOPANEL); if (aimed_height > nwid_info->current_y || (aimed_height < nwid_info->current_y && nwid_info->current_y > nwid_info->smallest_y)) { ResizeWindow(this, 0, aimed_height - nwid_info->current_y); } @@ -431,7 +431,7 @@ public: virtual void OnResize(Point delta) { if (this->viewport != NULL) { - NWidgetViewport *nvp = (NWidgetViewport *)this->nested_array[TVW_VIEWPORT]; + NWidgetViewport *nvp = this->GetWidget(TVW_VIEWPORT); nvp->UpdateViewportCoordinates(this); } } @@ -621,7 +621,7 @@ public: this->BuildSortTownList(); this->InitNested(desc, 0); - this->vscroll.SetCapacity(this->nested_array[TDW_CENTERTOWN]->current_y / (int)this->resize.step_height); + this->vscroll.SetCapacity(this->GetWidget(TDW_CENTERTOWN)->current_y / (int)this->resize.step_height); } ~TownDirectoryWindow() @@ -679,7 +679,7 @@ public: switch (widget) { case TDW_SORTNAME: case TDW_SORTPOPULATION: { - Dimension d = GetStringBoundingBox(this->nested_array[widget]->widget_data); + Dimension d = GetStringBoundingBox(this->GetWidget(widget)->widget_data); d.width += padding.width + WD_SORTBUTTON_ARROW_WIDTH * 2; // Doubled since the word is centered, also looks nice. d.height += padding.height; *size = maxdim(*size, d); @@ -737,7 +737,7 @@ public: break; case TDW_CENTERTOWN: { // Click on Town Matrix - uint16 id_v = (pt.y - this->nested_array[widget]->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; + uint16 id_v = (pt.y - this->GetWidget(widget)->pos_y - WD_FRAMERECT_TOP) / this->resize.step_height; if (id_v >= this->vscroll.GetCapacity()) return; // click out of bounds diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -80,7 +80,7 @@ public: for (uint i = TTW_WIDGET_BEGIN; i < TTW_WIDGET_END; i++) { if (i == TTW_WIDGET_LOADING) continue; // Do not draw button for invisible loading indicators. - const NWidgetCore *wi = this->nested_array[i]; + const NWidgetBase *wi = this->GetWidget(i); DrawFrameRect(wi->pos_x + 1, r.top + 2, wi->pos_x + wi->current_x - 2, r.bottom - 2, COLOUR_PALE_GREEN, HasBit(_invisibility_opt, i - TTW_WIDGET_BEGIN) ? FR_LOWERED : FR_NONE); } @@ -104,7 +104,7 @@ public: } else if (widget == TTW_WIDGET_BUTTONS) { uint i; for (i = TTW_WIDGET_BEGIN; i < TTW_WIDGET_END; i++) { - const NWidgetCore *nwid = this->nested_array[i]; + const NWidgetBase *nwid = this->GetWidget(i); if (IsInsideBS(pt.x, nwid->pos_x, nwid->current_x)) break; } diff --git a/src/waypoint_gui.cpp b/src/waypoint_gui.cpp --- a/src/waypoint_gui.cpp +++ b/src/waypoint_gui.cpp @@ -52,14 +52,14 @@ public: this->CreateNestedTree(desc); if (this->vt == VEH_TRAIN) { - this->nested_array[WAYPVW_SHOW_VEHICLES]->SetDataTip(STR_TRAIN, STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP); - this->nested_array[WAYPVW_CENTERVIEW]->tool_tip = STR_WAYPOINT_VIEW_CENTER_TOOLTIP; - this->nested_array[WAYPVW_RENAME]->tool_tip = STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME; + this->GetWidget(WAYPVW_SHOW_VEHICLES)->SetDataTip(STR_TRAIN, STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP); + this->GetWidget(WAYPVW_CENTERVIEW)->tool_tip = STR_WAYPOINT_VIEW_CENTER_TOOLTIP; + this->GetWidget(WAYPVW_RENAME)->tool_tip = STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME; } this->FinishInitNested(desc, window_number); this->flags4 |= WF_DISABLE_VP_SCROLL; - NWidgetViewport *nvp = (NWidgetViewport *)this->nested_array[WAYPVW_VIEWPORT]; + NWidgetViewport *nvp = this->GetWidget(WAYPVW_VIEWPORT); nvp->InitializeViewport(this, this->wp->xy, ZOOM_LVL_MIN); this->OnInvalidateData(0); diff --git a/src/widget.cpp b/src/widget.cpp --- a/src/widget.cpp +++ b/src/widget.cpp @@ -834,8 +834,9 @@ void Window::DrawSortButtonState(int wid top = this->widget[widget].top; } else { assert(this->nested_array != NULL); - base = offset + this->nested_array[widget]->pos_x + (_dynlang.text_dir == TD_LTR ? this->nested_array[widget]->current_x - WD_SORTBUTTON_ARROW_WIDTH : 0); - top = this->nested_array[widget]->pos_y; + NWidgetBase *nwid = this->GetWidget(widget); + base = offset + nwid->pos_x + (_dynlang.text_dir == TD_LTR ? nwid->current_x - WD_SORTBUTTON_ARROW_WIDTH : 0); + top = nwid->pos_y; } DrawString(base, base + WD_SORTBUTTON_ARROW_WIDTH, top + 1 + offset, state == SBS_DOWN ? DOWNARROW : UPARROW, TC_BLACK, SA_CENTER); } @@ -937,7 +938,7 @@ NWidgetBase::NWidgetBase(WidgetType tp) */ /** - * @fn void FillNestedArray(NWidgetCore **array, uint length) + * @fn void FillNestedArray(NWidgetBase **array, uint length) * Fill the Window::nested_array array with pointers to nested widgets in the tree. * @param array Base pointer of the array. * @param length Length of the array. @@ -1104,7 +1105,7 @@ void NWidgetCore::SetDataTip(uint16 widg this->tool_tip = tool_tip; } -void NWidgetCore::FillNestedArray(NWidgetCore **array, uint length) +void NWidgetCore::FillNestedArray(NWidgetBase **array, uint length) { if (this->index >= 0 && (uint)(this->index) < length) array[this->index] = this; } @@ -1211,7 +1212,7 @@ void NWidgetContainer::Add(NWidgetBase * } } -void NWidgetContainer::FillNestedArray(NWidgetCore **array, uint length) +void NWidgetContainer::FillNestedArray(NWidgetBase **array, uint length) { for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) { child_wid->FillNestedArray(array, length); @@ -1640,7 +1641,7 @@ void NWidgetSpacer::SetupSmallestSize(Wi this->smallest_y = this->min_y; } -void NWidgetSpacer::FillNestedArray(NWidgetCore **array, uint length) +void NWidgetSpacer::FillNestedArray(NWidgetBase **array, uint length) { } @@ -1772,7 +1773,7 @@ void NWidgetBackground::StoreWidgets(Wid if (this->child != NULL) this->child->StoreWidgets(widgets, length, left_moving, top_moving, rtl); } -void NWidgetBackground::FillNestedArray(NWidgetCore **array, uint length) +void NWidgetBackground::FillNestedArray(NWidgetBase **array, uint length) { if (this->index >= 0 && (uint)(this->index) < length) array[this->index] = this; if (this->child != NULL) this->child->FillNestedArray(array, length); @@ -1832,7 +1833,7 @@ NWidgetCore *NWidgetBackground::GetWidge Scrollbar *NWidgetBackground::FindScrollbar(Window *w, bool allow_next) { if (this->index > 0 && allow_next && this->child == NULL && (uint)(this->index) + 1 < w->nested_array_size) { - NWidgetCore *next_wid = w->nested_array[this->index + 1]; + NWidgetCore *next_wid = w->GetWidget(this->index + 1); if (next_wid != NULL) return next_wid->FindScrollbar(w, false); } return NULL; @@ -2278,7 +2279,7 @@ Scrollbar *NWidgetLeaf::FindScrollbar(Wi if (this->type == WWT_SCROLL2BAR) return &w->vscroll2; if (this->index > 0 && allow_next && (uint)(this->index) + 1 < w->nested_array_size) { - NWidgetCore *next_wid = w->nested_array[this->index + 1]; + NWidgetCore *next_wid = w->GetWidget(this->index + 1); if (next_wid != NULL) return next_wid->FindScrollbar(w, false); } return NULL; diff --git a/src/widget_type.h b/src/widget_type.h --- a/src/widget_type.h +++ b/src/widget_type.h @@ -185,7 +185,7 @@ public: virtual void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl) = 0; virtual void StoreWidgets(Widget *widgets, int length, bool left_moving, bool top_moving, bool rtl) = 0; - virtual void FillNestedArray(NWidgetCore **array, uint length) = 0; + virtual void FillNestedArray(NWidgetBase **array, uint length) = 0; virtual NWidgetCore *GetWidgetFromPos(int x, int y) = 0; virtual NWidgetBase *GetWidgetOfType(WidgetType tp); @@ -307,7 +307,7 @@ public: inline bool IsDisabled(); void StoreWidgets(Widget *widgets, int length, bool left_moving, bool top_moving, bool rtl); - /* virtual */ void FillNestedArray(NWidgetCore **array, uint length); + /* virtual */ void FillNestedArray(NWidgetBase **array, uint length); /* virtual */ NWidgetCore *GetWidgetFromPos(int x, int y); virtual Scrollbar *FindScrollbar(Window *w, bool allow_next = true) = 0; @@ -358,7 +358,7 @@ public: ~NWidgetContainer(); void Add(NWidgetBase *wid); - /* virtual */ void FillNestedArray(NWidgetCore **array, uint length); + /* virtual */ void FillNestedArray(NWidgetBase **array, uint length); /** Return whether the container is empty. */ inline bool IsEmpty() { return head == NULL; }; @@ -455,7 +455,7 @@ public: void SetupSmallestSize(Window *w, bool init_array); void StoreWidgets(Widget *widgets, int length, bool left_moving, bool top_moving, bool rtl); - /* virtual */ void FillNestedArray(NWidgetCore **array, uint length); + /* virtual */ void FillNestedArray(NWidgetBase **array, uint length); /* virtual */ void Draw(const Window *w); /* virtual */ void SetDirty(const Window *w) const; @@ -476,7 +476,7 @@ public: void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl); void StoreWidgets(Widget *widgets, int length, bool left_moving, bool top_moving, bool rtl); - /* virtual */ void FillNestedArray(NWidgetCore **array, uint length); + /* virtual */ void FillNestedArray(NWidgetBase **array, uint length); /* virtual */ void Draw(const Window *w); /* virtual */ NWidgetCore *GetWidgetFromPos(int x, int y); diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -259,7 +259,7 @@ void ShowDropDownList(Window *w, DropDow Rect wi_rect; Colours wi_colour; if (w->nested_array != NULL) { - const NWidgetCore *nwi = w->nested_array[button]; + const NWidgetCore *nwi = w->GetWidget(button); wi_rect.left = nwi->pos_x; wi_rect.right = nwi->pos_x + nwi->current_x - 1; wi_rect.top = nwi->pos_y; diff --git a/src/window.cpp b/src/window.cpp --- a/src/window.cpp +++ b/src/window.cpp @@ -164,12 +164,12 @@ bool Window::SetFocusedWidget(byte widge assert(this->nested_array[widget_index] != NULL); // Setting focus to a non-existing widget is a bad idea. if (this->nested_focus != NULL) { - if (this->nested_array[widget_index] == this->nested_focus) return false; + if (this->GetWidget(widget_index) == this->nested_focus) return false; /* Repaint the widget that lost focus. A focused edit box may else leave the caret on the screen. */ this->nested_focus->SetDirty(this); } - this->nested_focus = this->nested_array[widget_index]; + this->nested_focus = this->GetWidget(widget_index); return true; } NOT_REACHED(); @@ -486,7 +486,7 @@ static void DispatchMouseWheelEvent(Wind } } - if (w->nested_array != NULL && (uint)widget < w->nested_array_size) sb = w->nested_array[widget]->FindScrollbar(w); + if (w->nested_array != NULL && (uint)widget < w->nested_array_size) sb = w->GetWidget(widget)->FindScrollbar(w); if (sb != NULL && sb->GetCount() > sb->GetCapacity()) { sb->UpdatePosition(wheel); @@ -912,7 +912,7 @@ void Window::InitializeData(WindowClass /* If available, initialize nested widget tree. */ if (widget == NULL) { if (this->nested_array == NULL) { - this->nested_array = CallocT(this->nested_array_size); + this->nested_array = CallocT(this->nested_array_size); this->nested_root->SetupSmallestSize(this, true); } else { this->nested_root->SetupSmallestSize(this, false); @@ -1339,7 +1339,7 @@ void Window::CreateNestedTree(const Wind this->nested_array_size = (uint)(biggest_index + 1); if (fill_nested) { - this->nested_array = CallocT(this->nested_array_size); + this->nested_array = CallocT(this->nested_array_size); this->nested_root->FillNestedArray(this->nested_array, this->nested_array_size); } } diff --git a/src/window_gui.h b/src/window_gui.h --- a/src/window_gui.h +++ b/src/window_gui.h @@ -391,13 +391,17 @@ public: const Widget *focused_widget; ///< Currently focused widget, or \c NULL if no widget has focus. const NWidgetCore *nested_focus; ///< Currently focused nested widget, or \c NULL if no nested widget has focus. NWidgetBase *nested_root; ///< Root of the nested tree. - NWidgetCore **nested_array; ///< Array of pointers into the tree. + NWidgetBase **nested_array; ///< Array of pointers into the tree. Do not access directly, use #Window::GetWidget() instead. uint nested_array_size; ///< Size of the nested array. Window *parent; ///< Parent window. Window *z_front; ///< The window in front of us in z-order. Window *z_back; ///< The window behind us in z-order. + template + inline NWID *GetWidget(uint widnum) const; + + void InitNested(const WindowDesc *desc, WindowNumber number = 0); void CreateNestedTree(const WindowDesc *desc, bool fill_nested = true); void FinishInitNested(const WindowDesc *desc, WindowNumber window_number); @@ -417,7 +421,7 @@ public: } if (this->nested_array != NULL) { assert(widget_index < this->nested_array_size); - if (this->nested_array[widget_index] != NULL) this->nested_array[widget_index]->SetDisabled(disab_stat); + if (this->nested_array[widget_index] != NULL) this->GetWidget(widget_index)->SetDisabled(disab_stat); } } @@ -448,7 +452,7 @@ public: { if (this->nested_array != NULL) { assert(widget_index < this->nested_array_size); - return this->nested_array[widget_index]->IsDisabled(); + return this->GetWidget(widget_index)->IsDisabled(); } assert(widget_index < this->widget_count); return HasBit(this->widget[widget_index].display_flags, WIDG_DISABLED); @@ -531,7 +535,7 @@ public: } if (this->nested_array != NULL) { assert(widget_index < this->nested_array_size); - this->nested_array[widget_index]->SetLowered(lowered_stat); + this->GetWidget(widget_index)->SetLowered(lowered_stat); } } @@ -547,8 +551,8 @@ public: } if (this->nested_array != NULL) { assert(widget_index < this->nested_array_size); - bool lowered_state = this->nested_array[widget_index]->IsLowered(); - this->nested_array[widget_index]->SetLowered(!lowered_state); + bool lowered_state = this->GetWidget(widget_index)->IsLowered(); + this->GetWidget(widget_index)->SetLowered(!lowered_state); } } @@ -579,7 +583,7 @@ public: { if (this->nested_array != NULL) { assert(widget_index < this->nested_array_size); - return this->nested_array[widget_index]->IsLowered(); + return this->GetWidget(widget_index)->IsLowered(); } assert(widget_index < this->widget_count); return HasBit(this->widget[widget_index].display_flags, WIDG_LOWERED); @@ -838,6 +842,29 @@ public: /*** End of the event handling ***/ }; +/** Get the nested widget with number \a widnum from the nested widget tree. + * @tparam NWID Type of the nested widget. + * @param widnum Widget number of the widget to retrieve. + * @return The requested widget if it is instantiated, \c NULL otherwise. + */ +template +inline NWID *Window::GetWidget(uint widnum) const +{ + if (widnum >= this->nested_array_size || this->nested_array[widnum] == NULL) return NULL; + NWID *nwid = dynamic_cast(this->nested_array[widnum]); + assert(nwid != NULL); + return nwid; +} + +/** Specialized case of #Window::GetWidget for the nested widget base class. */ +template <> +inline NWidgetBase *Window::GetWidget(uint widnum) const +{ + if (widnum >= this->nested_array_size) return NULL; + return this->nested_array[widnum]; +} + + /** * Base class for windows opened from a toolbar. */