diff options
author | smatz <smatz@openttd.org> | 2009-07-05 13:20:05 +0000 |
---|---|---|
committer | smatz <smatz@openttd.org> | 2009-07-05 13:20:05 +0000 |
commit | c861d9b64b2a63fa86ea87ac1e71f8f7341c694b (patch) | |
tree | f3aa246db5e1a5db2728facf1e79d65abe0dc75b /src | |
parent | 4c6a4e3ab2fb4ebc6a5770c4373b68ff3ffa1d04 (diff) | |
download | openttd-c861d9b64b2a63fa86ea87ac1e71f8f7341c694b.tar.xz |
(svn r16745) -Fix [FS#3011]: invalidate JoinStation window after removing item from the pool
Diffstat (limited to 'src')
-rw-r--r-- | src/core/pool_func.hpp | 1 | ||||
-rw-r--r-- | src/core/pool_type.hpp | 9 | ||||
-rw-r--r-- | src/station.cpp | 12 | ||||
-rw-r--r-- | src/station_base.h | 2 |
4 files changed, 22 insertions, 2 deletions
diff --git a/src/core/pool_func.hpp b/src/core/pool_func.hpp index 3ac28f472..1687b4faf 100644 --- a/src/core/pool_func.hpp +++ b/src/core/pool_func.hpp @@ -108,6 +108,7 @@ DEFINE_POOL_METHOD(void)::FreeItem(size_t index) this->data[index] = NULL; this->first_free = min(this->first_free, index); this->items--; + if (!this->cleaning) Titem::PostDestructor(index); } DEFINE_POOL_METHOD(void)::CleanPool() diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index 2d32df724..2f35b4a88 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -221,6 +221,15 @@ struct Pool { { return Tpool->items; } + + /** + * Dummy function called after destructor of each member. + * If you want to use it, override it in PoolItem's subclass. + * @param index index of deleted item + * @note when this function is called, PoolItem::Get(index) == NULL. + * @note it's called only when !CleaningPool() + */ + static FORCEINLINE void PostDestructor(size_t index) { } }; private: diff --git a/src/station.cpp b/src/station.cpp index 4db8c7c0f..32166493f 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -94,8 +94,6 @@ Station::~Station() /* Remove all news items */ DeleteStationNews(this->index); - InvalidateWindowData(WC_SELECT_STATION, 0, 0); - for (CargoID c = 0; c < NUM_CARGO; c++) { goods[c].cargo.Truncate(0); } @@ -109,6 +107,16 @@ Station::~Station() /** + * Invalidating of the JoinStation window has to be done + * after removing item from the pool. + * @param index index of deleted item + */ +void Station::PostDestructor(size_t index) +{ + InvalidateWindowData(WC_SELECT_STATION, 0, 0); +} + +/** * Get the primary road stop (the first road stop) that the given vehicle can load/unload. * @param v the vehicle to get the first road stop for * @return the first roadstop that this vehicle can load at diff --git a/src/station_base.h b/src/station_base.h index b91fb499e..deb01bfc6 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -186,6 +186,8 @@ public: { return Station::Get(GetStationIndex(tile)); } + + static void PostDestructor(size_t index); }; #define FOR_ALL_STATIONS_FROM(var, start) FOR_ALL_ITEMS_FROM(Station, station_index, var, start) |