From ef63c04599b7f681694ce0f8837da1a71d8dd01b Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 12 Dec 2023 10:07:36 -0500 Subject: [PATCH] Change: When using wallclock timekeeping, force timetable display to seconds --- src/settings_table.cpp | 10 ++++++++++ src/table/settings/gui_settings.ini | 2 ++ src/timetable_gui.cpp | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/src/settings_table.cpp b/src/settings_table.cpp index 6bbdea874a..38573339db 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -503,4 +503,14 @@ static void ChangeTimekeepingUnits(int32_t) InvalidateWindowClassesData(WC_GAME_OPTIONS, 0); } +/** + * Pre-callback check when trying to change the timetable mode. This is locked to Seconds when using wallclock units. + * @param Unused. + * @return True if we allow changing the timetable mode. + */ +static bool CanChangeTimetableMode(int32_t &) +{ + return !TimerGameEconomy::UsingWallclockUnits(); +} + /* End - Callback Functions */ diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 79359d3ffb..a4b41da886 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -7,6 +7,7 @@ ; GUI settings as stored in the main configuration file ("openttd.cfg"). [pre-amble] +static bool CanChangeTimetableMode(int32_t &new_value); static void v_PositionMainToolbar(int32_t new_value); static void v_PositionStatusbar(int32_t new_value); static void RedrawSmallmap(int32_t new_value); @@ -430,6 +431,7 @@ max = 2 str = STR_CONFIG_SETTING_TIMETABLE_MODE strhelp = STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT strval = STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS +pre_cb = CanChangeTimetableMode post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); } cat = SC_ADVANCED diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 01d7aa9496..961e25eda2 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -215,6 +215,12 @@ struct TimetableWindow : Window { { this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_VT_SCROLLBAR); + + /* When using wallclock units, we must ensure the client displays timetables in seconds. */ + if (TimerGameEconomy::UsingWallclockUnits()) { + _settings_client.gui.timetable_mode = TimetableMode::Seconds; + } + this->UpdateSelectionStates(); this->FinishInitNested(window_number);