diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index fa0401e7dc..23ec1ceacd 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -103,14 +103,60 @@ class BuildIndustryWindow : public Window { StringID text[NUM_INDUSTRYTYPES + 1]; ///< Text coming from CBM_IND_FUND_MORE_TEXT (if ever) bool enabled[NUM_INDUSTRYTYPES + 1]; ///< availability state, coming from CBID_INDUSTRY_AVAILABLE (if ever) -public: - BuildIndustryWindow() : Window(&_build_industry_desc) + void SetupArrays() { IndustryType ind; const IndustrySpec *indsp; + this->count = 0; + + for (uint i = 0; i < lengthof(this->index); i++) { + this->index[i] = INVALID_INDUSTRYTYPE; + this->text[i] = STR_NULL; + this->enabled[i] = false; + } + + if (_game_mode == GM_EDITOR) { // give room for the Many Random "button" + this->index[this->count] = INVALID_INDUSTRYTYPE; + this->count++; + this->timer_enabled = false; + } + /* Fill the arrays with industries. + * The tests performed after the enabled allow to load the industries + * In the same way they are inserted by grf (if any) + */ + for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) { + indsp = GetIndustrySpec(ind); + if (indsp->enabled){ + /* Rule is that editor mode loads all industries. + * In game mode, all non raw industries are loaded too + * and raw ones are loaded only when setting allows it */ + if (_game_mode != GM_EDITOR && indsp->IsRawIndustry() && _patches.raw_industry_construction == 0) { + /* Unselect if the industry is no longer in the list */ + if (this->selected_type == ind) this->selected_index = -1; + continue; + } + this->index[this->count] = ind; + this->enabled[this->count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION); + /* Keep the selection to the correct line */ + if (this->selected_type == ind) this->selected_index = this->count; + this->count++; + } + } + + /* first indutry type is selected if the current selection is invalid. + * I'll be damned if there are none available ;) */ + if (this->selected_index == -1) { + this->selected_index = 0; + this->selected_type = this->index[0]; + } + } + +public: + BuildIndustryWindow() : Window(&_build_industry_desc) + { /* Shorten the window to the equivalant of the additionnal purchase - * info coming from the callback. SO it will only be available to tis full + * info coming from the callback. SO it will only be available to its full * height when newindistries are loaded */ if (!_loaded_newgrf_features.has_newindustries) { this->widget[DPIW_INFOPANEL].bottom -= 44; @@ -123,45 +169,15 @@ public: this->timer_enabled = _loaded_newgrf_features.has_newindustries; - /* Initialize structures */ - this->count = 0; - - for (uint i = 0; i < lengthof(this->index); i++) { - this->index[i] = 0xFF; - this->text[i] = STR_NULL; - this->enabled[i] = false; - } - this->vscroll.cap = 8; // rows in grid, same in scroller this->resize.step_height = 13; - if (_game_mode == GM_EDITOR) { // give room for the Many Random "button" - this->index[this->count] = INVALID_INDUSTRYTYPE; - this->count++; - this->timer_enabled = false; - } + this->selected_index = -1; + this->selected_type = INVALID_INDUSTRYTYPE; - /* Fill the _fund_gui structure with industries. - * The tests performed after the enabled allow to load the industries - * In the same way they are inserted by grf (if any) - */ - for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) { - indsp = GetIndustrySpec(ind); - if (indsp->enabled){ - /* Rule is that editor mode loads all industries. - * In game mode, all non raw industries are loaded too - * and raw ones are loaded only when setting allows it */ - if (_game_mode != GM_EDITOR && indsp->IsRawIndustry() && _patches.raw_industry_construction == 0) continue; - this->index[this->count] = ind; - this->enabled[this->count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION); - this->count++; - } - } + /* Initialize arrays */ + this->SetupArrays(); - /* first indutry type is selected. - * I'll be damned if there are none available ;) */ - this->selected_index = 0; - this->selected_type = this->index[0]; this->callback_timer = DAY_TICKS; this->FindWindowPlacementAndResize(&_build_industry_desc); @@ -392,6 +408,12 @@ public: { this->RaiseButtons(); } + + virtual void OnInvalidateData(int data = 0) + { + this->SetupArrays(); + this->SetDirty(); + } }; void ShowBuildIndustryWindow() diff --git a/src/settings.cpp b/src/settings.cpp index a50fe2928f..9a9d6e3220 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1147,6 +1147,12 @@ static int32 InvalidateStationBuildWindow(int32 p1) return 0; } +static int32 InvalidateBuildIndustryWindow(int32 p1) +{ + InvalidateWindowData(WC_BUILD_INDUSTRY, 0); + return 0; +} + static int32 CloseSignalGUI(int32 p1) { if (p1 == 0) { @@ -1488,7 +1494,7 @@ const SettingDesc _patch_settings[] = { /***************************************************************************/ /* Economy section of the GUI-configure patches window */ SDT_BOOL(Patches, inflation, 0, 0, true, STR_CONFIG_PATCHES_INFLATION, NULL), - SDT_VAR(Patches, raw_industry_construction,SLE_UINT8,0,MS,0,0, 2, 0, STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD, NULL), + SDT_VAR(Patches, raw_industry_construction,SLE_UINT8,0,MS,0,0, 2, 0, STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD, InvalidateBuildIndustryWindow), SDT_BOOL(Patches, multiple_industry_per_town, 0, 0, false, STR_CONFIG_PATCHES_MULTIPINDTOWN, NULL), SDT_BOOL(Patches, same_industry_close, 0, 0, false, STR_CONFIG_PATCHES_SAMEINDCLOSE, NULL), SDT_BOOL(Patches, bribe, 0, 0, true, STR_CONFIG_PATCHES_BRIBE, NULL),