From 70dfd93a5c15b12f6bcab4a701b574174a8dd086 Mon Sep 17 00:00:00 2001 From: Shinichi Mukosaka Date: Wed, 29 Apr 2026 17:40:36 +0900 Subject: [PATCH] Code Quality: Reduce datetime update UI dispatch overhead --- src/Files.App/Data/Items/ListedItem.cs | 73 ++++++++++++++++++--- src/Files.App/ViewModels/ShellViewModel.cs | 19 ++---- src/Files.App/Views/Shells/BaseShellPage.cs | 4 +- 3 files changed, 71 insertions(+), 25 deletions(-) diff --git a/src/Files.App/Data/Items/ListedItem.cs b/src/Files.App/Data/Items/ListedItem.cs index 2a9798970da2..222411bd63ae 100644 --- a/src/Files.App/Data/Items/ListedItem.cs +++ b/src/Files.App/Data/Items/ListedItem.cs @@ -287,11 +287,26 @@ public string FileSize public long FileSizeBytes { get; set; } - public string ItemDateModified { get; private set; } + private string itemDateModified; + public string ItemDateModified + { + get => itemDateModified; + private set => SetProperty(ref itemDateModified, value); + } - public string ItemDateCreated { get; private set; } + private string itemDateCreated; + public string ItemDateCreated + { + get => itemDateCreated; + private set => SetProperty(ref itemDateCreated, value); + } - public string ItemDateAccessed { get; private set; } + private string itemDateAccessed; + public string ItemDateAccessed + { + get => itemDateAccessed; + private set => SetProperty(ref itemDateAccessed, value); + } private DateTimeOffset itemDateModifiedReal; public DateTimeOffset ItemDateModifiedReal @@ -301,7 +316,6 @@ public DateTimeOffset ItemDateModifiedReal { ItemDateModified = dateTimeFormatter.ToShortLabel(value); itemDateModifiedReal = value; - OnPropertyChanged(nameof(ItemDateModified)); } } @@ -313,7 +327,6 @@ public DateTimeOffset ItemDateCreatedReal { ItemDateCreated = dateTimeFormatter.ToShortLabel(value); itemDateCreatedReal = value; - OnPropertyChanged(nameof(ItemDateCreated)); } } @@ -325,7 +338,6 @@ public DateTimeOffset ItemDateAccessedReal { ItemDateAccessed = dateTimeFormatter.ToShortLabel(value); itemDateAccessedReal = value; - OnPropertyChanged(nameof(ItemDateAccessed)); } } @@ -458,6 +470,17 @@ public BaseStorageFile ItemFile public string Key { get; set; } + public virtual bool IsRealChanges => ItemDateAccessed != dateTimeFormatter.ToShortLabel(ItemDateAccessedReal) + || ItemDateCreated != dateTimeFormatter.ToShortLabel(ItemDateCreatedReal) + || ItemDateModified != dateTimeFormatter.ToShortLabel(ItemDateModifiedReal); + + public virtual void UpdateReal() + { + ItemDateAccessed = dateTimeFormatter.ToShortLabel(ItemDateAccessedReal); + ItemDateCreated = dateTimeFormatter.ToShortLabel(ItemDateCreatedReal); + ItemDateModified = dateTimeFormatter.ToShortLabel(ItemDateModifiedReal); + } + /// /// Manually check if a folder path contains child items, /// updating the ContainsFilesOrFolders property from its default value of true @@ -474,7 +497,14 @@ public RecycleBinItem(string folderRelativeId) : base(folderRelativeId) { } - public string ItemDateDeleted { get; private set; } + private string itemDateDeleted; + public string ItemDateDeleted { + get => itemDateDeleted; + private set + { + SetProperty(ref itemDateDeleted, value); + } + } public DateTimeOffset ItemDateDeletedReal { @@ -486,6 +516,17 @@ public DateTimeOffset ItemDateDeletedReal } } + + public override bool IsRealChanges => base.IsRealChanges + || ItemDateDeleted != dateTimeFormatter.ToShortLabel(ItemDateDeletedReal); + + public override void UpdateReal() + { + base.UpdateReal(); + + ItemDateDeleted = dateTimeFormatter.ToShortLabel(ItemDateDeletedReal); + } + private DateTimeOffset itemDateDeletedReal; // For recycle bin elements (path + name) @@ -667,10 +708,26 @@ public DateTimeOffset? GitLastCommitDate set { SetProperty(ref _GitLastCommitDate, value); - GitLastCommitDateHumanized = value is DateTimeOffset dto ? dateTimeFormatter.ToShortLabel(dto) : ""; + GitLastCommitDateHumanized = CreateGitLastCommitDateHumanized(value); } } + + public override bool IsRealChanges => base.IsRealChanges + || GitLastCommitDateHumanized != CreateGitLastCommitDateHumanized(GitLastCommitDate); + + public override void UpdateReal() + { + base.UpdateReal(); + + GitLastCommitDateHumanized = CreateGitLastCommitDateHumanized(GitLastCommitDate); + } + + private string CreateGitLastCommitDateHumanized(DateTimeOffset? dateTimeOffset) + { + return dateTimeOffset is DateTimeOffset dto ? dateTimeFormatter.ToShortLabel(dto) : ""; + } + private string? _GitLastCommitDateHumanized; public string? GitLastCommitDateHumanized { diff --git a/src/Files.App/ViewModels/ShellViewModel.cs b/src/Files.App/ViewModels/ShellViewModel.cs index f016c95f0cf0..47f154926911 100644 --- a/src/Files.App/ViewModels/ShellViewModel.cs +++ b/src/Files.App/ViewModels/ShellViewModel.cs @@ -2831,28 +2831,17 @@ public void CancelSearch() searchCTS?.Cancel(); } - public void UpdateDateDisplay(bool isFormatChange) + public void UpdateDateDisplay() { - App.Logger.LogDebug($"UpdateDateDisplay: isFormatChange={isFormatChange}, itemCount={filesAndFolders?.Count}"); + App.Logger.LogDebug($"UpdateDateDisplay: itemCount={filesAndFolders?.Count}"); filesAndFolders.ToList().AsParallel().ForAll(async item => { - // Reassign values to update date display - if (isFormatChange || IsDateDiff(item.ItemDateAccessedReal)) - await dispatcherQueue.EnqueueOrInvokeAsync(() => item.ItemDateAccessedReal = item.ItemDateAccessedReal); - if (isFormatChange || IsDateDiff(item.ItemDateCreatedReal)) - await dispatcherQueue.EnqueueOrInvokeAsync(() => item.ItemDateCreatedReal = item.ItemDateCreatedReal); - if (isFormatChange || IsDateDiff(item.ItemDateModifiedReal)) - await dispatcherQueue.EnqueueOrInvokeAsync(() => item.ItemDateModifiedReal = item.ItemDateModifiedReal); - if (item is RecycleBinItem recycleBinItem && (isFormatChange || IsDateDiff(recycleBinItem.ItemDateDeletedReal))) - await dispatcherQueue.EnqueueOrInvokeAsync(() => recycleBinItem.ItemDateDeletedReal = recycleBinItem.ItemDateDeletedReal); - if (item is IGitItem gitItem && gitItem.GitLastCommitDate is DateTimeOffset offset && (isFormatChange || IsDateDiff(offset))) - await dispatcherQueue.EnqueueOrInvokeAsync(() => gitItem.GitLastCommitDate = gitItem.GitLastCommitDate); + if (item.IsRealChanges) + await dispatcherQueue.EnqueueOrInvokeAsync(item.UpdateReal); }); } - private static bool IsDateDiff(DateTimeOffset offset) => (DateTimeOffset.Now - offset).TotalDays < 7; - public void Dispose() { CancelLoadAndClearFiles(); diff --git a/src/Files.App/Views/Shells/BaseShellPage.cs b/src/Files.App/Views/Shells/BaseShellPage.cs index 6fc063529d84..ebe261f46d1b 100644 --- a/src/Files.App/Views/Shells/BaseShellPage.cs +++ b/src/Files.App/Views/Shells/BaseShellPage.cs @@ -775,11 +775,11 @@ private void UpdateDateDisplayTimer_Tick(object sender, object e) if (userSettingsService.GeneralSettingsService.DateTimeFormat != _lastDateTimeFormats) { _lastDateTimeFormats = userSettingsService.GeneralSettingsService.DateTimeFormat; - ShellViewModel?.UpdateDateDisplay(true); + ShellViewModel?.UpdateDateDisplay(); } else if (userSettingsService.GeneralSettingsService.DateTimeFormat == DateTimeFormats.Application) { - ShellViewModel?.UpdateDateDisplay(false); + ShellViewModel?.UpdateDateDisplay(); } }