LearnGodot/Utils/FileDirSelector.cs
2025-12-16 20:53:40 +08:00

51 lines
1.1 KiB
C#

using System.Threading.Tasks;
using Godot;
public partial class FileDirSelector : FileDialog
{
private bool _isRequestPending;
public override void _Ready()
{
FileMode = FileModeEnum.OpenDir;
Title = "请选择一个文件夹";
Access = AccessEnum.Filesystem;
}
public async Task<string> SelectFolderAsync()
{
if (_isRequestPending)
{
GD.PrintErr("错误:另一个文件对话框请求正在进行中。本次请求被忽略。");
return null; // 直接返回 null 或抛出异常
}
_isRequestPending = true;
var tcs = new TaskCompletionSource<string>();
void OnDirSelected(string dir)
{
DirSelected -= OnDirSelected;
Canceled -= OnCanceled;
tcs.SetResult(dir);
_isRequestPending = false;
}
void OnCanceled()
{
DirSelected -= OnDirSelected;
Canceled -= OnCanceled;
tcs.SetResult(null);
_isRequestPending = false;
}
DirSelected += OnDirSelected;
Canceled += OnCanceled;
PopupCentered();
return await tcs.Task;
}
}