From 6f6f09910d00551740d168f8def9ef75bd2ef55f Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 2 Feb 2024 15:51:57 -0500 Subject: [PATCH] Fix #10118: Cycle through current signal group, not just path signals (#11798) --- src/lang/english.txt | 2 +- src/rail_gui.cpp | 26 +++++++++++++++++++++++--- src/rail_gui.h | 4 ++-- src/table/settings/gui_settings.ini | 8 ++++---- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index fa7aabb881..b8bd1efa9d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1939,7 +1939,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year wh STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cycle through signal types: {STRING2} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when Ctrl+Clicking on a built signal with the signal tool ###length 2 -STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Path signals only +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Current group only STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :All visible STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Show signal types: {STRING2} diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 4c09c32e8d..6185254e86 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -241,16 +241,36 @@ static void GenericPlaceSignals(TileIndex tile) Command::Post(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM, CcPlaySound_CONSTRUCTION_RAIL, tile, track); } else { /* Which signals should we cycle through? */ - SignalType cycle_start = _settings_client.gui.cycle_signal_types == SIGNAL_CYCLE_ALL && _settings_client.gui.signal_gui_mode == SIGNAL_GUI_ALL ? SIGTYPE_BLOCK : SIGTYPE_PBS; + bool tile_has_signal = IsValidTrack(track) && HasSignalOnTrack(tile, track); + SignalType cur_signal_on_tile = tile_has_signal ? GetSignalType(tile, track) : _cur_signal_type; + SignalType cycle_start; + SignalType cycle_end; + + /* Start with the least restrictive case: the player wants to cycle through all signals they can see. */ + if (_settings_client.gui.cycle_signal_types == SIGNAL_CYCLE_ALL) { + cycle_start = _settings_client.gui.signal_gui_mode == SIGNAL_GUI_ALL ? SIGTYPE_BLOCK : SIGTYPE_PBS; + cycle_end = SIGTYPE_LAST; + } else { + /* Only cycle through signals of the same group (block or path) as the current signal on the tile. */ + if (cur_signal_on_tile <= SIGTYPE_LAST_NOPBS) { + /* Block signals only. */ + cycle_start = SIGTYPE_BLOCK; + cycle_end = SIGTYPE_LAST_NOPBS; + } else { + /* Path signals only. */ + cycle_start = SIGTYPE_PBS; + cycle_end = SIGTYPE_LAST; + } + } if (FindWindowById(WC_BUILD_SIGNAL, 0) != nullptr) { /* signal GUI is used */ Command::Post(_convert_signal_button ? STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL, - tile, track, _cur_signal_type, _cur_signal_variant, _convert_signal_button, false, _ctrl_pressed, cycle_start, SIGTYPE_LAST, 0, 0); + tile, track, _cur_signal_type, _cur_signal_variant, _convert_signal_button, false, _ctrl_pressed, cycle_start, cycle_end, 0, 0); } else { SignalVariant sigvar = TimerGameCalendar::year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC; Command::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL, - tile, track, _settings_client.gui.default_signal_type, sigvar, false, false, _ctrl_pressed, cycle_start, SIGTYPE_LAST, 0, 0); + tile, track, _settings_client.gui.default_signal_type, sigvar, false, false, _ctrl_pressed, cycle_start, cycle_end, 0, 0); } } diff --git a/src/rail_gui.h b/src/rail_gui.h index 9af41eb82e..ef51130e8b 100644 --- a/src/rail_gui.h +++ b/src/rail_gui.h @@ -27,8 +27,8 @@ enum SignalGUISettings : uint8_t { /** Settings for which signals are cycled through by control-clicking on the signal with the signal tool. */ enum SignalCycleSettings : uint8_t { - SIGNAL_CYCLE_PATH = 0, ///< Cycle through path signals only. - SIGNAL_CYCLE_ALL = 1, ///< Cycle through all signals visible. + SIGNAL_CYCLE_GROUP = 0, ///< Cycle through current signal group (block or path) only. + SIGNAL_CYCLE_ALL = 1, ///< Cycle through all signals visible to the player. }; #endif /* RAIL_GUI_H */ diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 5cc1c3ecdb..2abb58464f 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -519,13 +519,13 @@ cat = SC_EXPERT var = gui.cycle_signal_types type = SLE_UINT8 flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN -def = 0 -min = 0 -max = 1 +def = SIGNAL_CYCLE_GROUP +min = SIGNAL_CYCLE_GROUP +max = SIGNAL_CYCLE_ALL interval = 1 str = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES strhelp = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT -strval = STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS +strval = STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP cat = SC_ADVANCED [SDTC_VAR]