|
2 | 2 | using System.Collections.Generic; |
3 | 3 | using System.IO; |
4 | 4 | using System.Threading.Tasks; |
| 5 | +using Avalonia.Threading; |
5 | 6 | using CommunityToolkit.Mvvm.ComponentModel; |
6 | 7 |
|
7 | 8 | namespace SourceGit.ViewModels |
@@ -160,6 +161,30 @@ public List<Models.Change> VisibleStaged |
160 | 161 | private set => SetProperty(ref _visibleStaged, value); |
161 | 162 | } |
162 | 163 |
|
| 164 | + public int UnstagedAddedLines |
| 165 | + { |
| 166 | + get => _unstagedAddedLines; |
| 167 | + private set => SetProperty(ref _unstagedAddedLines, value); |
| 168 | + } |
| 169 | + |
| 170 | + public int UnstagedDeletedLines |
| 171 | + { |
| 172 | + get => _unstagedDeletedLines; |
| 173 | + private set => SetProperty(ref _unstagedDeletedLines, value); |
| 174 | + } |
| 175 | + |
| 176 | + public int StagedAddedLines |
| 177 | + { |
| 178 | + get => _stagedAddedLines; |
| 179 | + private set => SetProperty(ref _stagedAddedLines, value); |
| 180 | + } |
| 181 | + |
| 182 | + public int StagedDeletedLines |
| 183 | + { |
| 184 | + get => _stagedDeletedLines; |
| 185 | + private set => SetProperty(ref _stagedDeletedLines, value); |
| 186 | + } |
| 187 | + |
163 | 188 | public List<Models.Change> SelectedUnstaged |
164 | 189 | { |
165 | 190 | get => _selectedUnstaged; |
@@ -312,6 +337,29 @@ public void SetData(List<Models.Change> changes) |
312 | 337 |
|
313 | 338 | UpdateInProgressState(); |
314 | 339 | UpdateDetail(); |
| 340 | + |
| 341 | + _ = Task.Run(async () => |
| 342 | + { |
| 343 | + var pref = Preferences.Instance; |
| 344 | + var unstagedStats = await new Commands.QueryDiffLineStats( |
| 345 | + _repo.FullPath, false, pref.IgnoreWhitespaceChangesInDiff, pref.IgnoreCRAtEOLInDiff) |
| 346 | + .GetResultAsync().ConfigureAwait(false); |
| 347 | + var stagedStats = await new Commands.QueryDiffLineStats( |
| 348 | + _repo.FullPath, true, pref.IgnoreWhitespaceChangesInDiff, pref.IgnoreCRAtEOLInDiff) |
| 349 | + .GetResultAsync().ConfigureAwait(false); |
| 350 | + |
| 351 | + Dispatcher.UIThread.Post(() => |
| 352 | + { |
| 353 | + // A newer SetData may have run while fetching stats; drop this stale update. |
| 354 | + if (!ReferenceEquals(_cached, changes)) |
| 355 | + return; |
| 356 | + |
| 357 | + UnstagedAddedLines = unstagedStats.added; |
| 358 | + UnstagedDeletedLines = unstagedStats.deleted; |
| 359 | + StagedAddedLines = stagedStats.added; |
| 360 | + StagedDeletedLines = stagedStats.deleted; |
| 361 | + }); |
| 362 | + }); |
315 | 363 | } |
316 | 364 |
|
317 | 365 | public async Task StageChangesAsync(List<Models.Change> changes, Models.Change next) |
@@ -821,6 +869,10 @@ private bool IsChanged(List<Models.Change> old, List<Models.Change> cur) |
821 | 869 | private List<Models.Change> _visibleStaged = []; |
822 | 870 | private List<Models.Change> _selectedUnstaged = []; |
823 | 871 | private List<Models.Change> _selectedStaged = []; |
| 872 | + private int _unstagedAddedLines = 0; |
| 873 | + private int _unstagedDeletedLines = 0; |
| 874 | + private int _stagedAddedLines = 0; |
| 875 | + private int _stagedDeletedLines = 0; |
824 | 876 | private object _detailContext = null; |
825 | 877 | private string _filter = string.Empty; |
826 | 878 | private string _commitMessage = string.Empty; |
|
0 commit comments