Initial commit: FluidExplorer:从零实现的 WinUI 3 文件资源管理器替代品(Mica、命令栏、面包屑)
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
using FluidExplorer.Services.Icons;
|
||||
using FluidExplorer.Services.Operations;
|
||||
using Microsoft.UI.Xaml.Media;
|
||||
|
||||
namespace FluidExplorer.Services;
|
||||
|
||||
/// <summary>
|
||||
/// 降级占位实现:当真实现(外壳图标服务 / 文件操作引擎)在构造阶段抛异常时兜底,
|
||||
/// 保证主界面还能打开浏览(图标为空、操作给出明确失败提示),而不是整个程序起不来。
|
||||
/// </summary>
|
||||
internal sealed class PlaceholderIconService : IIconService
|
||||
{
|
||||
public Task<ImageSource?> GetIconAsync(string path, bool isDirectory, int size, CancellationToken cancellationToken)
|
||||
=> Task.FromResult<ImageSource?>(null);
|
||||
|
||||
public Task<ImageSource?> GetThumbnailAsync(string path, int size, CancellationToken cancellationToken)
|
||||
=> Task.FromResult<ImageSource?>(null);
|
||||
|
||||
public Task<ImageSource?> GetExtensionIconAsync(string extension, int size, CancellationToken cancellationToken)
|
||||
=> Task.FromResult<ImageSource?>(null);
|
||||
|
||||
public ImageSource? GetSpecialFolderIcon(string parsingName, int size) => null;
|
||||
|
||||
public void ClearCache() { }
|
||||
}
|
||||
|
||||
internal sealed class PlaceholderOperationService : IFileOperationService
|
||||
{
|
||||
private readonly List<FileOperationJob> _jobs = [];
|
||||
|
||||
public IReadOnlyList<FileOperationJob> Jobs => _jobs;
|
||||
public event EventHandler? JobsChanged;
|
||||
|
||||
// 占位实现永远不会产生撤销记录,事件显式忽略订阅以避免空事件告警
|
||||
public event EventHandler? UndoStackChanged
|
||||
{
|
||||
add { }
|
||||
remove { }
|
||||
}
|
||||
|
||||
public Func<ConflictInfo, Task<ConflictResolution>>? ConflictResolver { get; set; }
|
||||
public bool CanUndo => false;
|
||||
public string? UndoDescription => null;
|
||||
|
||||
private FileOperationJob Fail(FileOperationKind kind, IReadOnlyList<string> sources, string destination)
|
||||
{
|
||||
var job = new FileOperationJob
|
||||
{
|
||||
Kind = kind,
|
||||
Title = "文件操作服务不可用",
|
||||
Sources = sources,
|
||||
Destination = destination,
|
||||
State = JobState.Failed,
|
||||
Error = "文件操作引擎尚未接入。"
|
||||
};
|
||||
_jobs.Add(job);
|
||||
JobsChanged?.Invoke(this, EventArgs.Empty);
|
||||
return job;
|
||||
}
|
||||
|
||||
public FileOperationJob EnqueueCopy(IReadOnlyList<string> sources, string destination, ConflictPolicy policy = ConflictPolicy.Ask)
|
||||
=> Fail(FileOperationKind.Copy, sources, destination);
|
||||
|
||||
public FileOperationJob EnqueueMove(IReadOnlyList<string> sources, string destination, ConflictPolicy policy = ConflictPolicy.Ask)
|
||||
=> Fail(FileOperationKind.Move, sources, destination);
|
||||
|
||||
public FileOperationJob EnqueueDelete(IReadOnlyList<string> paths, bool permanent = false)
|
||||
=> Fail(FileOperationKind.Delete, paths, string.Empty);
|
||||
|
||||
public FileOperationJob EnqueueRename(string path, string newName) => Fail(FileOperationKind.Rename, [path], newName);
|
||||
|
||||
public FileOperationJob EnqueueNewFolder(string parentDirectory, string name) => Fail(FileOperationKind.NewFolder, [parentDirectory], name);
|
||||
|
||||
public void Pause(Guid jobId) { }
|
||||
public void Resume(Guid jobId) { }
|
||||
public void Cancel(Guid jobId) { }
|
||||
public void ClearFinished() { }
|
||||
public Task<OperationResult> UndoAsync(CancellationToken cancellationToken = default)
|
||||
=> Task.FromResult(new OperationResult(false, 0, 0, 0, "没有可撤销的操作。"));
|
||||
|
||||
public Task<(long Bytes, int Items)> MeasureAsync(IReadOnlyList<string> paths, CancellationToken cancellationToken)
|
||||
=> Task.FromResult((0L, 0));
|
||||
}
|
||||
Reference in New Issue
Block a user