From 1522e4f5323d30e86ebf80c426292f27714c0d66 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 16:06:41 +0000 Subject: [PATCH 1/3] feat: Add support for early train arrivals Mirrors the existing logic for late train arrivals to display a message and a different color when a train is running ahead of schedule. Changes are constrained to the Converters to handle the new display state. --- .../Converters/TrainStateColorConverter.cs | 2 ++ CRSim.ScreenSimulator/Converters/TrainStateConverter.cs | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs b/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs index 40e3a17..246a59e 100644 --- a/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs +++ b/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs @@ -20,6 +20,7 @@ namespace CRSim.ScreenSimulator.Converters public SolidColorBrush ArrivedText { get; set; } = new(Colors.LightGreen); public SolidColorBrush ArrivingText { get; set; } = new(Colors.White); public SolidColorBrush ArrivingLateText { get; set; } = new(Colors.Red); + public SolidColorBrush ArrivingEarlyText { get; set; } = new(Colors.LightGreen); public SolidColorBrush WaitingColor { get; set; } = new(Colors.White); public SolidColorBrush CheckInColor { get; set; } = new(Colors.LightGreen); public SolidColorBrush StopCheckInColor { get; set; } = new(Colors.Red); @@ -38,6 +39,7 @@ namespace CRSim.ScreenSimulator.Converters if (values[0] is DateTime arriveTime){ if (values.Length > 1 && values[1] is TimeSpan state){ if (state.TotalMinutes > 0) return ArrivingLateText; + if (state.TotalMinutes < 0) return ArrivingEarlyText; return now >= arriveTime ? ArrivedText : ArrivingText; } return now >= arriveTime? ArrivedText : ArrivingText; diff --git a/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs b/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs index 382f2a4..ad7c1fb 100644 --- a/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs +++ b/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs @@ -15,6 +15,8 @@ namespace CRSim.ScreenSimulator.Converters public string ArrivingText { get; set; } = "正点"; public string ArrivedLateText { get; set; } = "晚点{0}到达"; public string ArrivingLateText { get; set; } = "预计晚点{0}"; + public string ArrivedEarlyText { get; set; } = "早点{0}到达"; + public string ArrivingEarlyText { get; set; } = "预计早点{0}"; public string WaitingText { get; set; } = "候车"; public string CheckInText { get; set; } = "正在检票"; public string StopCheckInText { get; set; } = "停止检票"; @@ -42,12 +44,16 @@ namespace CRSim.ScreenSimulator.Converters { if (state.TotalMinutes > 0) return string.Format(ArrivedLateText, ToHourMinuteString(state)); + if (state.TotalMinutes < 0) + return string.Format(ArrivedEarlyText, ToHourMinuteString(state.Negate())); return ArrivedText; } else { if (state.TotalMinutes > 0) return string.Format(ArrivingLateText, ToHourMinuteString(state)); + if (state.TotalMinutes < 0) + return string.Format(ArrivingEarlyText, ToHourMinuteString(state.Negate())); return ArrivingText; } } From 89f99f4f3040a7947a8257a68346538c114bf599 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 14:50:00 +0000 Subject: [PATCH 2/3] feat: Add support for early train arrivals This commit introduces support for early train arrivals. - Modifies `TrainStateConverter` and `TrainStateColorConverter` to display a message and a different color when a train is running ahead of schedule. - Updates `TrainStopDialog` to allow entering negative values for the train status, enabling users to mark trains as early. --- CRSim/Views/DialogContents/TrainStopDialog.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CRSim/Views/DialogContents/TrainStopDialog.xaml.cs b/CRSim/Views/DialogContents/TrainStopDialog.xaml.cs index 08c337b..b9d1ba0 100644 --- a/CRSim/Views/DialogContents/TrainStopDialog.xaml.cs +++ b/CRSim/Views/DialogContents/TrainStopDialog.xaml.cs @@ -104,7 +104,7 @@ public sealed partial class TrainStopDialog : Page !string.IsNullOrWhiteSpace(DepartureTextBox.Text) && int.TryParse(LengthTextBox.Text, out int i) && i > 0 && PlatformComboBox.SelectedItem != null && - int.TryParse(StatusTextBox.Text, out int m) && m >= 0; + int.TryParse(StatusTextBox.Text, out int m); _onValidityChanged?.Invoke(isValid); } From 8466fa714c190bdcdb485676dc49a50ac1c28361 Mon Sep 17 00:00:00 2001 From: denglihong2007 <98096191+denglihong2007@users.noreply.github.com> Date: Sat, 20 Dec 2025 23:34:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=97=A9?= =?UTF-8?q?=E7=82=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Converters/TrainStateColorConverter.cs | 21 ++++++------------- .../Converters/TrainStateConverter.cs | 2 ++ CRSim.ScreenSimulator/Models/TrainInfo.cs | 2 +- .../ViewModels/BaseScreenViewModel.cs | 8 +++---- CRSim/Converters/TimeSpanToStringConverter.cs | 15 ++++++++----- .../StationManagementPageViewModel.cs | 7 ++++++- 6 files changed, 29 insertions(+), 26 deletions(-) diff --git a/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs b/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs index 246a59e..5f71f37 100644 --- a/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs +++ b/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs @@ -16,7 +16,7 @@ namespace CRSim.ScreenSimulator.Converters public string DisplayMode { get; set; } = "Normal"; - public List WaitingColorList { get; set; } = new(); + public List WaitingColorList { get; set; } = []; public SolidColorBrush ArrivedText { get; set; } = new(Colors.LightGreen); public SolidColorBrush ArrivingText { get; set; } = new(Colors.White); public SolidColorBrush ArrivingLateText { get; set; } = new(Colors.Red); @@ -85,23 +85,14 @@ namespace CRSim.ScreenSimulator.Converters return WaitingColorList[rowNumber % WaitingColorList.Count]; return WaitingColor; // 正点 } - else + else if (status > TimeSpan.Zero) { return StopCheckInColor; // 晚点 } - } - public static string ToHourMinuteString(TimeSpan ts) - { - int totalHours = (int)ts.TotalHours; // 可以超过24 - int minutes = ts.Minutes; - - if (totalHours > 0 && minutes > 0) - return $"{totalHours}小时{minutes}分钟"; - if (totalHours > 0) - return $"{totalHours}小时"; - if (minutes > 0) - return $"{minutes}分钟"; - return "0分钟"; // 特殊情况,完全为0 + else + { + return CheckInColor; // 早点 + } } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => null; } diff --git a/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs b/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs index ad7c1fb..a9a7a4e 100644 --- a/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs +++ b/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs @@ -86,6 +86,8 @@ namespace CRSim.ScreenSimulator.Converters { if (state.TotalMinutes > 0) return $"晚点约{ToHourMinuteString(state)}"; // 晚点 + if (state.TotalMinutes < 0) + return $"早点约{ToHourMinuteString(state.Negate())}"; // 早点 return WaitingText; // 正点 } } diff --git a/CRSim.ScreenSimulator/Models/TrainInfo.cs b/CRSim.ScreenSimulator/Models/TrainInfo.cs index 6283130..1c21e16 100644 --- a/CRSim.ScreenSimulator/Models/TrainInfo.cs +++ b/CRSim.ScreenSimulator/Models/TrainInfo.cs @@ -22,7 +22,7 @@ { get { - return State is null ? departureTime : departureTime + State; + return State is null || State < TimeSpan.Zero ? departureTime : departureTime + State; } set { diff --git a/CRSim.ScreenSimulator/ViewModels/BaseScreenViewModel.cs b/CRSim.ScreenSimulator/ViewModels/BaseScreenViewModel.cs index 96af3cc..fed03c0 100644 --- a/CRSim.ScreenSimulator/ViewModels/BaseScreenViewModel.cs +++ b/CRSim.ScreenSimulator/ViewModels/BaseScreenViewModel.cs @@ -129,16 +129,16 @@ namespace CRSim.ScreenSimulator.ViewModels continue; } - DateTime? AdjustTime(TimeSpan? time) => - time.HasValue ? (today.Add(time.Value).Add(trainNumber.Status.Value) > now ? today.Add(time.Value) : today.Add(time.Value).AddDays(1)) : null; + DateTime? AdjustTime(TimeSpan? time, TimeSpan? status) => + time.HasValue ? (today.Add(time.Value).Add(status.Value) > now ? today.Add(time.Value) : today.Add(time.Value).AddDays(1)) : null; TrainInfo.Add(new TrainInfo { TrainNumber = trainNumber.Number, Terminal = trainNumber.Terminal, Origin = trainNumber.Origin, - ArrivalTime = AdjustTime(trainNumber.ArrivalTime), - DepartureTime = AdjustTime(trainNumber.DepartureTime), + ArrivalTime = AdjustTime(trainNumber.ArrivalTime,trainNumber.Status), + DepartureTime = trainNumber.Status > TimeSpan.Zero ? AdjustTime(trainNumber.DepartureTime, trainNumber.Status) : AdjustTime(trainNumber.DepartureTime, TimeSpan.Zero), TicketChecks = trainNumber.TicketCheckIds is null ? [] : [.. station.WaitingAreas .SelectMany(w => w.TicketChecks) .Where(tc => trainNumber.TicketCheckIds.Contains(tc.Id)) diff --git a/CRSim/Converters/TimeSpanToStringConverter.cs b/CRSim/Converters/TimeSpanToStringConverter.cs index a28c49c..a7a3980 100644 --- a/CRSim/Converters/TimeSpanToStringConverter.cs +++ b/CRSim/Converters/TimeSpanToStringConverter.cs @@ -12,19 +12,24 @@ namespace CRSim.Converters public string ZeroString { get; set; } = string.Empty; public object Convert(object value, Type targetType, object parameter, string language) { - if (value is TimeSpan dateTime) + if (value is TimeSpan timeSpan) { - if(dateTime == new TimeSpan()) + if (timeSpan == TimeSpan.Zero) { return ZeroString; } - var CultureInfo = new CultureInfo(Culture); - return (dateTime-dateTime.Days*TimeSpan.FromHours(24)).ToString(Format,CultureInfo); + string sign = timeSpan < TimeSpan.Zero ? "-" : string.Empty; + TimeSpan absoluteValue = timeSpan.Duration(); + var cultureInfo = new CultureInfo(Culture); + var timeOnly = absoluteValue - TimeSpan.FromDays(absoluteValue.Days); + return sign + timeOnly.ToString(Format, cultureInfo); } - if(value is null) + + if (value is null) { return NullString; } + return string.Empty; } public object ConvertBack(object value, Type targetType, object parameter, string language) diff --git a/CRSim/ViewModels/StationManagementPageViewModel.cs b/CRSim/ViewModels/StationManagementPageViewModel.cs index 544fad5..826950b 100644 --- a/CRSim/ViewModels/StationManagementPageViewModel.cs +++ b/CRSim/ViewModels/StationManagementPageViewModel.cs @@ -597,7 +597,11 @@ public partial class StationManagementPageViewModel : ObservableObject { "停运" => null, "正点" => TimeSpan.Zero, - var t => TimeSpan.TryParseExact(t, @"hh\:mm", null, out TimeSpan ts) ? ts : TimeSpan.Zero + var t when t.StartsWith("-") && TimeSpan.TryParseExact(t.Substring(1), @"hh\:mm", null, out var ts) + => -ts, + var t when TimeSpan.TryParseExact(t, @"hh\:mm", null, out var ts) + => ts, + _ => TimeSpan.Zero } }); } @@ -641,6 +645,7 @@ public partial class StationManagementPageViewModel : ObservableObject { null => "停运", var ts when ts == TimeSpan.Zero => "正点", + var ts when ts < TimeSpan.Zero => $"-{ts.Value.Duration():hh\\:mm}", var ts => ts.Value.ToString(@"hh\:mm") }; }