summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-07-05 13:20:05 +0000
committersmatz <smatz@openttd.org>2009-07-05 13:20:05 +0000
commitc861d9b64b2a63fa86ea87ac1e71f8f7341c694b (patch)
treef3aa246db5e1a5db2728facf1e79d65abe0dc75b
parent4c6a4e3ab2fb4ebc6a5770c4373b68ff3ffa1d04 (diff)
downloadopenttd-c861d9b64b2a63fa86ea87ac1e71f8f7341c694b.tar.xz
(svn r16745) -Fix [FS#3011]: invalidate JoinStation window after removing item from the pool
-rw-r--r--src/core/pool_func.hpp1
-rw-r--r--src/core/pool_type.hpp9
-rw-r--r--src/station.cpp12
-rw-r--r--src/station_base.h2
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)