changeset 15073:63aa13fe4f2c draft

(svn r19699) -Codechange: Use InvalidateData at the refit window.
author terkhen <terkhen@openttd.org>
date Fri, 23 Apr 2010 17:29:53 +0000
parents 0f1869a54166
children 0f4ae56a4db2
files src/train_cmd.cpp src/vehicle_gui.cpp
diffstat 2 files changed, 21 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -266,6 +266,7 @@
 	if (this->IsFrontEngine()) {
 		this->UpdateAcceleration();
 		SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
+		InvalidateWindowData(WC_VEHICLE_REFIT, this->index);
 	}
 }
 
@@ -1144,7 +1145,7 @@
 	if (!head->IsFrontEngine()) return;
 
 	/* Update the refit button and window */
-	SetWindowDirty(WC_VEHICLE_REFIT, head->index);
+	InvalidateWindowData(WC_VEHICLE_REFIT, head->index);
 	SetWindowWidgetDirty(WC_VEHICLE_VIEW, head->index, VVW_WIDGET_REFIT_VEH);
 
 	/* If we don't have a unit number yet, set one. */
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -362,7 +362,6 @@
 	int sel;              ///< Index in refit options, \c -1 if nothing is selected.
 	RefitOption *cargo;   ///< Refit option selected by \v sel.
 	RefitList list;       ///< List of cargo types available for refitting.
-	uint length;          ///< For trains, the number of vehicles.
 	VehicleOrderID order; ///< If not #INVALID_VEH_ORDER_ID, selection is part of a refit order (rather than execute directly).
 
 	RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window()
@@ -381,7 +380,6 @@
 		this->order = order;
 		this->sel  = -1;
 		BuildRefitList(v, &this->list);
-		if (v->type == VEH_TRAIN) this->length = CountVehiclesInChain(v);
 		this->vscroll.SetCount(this->list.Length());
 	}
 
@@ -409,28 +407,12 @@
 			if (this->sel == -1) this->vscroll.ScrollTowards(0);
 		} else {
 			/* Rebuild the refit list */
-			BuildRefitList(Vehicle::Get(this->window_number), &this->list);
-			this->vscroll.SetCount(this->list.Length());
+			this->OnInvalidateData(0);
 		}
 	}
 
 	virtual void OnPaint()
 	{
-		Vehicle *v = Vehicle::Get(this->window_number);
-
-		if (v->type == VEH_TRAIN) {
-			uint length = CountVehiclesInChain(v);
-
-			if (length != this->length) {
-				/* Consist length has changed, so rebuild the refit list */
-				BuildRefitList(v, &this->list);
-				this->length = length;
-			}
-		}
-
-		this->vscroll.SetCount(this->list.Length());
-
-		this->cargo = (this->sel >= 0 && this->sel < (int)this->list.Length()) ? &this->list[this->sel] : NULL;
 		this->DrawWidgets();
 	}
 
@@ -472,6 +454,22 @@
 		}
 	}
 
+	virtual void OnInvalidateData(int data)
+	{
+		switch (data) {
+			case 0: { // The consist lenght of the vehicle has changed; rebuild the entire list.
+				Vehicle *v = Vehicle::Get(this->window_number);
+				BuildRefitList(v, &this->list);
+				this->vscroll.SetCount(this->list.Length());
+			}
+			/* FALLTHROUGH */
+
+			case 1: // A new cargo has been selected.
+				this->cargo = (this->sel >= 0 && this->sel < (int)this->list.Length()) ? &this->list[this->sel] : NULL;
+				break;
+		}
+	}
+
 	virtual void OnClick(Point pt, int widget, int click_count)
 	{
 		switch (widget) {
@@ -479,9 +477,9 @@
 				int y = pt.y - this->GetWidget<NWidgetBase>(VRW_MATRIX)->pos_y;
 				if (y >= 0) {
 					this->sel = (y / (int)this->resize.step_height) + this->vscroll.GetPosition();
-					this->SetDirty();
+					this->InvalidateData(1);
 				}
-				/* FIXME We need to call some InvalidateData to make this->cargo valid */
+
 				if (click_count == 1) break;
 			}
 			/* FALL THROUGH */