From 2f6c840ebf94c9c0386abcb0217540a1c2a7ae85 Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 20 Jan 2011 12:22:38 +0000 Subject: [PATCH] (svn r21866) -Feature [FS#4394]: [NewGRF] Rail type property to influence sorting of rail types in the drop down list --- src/newgrf.cpp | 5 +++++ src/rail.h | 5 +++++ src/rail_cmd.cpp | 8 ++++++++ src/table/railtypes.h | 12 ++++++++++++ src/toolbar_gui.cpp | 12 ++++++++++++ 5 files changed, 42 insertions(+) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 622297fb51..e398edbb80 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 20260d2415..f7d97daf43 100644 --- a/src/rail.h +++ b/src/rail.h @@ -237,6 +237,11 @@ struct RailtypeInfo { */ RailTypes introduces_railtypes; + /** + * The sorting order of this railtype for the toolbar dropdown. + */ + byte sorting_order; + /** * Sprite groups for resolving sprites */ diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 508ba84596..824deaedd6 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 c4decab185..e8a1d51e56 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 90e1075501..6495520369 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;