From 7be37f28858a3d61021d4e9dce01b0fe723e6888 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Fri, 27 Feb 2026 13:43:17 +0700 Subject: [PATCH] feat: refresh preview --- TimeMocker.UI/Core/ProcessWatcher.cs | 2 +- TimeMocker.UI/Forms/MainForm.cs | 59 ++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/TimeMocker.UI/Core/ProcessWatcher.cs b/TimeMocker.UI/Core/ProcessWatcher.cs index de34ce3..0d1cbd6 100644 --- a/TimeMocker.UI/Core/ProcessWatcher.cs +++ b/TimeMocker.UI/Core/ProcessWatcher.cs @@ -75,7 +75,7 @@ namespace TimeMocker.UI.Core } } - public void Start(int pollIntervalMs = 1500) + public void Start(int pollIntervalMs = 5000) { if (_running) return; _running = true; diff --git a/TimeMocker.UI/Forms/MainForm.cs b/TimeMocker.UI/Forms/MainForm.cs index 92160d0..500c478 100644 --- a/TimeMocker.UI/Forms/MainForm.cs +++ b/TimeMocker.UI/Forms/MainForm.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.IO; using System.Linq; using System.Text.Json; +using System.Timers; using System.Windows.Forms; using TimeMocker.UI.Core; @@ -78,6 +79,9 @@ namespace TimeMocker.UI.Forms private RichTextBox rtbLog; private Button btnClearLog; + private System.Timers.Timer _previewUpdateTimer; + private TimeSpan _fakeDelta = TimeSpan.Zero; // Stored offset from real time + public MainForm() { _config = AppConfig.Load(); @@ -120,6 +124,11 @@ namespace TimeMocker.UI.Forms _watcher.FakeUtc = GetFakeTime().ToUniversalTime(); _watcher.Start(); AppendLog("Process watcher started."); + + // Start preview update timer (1 second interval) + _previewUpdateTimer = new System.Timers.Timer(1000); + _previewUpdateTimer.Elapsed += (s, e) => BeginInvoke((Action)(UpdateTimePreview)); + _previewUpdateTimer.Start(); } // ===================================================================== @@ -513,11 +522,19 @@ namespace TimeMocker.UI.Forms // ===================================================================== private DateTime GetFakeTime() { - return dtpDate.Value.Date + dtpTime.Value.TimeOfDay; + // Return current real time + stored delta (time advances naturally) + return DateTime.Now + _fakeDelta; } private void ApplyTime() { + // Calculate the desired time from the picker + var desiredTime = dtpDate.Value.Date + dtpTime.Value.TimeOfDay; + + // Store the delta (offset from real time) + _fakeDelta = desiredTime - DateTime.Now; + + // Apply to all injected processes var dt = GetFakeTime().ToUniversalTime(); _injMgr.SetFakeTimeAll(dt); _watcher.FakeUtc = dt; @@ -528,15 +545,39 @@ namespace TimeMocker.UI.Forms private void UpdateTimePreview() { var dt = GetFakeTime(); - // Calculate what the current offset is - var realNow = DateTime.Now; - var delta = dt - realNow; - var deltaStr = delta.TotalSeconds >= 0 - ? $"+{delta.TotalSeconds:F0}s" - : $"{delta.TotalSeconds:F0}s"; + + // Use the stored delta (constant offset) + string deltaStr = FormatDelta(_fakeDelta); lblPreview.Text = $"Fake: {dt:yyyy-MM-dd HH:mm:ss} (local, offset {deltaStr})"; } + private static string FormatDelta(TimeSpan delta) + { + bool isNegative = delta.TotalSeconds < 0; + var absDelta = delta.Duration(); + + var parts = new List(); + + // Days + if (absDelta.Days > 0) + parts.Add($"{absDelta.Days}d"); + + // Hours + if (absDelta.Hours > 0) + parts.Add($"{absDelta.Hours}h"); + + // Minutes + if (absDelta.Minutes > 0) + parts.Add($"{absDelta.Minutes}m"); + + // Seconds (always show if no other units, or if under a minute) + if (parts.Count == 0 || absDelta.Seconds > 0) + parts.Add($"{absDelta.Seconds}s"); + + var result = string.Join("", parts); + return isNegative ? $"-{result}" : $"+{result}"; + } + // ===================================================================== // Helpers // ===================================================================== @@ -660,6 +701,10 @@ namespace TimeMocker.UI.Forms protected override void OnFormClosing(FormClosingEventArgs e) { + // Stop preview update timer + _previewUpdateTimer?.Stop(); + _previewUpdateTimer?.Dispose(); + // Save config _config.Patterns.Clear(); foreach (DataGridViewRow row in dgvPatterns.Rows)