summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rail_gui.cpp52
-rw-r--r--src/rail_gui.h2
-rw-r--r--src/toolbar_gui.cpp43
3 files changed, 55 insertions, 42 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;
+}
diff --git a/src/rail_gui.h b/src/rail_gui.h
index 0c69ac23d..f51e8aa27 100644
--- a/src/rail_gui.h
+++ b/src/rail_gui.h
@@ -13,10 +13,12 @@
#define RAIL_GUI_H
#include "rail_type.h"
+#include "widgets/dropdown_type.h"
struct Window *ShowBuildRailToolbar(RailType railtype);
void ReinitGuiAfterToggleElrail(bool disable);
bool ResetSignalVariant(int32 = 0);
void InitializeRailGUI();
+DropDownList *GetRailTypeDropDownList(bool for_replacement = false);
#endif /* RAIL_GUI_H */
diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp
index 649552036..74532586e 100644
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -691,50 +691,9 @@ 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;
-
- /* 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 = 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);
- ShowDropDownList(w, list, _last_built_railtype, TBN_RAILS, 140, true, true);
+ ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, TBN_RAILS, 140, true, true);
SndPlayFx(SND_15_BEEP);
return CBF_NONE;
}