diff --git a/BetterGenshinImpact/Model/KeyMouseScriptItem.cs b/BetterGenshinImpact/Model/KeyMouseScriptItem.cs index 6567c24b..13319abc 100644 --- a/BetterGenshinImpact/Model/KeyMouseScriptItem.cs +++ b/BetterGenshinImpact/Model/KeyMouseScriptItem.cs @@ -35,6 +35,9 @@ public partial class KeyMouseScriptItem : ObservableObject private readonly string _scriptPath = Global.Absolute(@"User\KeyMouseScript"); private readonly ILogger _logger = TaskControl.Logger; + [ObservableProperty] + private bool _isUploadSuccess; + [RelayCommand] private async Task Upload() { @@ -42,10 +45,11 @@ public partial class KeyMouseScriptItem : ObservableObject { _uploadCts = new CancellationTokenSource(); IsUploading = true; + IsUploadSuccess = false; UploadProgress = 0; var dirName = new DirectoryInfo(Path).Name; - _logger.LogInformation($"{dirName} 开始上传..."); + _logger.LogDebug($"{dirName} 开始上传..."); var userName = TaskContext.Instance().Config.CommonConfig.UserName; var uid = TaskContext.Instance().Config.CommonConfig.Uid; @@ -57,6 +61,14 @@ public partial class KeyMouseScriptItem : ObservableObject var tosClient = new TosClientHelper(); var files = Directory.GetFiles(Path, "*.*", SearchOption.AllDirectories); + // 计算所有文件的总大小 + long totalSize = 0; + long uploadedSize = 0; + foreach (var file in files) + { + totalSize += new FileInfo(file).Length; + } + foreach (var file in files) { if (_uploadCts.Token.IsCancellationRequested) @@ -66,43 +78,57 @@ public partial class KeyMouseScriptItem : ObservableObject var needUploadFileName = System.IO.Path.GetFileName(file); var remotePath = $"{dirName[..10]}_{userName}_{uid}/{relativePath}"; remotePath = remotePath.Replace(@"\", "/"); + var fileSize = new FileInfo(file).Length; if (needUploadFileName == "video.mkv" || needUploadFileName == "video.mp4") { tosClient.UploadLargeFile(file, remotePath, 20 * 1024 * 1024, (bytes, totalBytes, percentage) => { - UploadProgress = percentage; - _logger.LogInformation($"上传进度: {percentage:F}%"); + var currentFileProgress = bytes; + var overallProgress = ((double)(uploadedSize + currentFileProgress) / totalSize) * 100; + UploadProgress = Math.Min(overallProgress, 99.9); // 保留最后0.1%给上传完成时 + _logger.LogDebug($"上传进度: {overallProgress:F}%"); }); } else { tosClient.UploadFile(file, remotePath); } + + uploadedSize += fileSize; + var progress = ((double)uploadedSize / totalSize) * 100; + UploadProgress = Math.Min(progress, 99.9); } UploadProgress = 100; - _logger.LogInformation($"{dirName} 上传完成"); + IsUploadSuccess = true; + _logger.LogDebug($"{dirName} 上传完成"); } catch (Exception ex) { _logger.LogError($"上传过程中发生错误:{ex.Message}"); + IsUploadSuccess = false; throw; } }, _uploadCts.Token); } catch (OperationCanceledException) { - _logger.LogInformation("上传已取消"); + _logger.LogDebug("上传已取消"); + IsUploadSuccess = false; } catch (Exception ex) { _logger.LogError(ex, "上传出错"); + IsUploadSuccess = false; } finally { IsUploading = false; - UploadProgress = 0; + if (!IsUploadSuccess) + { + UploadProgress = 0; + } _uploadCts?.Dispose(); _uploadCts = null; } diff --git a/BetterGenshinImpact/View/Pages/KeyMouseRecordPage.xaml b/BetterGenshinImpact/View/Pages/KeyMouseRecordPage.xaml index ac298f75..2aab6514 100644 --- a/BetterGenshinImpact/View/Pages/KeyMouseRecordPage.xaml +++ b/BetterGenshinImpact/View/Pages/KeyMouseRecordPage.xaml @@ -108,24 +108,33 @@ - - - - - - - - - + + + + + + + + + diff --git a/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs index 14632905..3607a35c 100644 --- a/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs @@ -60,19 +60,41 @@ public partial class KeyMouseRecordPageViewModel : ObservableObject, INavigation private void InitScriptListViewData() { - _scriptItems.Clear(); var directoryInfos = LoadScriptDirectories(scriptPath) .OrderByDescending(d => d.CreationTime) .ToList(); + + // 创建一个新的列表来存储更新后的项目 + var updatedItems = new List(); + foreach (var d in directoryInfos) { - _scriptItems.Add(new KeyMouseScriptItem + // 尝试在现有集合中查找相同路径的项目 + var existingItem = _scriptItems.FirstOrDefault(item => item.Path == d.FullName); + + if (existingItem != null) { - Name = d.Name, - Path = d.FullName, - CreateTime = d.CreationTime, - CreateTimeStr = d.CreationTime.ToString("yyyy-MM-dd HH:mm:ss") - }); + // 如果找到现有项目,保留其状态 + updatedItems.Add(existingItem); + } + else + { + // 如果是新项目,创建新的实例 + updatedItems.Add(new KeyMouseScriptItem + { + Name = d.Name, + Path = d.FullName, + CreateTime = d.CreationTime, + CreateTimeStr = d.CreationTime.ToString("yyyy-MM-dd HH:mm:ss") + }); + } + } + + // 清空并重新添加项目 + _scriptItems.Clear(); + foreach (var item in updatedItems) + { + _scriptItems.Add(item); } }