From 424e4691ce2122ccfe42d19aad4edb6b71b5c689 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 12 Apr 2017 17:42:09 +0100 Subject: [PATCH] Show tracerestrict and/or progsig windows when ctrl-clicking signal. --- src/rail_cmd.cpp | 26 ++++++++++++++++++++++++++ src/viewport.cpp | 3 +++ 2 files changed, 29 insertions(+) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 51377987f0..e1dd99c0f9 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -2939,6 +2939,32 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, static bool ClickTile_Track(TileIndex tile) { + if (_ctrl_pressed && IsPlainRailTile(tile)) { + TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + + if (trackbits & TRACK_BIT_VERT) { // N-S direction + trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; + } + + if (trackbits & TRACK_BIT_HORZ) { // E-W direction + trackbits = (_tile_fract_coords.x + _tile_fract_coords.y <= 15) ? TRACK_BIT_UPPER : TRACK_BIT_LOWER; + } + + Track track = FindFirstTrack(trackbits); + if (HasTrack(tile, track) && HasSignalOnTrack(tile, track)) { + bool result = false; + if (GetExistingTraceRestrictProgram(tile, track) != nullptr) { + ShowTraceRestrictProgramWindow(tile, track); + result = true; + } + if (IsPresignalProgrammable(tile, track)) { + ShowSignalProgramWindow(SignalReference(tile, track)); + result = true; + } + return result; + } + } + if (!IsRailDepot(tile)) return false; ShowDepotWindow(tile, VEH_TRAIN); diff --git a/src/viewport.cpp b/src/viewport.cpp index d9b1d8f4a0..5925ec0cd2 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -3290,6 +3290,9 @@ static bool CheckClickOnLandscape(const ViewPort *vp, int x, int y) { Point pt = TranslateXYToTileCoord(vp, x, y); + _tile_fract_coords.x = pt.x & TILE_UNIT_MASK; + _tile_fract_coords.y = pt.y & TILE_UNIT_MASK; + if (pt.x != -1) return ClickTile(TileVirtXY(pt.x, pt.y)); return true; }