changeset 17129:703380c6e064 draft

(svn r21866) -Feature [FS#4394]: [NewGRF] Rail type property to influence sorting of rail types in the drop down list
author rubidium <rubidium@openttd.org>
date Thu, 20 Jan 2011 12:22:38 +0000
parents e71b7d776112
children 97e8cda8fc10
files src/newgrf.cpp src/rail.h src/rail_cmd.cpp src/table/railtypes.h src/toolbar_gui.cpp
diffstat 5 files changed, 42 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -3263,6 +3263,10 @@
 				rti->introduction_date = buf->ReadDWord();
 				break;
 
+			case 0x1A: // Sort order
+				rti->sorting_order = buf->ReadByte();
+				break;
+
 			default:
 				ret = CIR_UNKNOWN;
 				break;
@@ -3320,6 +3324,7 @@
 			case 0x12: // Station graphic
 			case 0x15: // Acceleration model
 			case 0x16: // Map colour
+			case 0x1A: // Sort order
 				buf->ReadByte();
 				break;
 
--- a/src/rail.h
+++ b/src/rail.h
@@ -238,6 +238,11 @@
 	RailTypes introduces_railtypes;
 
 	/**
+	 * The sorting order of this railtype for the toolbar dropdown.
+	 */
+	byte sorting_order;
+
+	/**
 	 * Sprite groups for resolving sprites
 	 */
 	const SpriteGroup *group[RTSG_END];
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -106,6 +106,14 @@
 
 			/* We also introduce ourself. */
 			rti->introduces_railtypes = (RailTypes)(1 << rt);
+
+			/* Default sort order; order of allocation, but with some
+			 * offsets so it's easier for NewGRF to pick a spot without
+			 * changing the order of other (original) rail types.
+			 * The << is so you can place other railtypes in between the
+			 * other railtypes, the 7 is to be able to place something
+			 * before the first (default) rail type. */
+			rti->sorting_order = rt << 4 | 7;
 			return rt;
 		}
 	}
--- a/src/table/railtypes.h
+++ b/src/table/railtypes.h
@@ -104,6 +104,9 @@
 		/* introduction rail types */
 		RAILTYPES_RAIL,
 
+		/* sort order */
+		0 << 4 | 7,
+
 		{ NULL },
 	},
 
@@ -196,6 +199,9 @@
 		/* introduction rail types */
 		RAILTYPES_ELECTRIC,
 
+		/* sort order */
+		1 << 4 | 7,
+
 		{ NULL },
 	},
 
@@ -284,6 +290,9 @@
 		/* introduction rail types */
 		RAILTYPES_MONO,
 
+		/* sort order */
+		2 << 4 | 7,
+
 		{ NULL },
 	},
 
@@ -372,6 +381,9 @@
 		/* introduction rail types */
 		RAILTYPES_MAGLEV,
 
+		/* sort order */
+		3 << 4 | 7,
+
 		{ NULL },
 	},
 };
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -691,6 +691,17 @@
 
 /* --- Rail button menu --- */
 
+/**
+ * Compare railtypes based on their sorting order.
+ * @param first  The railtype to compare to.
+ * @param second The railtype to compare.
+ * @return True iff the first should be sorted before the second.
+ */
+static bool CompareRailTypes(const DropDownListItem *first, const DropDownListItem *second)
+{
+	return GetRailTypeInfo((RailType)first->result)->sorting_order < GetRailTypeInfo((RailType)second->result)->sorting_order;
+}
+
 static CallBackFunction ToolbarBuildRailClick(Window *w)
 {
 	RailTypes used_railtypes = RAILTYPES_NONE;
@@ -722,6 +733,7 @@
 		item->SetParam(1, rti->max_speed);
 		list->push_back(item);
 	}
+	list->sort(CompareRailTypes);
 	ShowDropDownList(w, list, _last_built_railtype, TBN_RAILS, 140, true, true);
 	SndPlayFx(SND_15_BEEP);
 	return CBF_NONE;