summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglx <glx@openttd.org>2020-01-07 03:08:26 +0100
committerCharles Pigott <charlespigott@googlemail.com>2020-01-07 14:21:35 +0000
commit5c10c426fe2a7722daa0d66dbaed2a0887f69891 (patch)
tree5f742f14b5e715652dfc614d86cc7001b2b6dd3a
parent150dfba95b9a6352b869804691aa6c07c83ef9df (diff)
downloadopenttd-5c10c426fe2a7722daa0d66dbaed2a0887f69891.tar.xz
Fix 196d5868: Always apply filter on town directory rebuild
-rw-r--r--src/town.h1
-rw-r--r--src/town_gui.cpp42
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();
}