changeset 14938:80b5c3338f03 draft

(svn r19541) -Feature: Sort the list of refit options by cargo class / name.
author terkhen <terkhen@openttd.org>
date Fri, 02 Apr 2010 12:28:08 +0000
parents 205fdbada4d7
children d5e618321973
files src/vehicle_gui.cpp
diffstat 1 files changed, 35 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -234,6 +234,11 @@
 	{
 		return other.cargo != this->cargo || other.value != this->value;
 	}
+
+	FORCEINLINE bool operator == (const RefitOption &other) const
+	{
+		return other.cargo == this->cargo && other.value == this->value;
+	}
 };
 
 typedef SmallVector<RefitOption, 32> RefitList;
@@ -258,7 +263,7 @@
 
 		/* Loop through all cargos in the refit mask */
 		const CargoSpec *cs;
-		FOR_ALL_CARGOSPECS(cs) {
+		FOR_ALL_SORTED_CARGOSPECS(cs) {
 			CargoID cid = cs->Index();
 			/* Skip cargo type if it's not listed */
 			if (!HasBit(cmask, cid)) continue;
@@ -380,6 +385,35 @@
 		this->vscroll.SetCount(this->list.Length());
 	}
 
+	virtual void OnInit()
+	{
+		if (this->cargo != NULL) {
+			/* Store the RefitOption currently in use. */
+			RefitOption current_refit_option = *(this->cargo);
+
+			/* Rebuild the refit list */
+			BuildRefitList(Vehicle::Get(this->window_number), &this->list);
+			this->vscroll.SetCount(this->list.Length());
+			this->sel = -1;
+			this->cargo = NULL;
+			for (uint i = 0; i < this->list.Length(); i++) {
+				if (this->list[i] == current_refit_option) {
+					this->sel = i;
+					this->cargo = &this->list[i];
+					this->vscroll.ScrollTowards(i);
+					break;
+				}
+			}
+
+			/* If the selected refit option was not found, scroll the window to the initial position. */
+			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());
+		}
+	}
+
 	virtual void OnPaint()
 	{
 		Vehicle *v = Vehicle::Get(this->window_number);