diff options
author | glx <glx@openttd.org> | 2020-01-07 03:08:26 +0100 |
---|---|---|
committer | Charles Pigott <charlespigott@googlemail.com> | 2020-01-07 14:21:35 +0000 |
commit | 5c10c426fe2a7722daa0d66dbaed2a0887f69891 (patch) | |
tree | 5f742f14b5e715652dfc614d86cc7001b2b6dd3a /src | |
parent | 150dfba95b9a6352b869804691aa6c07c83ef9df (diff) | |
download | openttd-5c10c426fe2a7722daa0d66dbaed2a0887f69891.tar.xz |
Fix 196d5868: Always apply filter on town directory rebuild
Diffstat (limited to 'src')
-rw-r--r-- | src/town.h | 1 | ||||
-rw-r--r-- | src/town_gui.cpp | 42 |
2 files changed, 14 insertions, 29 deletions
diff --git a/src/town.h b/src/town.h index 1f04cf155..7e7bcd29e 100644 --- a/src/town.h +++ b/src/town.h @@ -161,7 +161,6 @@ enum TownRatingCheckType { /** Special values for town list window for the data parameter of #InvalidateWindowData. */ enum TownDirectoryInvalidateWindowData { TDIWD_FORCE_REBUILD, - TDIWD_FILTER_CHANGES, ///< The filename filter has changed (via the editbox) TDIWD_FORCE_RESORT, }; diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 632080379..def5f7458 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -687,10 +687,22 @@ private: void BuildSortTownList() { if (this->towns.NeedRebuild()) { + char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; + this->towns.clear(); for (const Town *t : Town::Iterate()) { - this->towns.push_back(t); + if (this->string_filter.IsEmpty()) { + this->towns.push_back(t); + continue; + } + this->string_filter.ResetState(); + + SetDParam(0, t->index); + GetString(buf, STR_TOWN_NAME, lastof(buf)); + + this->string_filter.AddLine(buf); + if (this->string_filter.GetState()) this->towns.push_back(t); } this->towns.shrink_to_fit(); @@ -965,7 +977,7 @@ public: { if (wid == WID_TD_FILTER) { this->string_filter.SetFilterTerm(this->townname_editbox.text.buf); - this->InvalidateData(TDIWD_FILTER_CHANGES); + this->InvalidateData(TDIWD_FORCE_REBUILD); } } @@ -976,38 +988,12 @@ public: */ void OnInvalidateData(int data = 0, bool gui_scope = true) override { - char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; - switch (data) { case TDIWD_FORCE_REBUILD: /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */ this->towns.ForceRebuild(); break; - case TDIWD_FILTER_CHANGES: - if (this->string_filter.IsEmpty()) { - this->towns.ForceRebuild(); - } else { - this->towns.clear(); - - for (const Town *t : Town::Iterate()) { - this->string_filter.ResetState(); - - SetDParam(0, t->index); - GetString(buf, STR_TOWN_NAME, lastof(buf)); - - this->string_filter.AddLine(buf); - if (this->string_filter.GetState()) this->towns.push_back(t); - } - - this->towns.SetListing(this->last_sorting); - this->towns.ForceResort(); - this->towns.Sort(); - this->towns.shrink_to_fit(); - this->towns.RebuildDone(); - this->vscroll->SetCount((int)this->towns.size()); // Update scrollbar as well. - } - break; default: this->towns.ForceResort(); } |