summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-01-20 12:22:38 +0000
committerrubidium <rubidium@openttd.org>2011-01-20 12:22:38 +0000
commit2f6c840ebf94c9c0386abcb0217540a1c2a7ae85 (patch)
treebe5ded654afdcffe47d25a8d2cb6dd87531eb196
parent6a2ae9281159ad17a64f88d871561382ce366697 (diff)
downloadopenttd-2f6c840ebf94c9c0386abcb0217540a1c2a7ae85.tar.xz
(svn r21866) -Feature [FS#4394]: [NewGRF] Rail type property to influence sorting of rail types in the drop down list
-rw-r--r--src/newgrf.cpp5
-rw-r--r--src/rail.h5
-rw-r--r--src/rail_cmd.cpp8
-rw-r--r--src/table/railtypes.h12
-rw-r--r--src/toolbar_gui.cpp12
5 files changed, 42 insertions, 0 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 622297fb5..e398edbb8 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -3263,6 +3263,10 @@ static ChangeInfoResult RailTypeChangeInfo(uint id, int numinfo, int prop, ByteR
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 @@ static ChangeInfoResult RailTypeReserveInfo(uint id, int numinfo, int prop, Byte
case 0x12: // Station graphic
case 0x15: // Acceleration model
case 0x16: // Map colour
+ case 0x1A: // Sort order
buf->ReadByte();
break;
diff --git a/src/rail.h b/src/rail.h
index 20260d241..f7d97daf4 100644
--- a/src/rail.h
+++ b/src/rail.h
@@ -238,6 +238,11 @@ struct RailtypeInfo {
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];
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 508ba8459..824deaedd 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -106,6 +106,14 @@ RailType AllocateRailType(RailTypeLabel label)
/* 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;
}
}
diff --git a/src/table/railtypes.h b/src/table/railtypes.h
index c4decab18..e8a1d51e5 100644
--- a/src/table/railtypes.h
+++ b/src/table/railtypes.h
@@ -104,6 +104,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* introduction rail types */
RAILTYPES_RAIL,
+ /* sort order */
+ 0 << 4 | 7,
+
{ NULL },
},
@@ -196,6 +199,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* introduction rail types */
RAILTYPES_ELECTRIC,
+ /* sort order */
+ 1 << 4 | 7,
+
{ NULL },
},
@@ -284,6 +290,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* introduction rail types */
RAILTYPES_MONO,
+ /* sort order */
+ 2 << 4 | 7,
+
{ NULL },
},
@@ -372,6 +381,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* introduction rail types */
RAILTYPES_MAGLEV,
+ /* sort order */
+ 3 << 4 | 7,
+
{ NULL },
},
};
diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp
index 90e107550..649552036 100644
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -691,6 +691,17 @@ static CallBackFunction ToolbarZoomOutClick(Window *w)
/* --- 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 @@ static CallBackFunction ToolbarBuildRailClick(Window *w)
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;