diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index f0ba3117dd..cdeaa9ea42 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -126,6 +126,9 @@ static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b) return _engine_sort_direction ? r > 0 : r < 0; } +/* cached values for EngineNameSorter to spare many GetString() calls */ +static EngineID _last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE }; + /** * Determines order of engines by name * @param a first engine to compare @@ -134,17 +137,16 @@ static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b) */ static bool EngineNameSorter(const EngineID &a, const EngineID &b) { - static EngineID last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE }; - static char last_name[2][64] = { "\0", "\0" }; + static char last_name[2][64] = { "", "" }; - if (a != last_engine[0]) { - last_engine[0] = a; + if (a != _last_engine[0]) { + _last_engine[0] = a; SetDParam(0, a); GetString(last_name[0], STR_ENGINE_NAME, lastof(last_name[0])); } - if (b != last_engine[1]) { - last_engine[1] = b; + if (b != _last_engine[1]) { + _last_engine[1] = b; SetDParam(0, b); GetString(last_name[1], STR_ENGINE_NAME, lastof(last_name[1])); } @@ -1302,6 +1304,9 @@ struct BuildVehicleWindow : Window { this->SelectEngine(sel_id); + /* invalidate cached values for name sorter - engine names could change */ + _last_engine[0] = _last_engine[1] = INVALID_ENGINE; + /* make engines first, and then wagons, sorted by selected sort_criteria */ _engine_sort_direction = false; EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter); diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 31b7366744..065e67a083 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -556,6 +556,9 @@ static const int LEVEL_WIDTH = 10; ///< Indenting width of a sub-group in pixels typedef GUIList GUIGroupList; +/* cached values for GroupNameSorter to spare many GetString() calls */ +static const Group *_last_group[2] = { nullptr, nullptr }; + /** Company livery colour scheme window. */ struct SelectCompanyLiveryWindow : public Window { private: @@ -621,17 +624,16 @@ private: static bool GroupNameSorter(const Group * const &a, const Group * const &b) { - static const Group *last_group[2] = { nullptr, nullptr }; static char last_name[2][64] = { "", "" }; - if (a != last_group[0]) { - last_group[0] = a; + if (a != _last_group[0]) { + _last_group[0] = a; SetDParam(0, a->index); GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0])); } - if (b != last_group[1]) { - last_group[1] = b; + if (b != _last_group[1]) { + _last_group[1] = b; SetDParam(0, b->index); GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1])); } @@ -669,6 +671,10 @@ private: } list.ForceResort(); + + /* invalidate cached values for name sorter - group names could change */ + _last_group[0] = _last_group[1] = nullptr; + list.Sort(&GroupNameSorter); AddChildren(&list, INVALID_GROUP, 0); diff --git a/src/group_gui.cpp b/src/group_gui.cpp index ee0113db93..396b7eca05 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -106,20 +106,22 @@ static const NWidgetPart _nested_group_widgets[] = { EndContainer(), }; +/* cached values for GroupNameSorter to spare many GetString() calls */ +static const Group *_last_group[2] = { nullptr, nullptr }; + /** Sort the groups by their name */ bool GroupNameSorter(const Group * const &a, const Group * const &b) { - static const Group *last_group[2] = { nullptr, nullptr }; static char last_name[2][64] = { "", "" }; - if (a != last_group[0]) { - last_group[0] = a; + if (a != _last_group[0]) { + _last_group[0] = a; SetDParam(0, a->index); GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0])); } - if (b != last_group[1]) { - last_group[1] = b; + if (b != _last_group[1]) { + _last_group[1] = b; SetDParam(0, b->index); GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1])); } @@ -207,6 +209,10 @@ private: this->SetWidgetDisabledState(WID_GL_COLLAPSE_ALL_GROUPS, !enable_collapse_all); list.ForceResort(); + + /* invalidate cached values for name sorter - group names could change */ + _last_group[0] = _last_group[1] = nullptr; + list.Sort(&GroupNameSorter); AddChildren(&list, INVALID_GROUP, 0);