summaryrefslogtreecommitdiff
path: root/src/rail_gui.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-01-20 12:40:04 +0000
committerrubidium <rubidium@openttd.org>2011-01-20 12:40:04 +0000
commit4682434bc9b4a9768267633ae7a54c8eeb8d3429 (patch)
tree4c60be21ae25e3f6531c92aad3450396ef397bfa /src/rail_gui.cpp
parent2f6c840ebf94c9c0386abcb0217540a1c2a7ae85 (diff)
downloadopenttd-4682434bc9b4a9768267633ae7a54c8eeb8d3429.tar.xz
(svn r21867) -Codechange: move creating the rail type dropdown to a more general location
Diffstat (limited to 'src/rail_gui.cpp')
-rw-r--r--src/rail_gui.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp
index d8e901bba..7beaf6eff 100644
--- a/src/rail_gui.cpp
+++ b/src/rail_gui.cpp
@@ -31,6 +31,7 @@
#include "spritecache.h"
#include "core/geometry_func.hpp"
#include "hotkeys.h"
+#include "engine_base.h"
#include "station_map.h"
#include "tunnelbridge_map.h"
@@ -1969,3 +1970,54 @@ void InitializeRailGUI()
_cur_signal_type = _default_signal_type[_settings_client.gui.default_signal_type];
ResetSignalVariant();
}
+
+/**
+ * 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;
+}
+
+/**
+ * Create a drop down list for all the rail types of the local company.
+ * @param for_replacement Whether this list is for the replacement window.
+ * @return The populated and sorted #DropDownList.
+ */
+DropDownList *GetRailTypeDropDownList(bool for_replacement)
+{
+ RailTypes used_railtypes = RAILTYPES_NONE;
+
+ /* Find the used railtypes. */
+ Engine *e;
+ FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
+ if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
+
+ used_railtypes |= GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes;
+ }
+
+ /* Get the date introduced railtypes as well. */
+ used_railtypes = AddDateIntroducedRailTypes(used_railtypes, MAX_DAY);
+
+ const Company *c = Company::Get(_local_company);
+ DropDownList *list = new DropDownList();
+ for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
+ /* If it's not used ever, don't show it to the user. */
+ if (!HasBit(used_railtypes, rt)) continue;
+
+ const RailtypeInfo *rti = GetRailTypeInfo(rt);
+ /* Skip rail type if it has no label */
+ if (rti->label == 0) continue;
+
+ StringID str = for_replacement ? rti->strings.replace_text : (rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING);
+ DropDownListParamStringItem *item = new DropDownListParamStringItem(str, rt, !HasBit(c->avail_railtypes, rt));
+ item->SetParam(0, rti->strings.menu_text);
+ item->SetParam(1, rti->max_speed);
+ list->push_back(item);
+ }
+ list->sort(CompareRailTypes);
+ return list;
+}