# HG changeset patch # User glx # Date 2020-01-07 02:08:26 # Node ID 126800e6b518574a81a89ed04d1e486c28694fb7 # Parent 22cb1475e70aed5db36f5a065901488e03d4a36d Fix 196d5868: Always apply filter on town directory rebuild diff --git a/src/town.h b/src/town.h --- 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 --- 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(); }