(svn r9337) -Fix [FS#542]: assert() when you removed the orders of a shared list while having the shared order vehicle list open.
authortruelight
Mon, 19 Mar 2007 15:36:18 +0000
changeset 6662 7ad747545522
parent 6661 88ab202d7dfa
child 6663 d09762058039
(svn r9337) -Fix [FS#542]: assert() when you removed the orders of a shared list while having the shared order vehicle list open.
src/order_cmd.cpp
--- a/src/order_cmd.cpp	Mon Mar 19 12:58:43 2007 +0000
+++ b/src/order_cmd.cpp	Mon Mar 19 15:36:18 2007 +0000
@@ -455,6 +455,24 @@
 	return 0;
 }
 
+/**
+ * Remove the VehicleList that shows all the vehicles with the same shared
+ *  orders.
+ */
+static void RemoveSharedOrderVehicleList(Vehicle *v)
+{
+	WindowClass window_class = WC_NONE;
+
+	switch (v->type) {
+		default: NOT_REACHED();
+		case VEH_TRAIN:    window_class = WC_TRAINS_LIST;   break;
+		case VEH_ROAD:     window_class = WC_ROADVEH_LIST;  break;
+		case VEH_SHIP:     window_class = WC_SHIPS_LIST;    break;
+		case VEH_AIRCRAFT: window_class = WC_AIRCRAFT_LIST; break;
+	}
+	DeleteWindowById(window_class, (v->orders->index << 16) | (v->type << 11) | VLW_SHARED_ORDERS | v->owner);
+}
+
 /** Delete an order from the orderlist of a vehicle.
  * @param tile unused
  * @param p1 the ID of the vehicle
@@ -489,6 +507,10 @@
 				order = GetVehicleOrder(v, sel_ord + 1);
 				SwapOrders(v->orders, order);
 			} else {
+				/* XXX -- The system currently can't handle a shared-order vehicle list
+				 *  open when there aren't any orders in the list, so close the window
+				 *  in this case. Of course it needs a better fix later */
+				RemoveSharedOrderVehicleList(v);
 				/* Last item, so clean the list */
 				v->orders = NULL;
 			}
@@ -1144,22 +1166,12 @@
 
 	/* Remove the orders */
 	Order *cur = v->orders;
+	/* Delete the vehicle list of shared orders, if any */
+	if (cur != NULL) RemoveSharedOrderVehicleList(v);
 	v->orders = NULL;
 	v->num_orders = 0;
 
 	if (cur != NULL) {
-		/* Delete the vehicle list of shared orders, if any */
-		WindowClass window_class = WC_NONE;
-
-		switch (v->type) {
-			default: NOT_REACHED();
-			case VEH_TRAIN:    window_class = WC_TRAINS_LIST;   break;
-			case VEH_ROAD:     window_class = WC_ROADVEH_LIST;  break;
-			case VEH_SHIP:     window_class = WC_SHIPS_LIST;    break;
-			case VEH_AIRCRAFT: window_class = WC_AIRCRAFT_LIST; break;
-		}
-		DeleteWindowById(window_class, (cur->index << 16) | (v->type << 11) | VLW_SHARED_ORDERS | v->owner);
-
 		cur->FreeChain(); // Free the orders.
 	}
 }