diff --git a/src/ViewModels/CommandLog.cs b/src/ViewModels/CommandLog.cs index 15f48e70..e73bc1ec 100644 --- a/src/ViewModels/CommandLog.cs +++ b/src/ViewModels/CommandLog.cs @@ -18,6 +18,12 @@ namespace SourceGit.ViewModels get; } = DateTime.Now; + public DateTime EndTime + { + get; + private set; + } = DateTime.Now; + public bool IsComplete { get; @@ -64,6 +70,8 @@ namespace SourceGit.ViewModels _builder.Clear(); _builder = null; + EndTime = DateTime.Now; + OnPropertyChanged(nameof(IsComplete)); if (_onNewLineReceived != null) diff --git a/src/Views/CommandLogTime.cs b/src/Views/CommandLogTime.cs new file mode 100644 index 00000000..2f24d890 --- /dev/null +++ b/src/Views/CommandLogTime.cs @@ -0,0 +1,80 @@ +using System; +using System.Threading; + +using Avalonia; +using Avalonia.Controls; +using Avalonia.Interactivity; +using Avalonia.Threading; + +namespace SourceGit.Views +{ + public class CommandLogTime : TextBlock + { + public static readonly StyledProperty LogProperty = + AvaloniaProperty.Register(nameof(Log), null); + + public ViewModels.CommandLog Log + { + get => GetValue(LogProperty); + set => SetValue(LogProperty, value); + } + + protected override Type StyleKeyOverride => typeof(TextBlock); + + protected override void OnUnloaded(RoutedEventArgs e) + { + base.OnUnloaded(e); + StopTimer(); + } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == LogProperty) + { + StopTimer(); + + if (change.NewValue is ViewModels.CommandLog log) + SetupCommandLog(log); + else + Text = string.Empty; + } + } + + private void SetupCommandLog(ViewModels.CommandLog log) + { + Text = GetDisplayText(log); + if (log.IsComplete) + return; + + _refreshTimer = new Timer(_ => + { + Dispatcher.UIThread.Invoke(() => + { + Text = GetDisplayText(log); + if (log.IsComplete) + StopTimer(); + }); + }, null, 0, 100); + } + + private void StopTimer() + { + if (_refreshTimer is { }) + { + _refreshTimer.Dispose(); + _refreshTimer = null; + } + } + + private string GetDisplayText(ViewModels.CommandLog log) + { + var endTime = log.IsComplete ? log.EndTime : DateTime.Now; + var duration = (endTime - log.StartTime).ToString(@"hh\:mm\:ss\.fff"); + return $"{log.StartTime:T} ({duration})"; + } + + private Timer _refreshTimer = null; + } +} diff --git a/src/Views/ViewLogs.axaml b/src/Views/ViewLogs.axaml index ed66f9a9..1fb44d66 100644 --- a/src/Views/ViewLogs.axaml +++ b/src/Views/ViewLogs.axaml @@ -77,7 +77,7 @@ - + - +