Fix 196d5868: Always apply filter on town directory rebuild

This commit is contained in:
glx 2020-01-07 03:08:26 +01:00 committed by Charles Pigott
parent 150dfba95b
commit 5c10c426fe
2 changed files with 14 additions and 29 deletions

View File

@ -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,
};

View File

@ -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();
}