51 lines
1.1 KiB
C#
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;
|
|
}
|
|
}
|